202010-28 Unity3D研究院之给UI添加Mesh形状(一百二十) 美术希望在3D UI中显示自定义的网格,比如显示一个带弧形的UI。纯3D确实是可以做的,但是涉及到UI事件或者裁切就无法统一。 由于默认的UI是矩形,UI的显示与相应区域就是RectTransform的size,如果我们使用自定义Mesh的UI那么显示区域就要单独调整,比如单独设置显示的旋转、.... Read More >
202010-18 Unity3D研究院之URP下PrePassZ(一百一十九) URP以后并不是所有Pass都会执行,因为它预制了两个Pass所以,优先执行"UniversalForward"在执行"SrpDefaultUnlit"的Pass [crayon-673f05e1644e5571300812/] 以上代码就可以在URP中实现PrePass的功能,如果场景中只绘制.... Read More >
202009-28 Unity3D研究院之实时获取手机电流、电压、计算功率发热(一百一十八) 灵感来自Android的BatteryManager,可以实时获取到手机的电流。因为电压是恒定的,这样就能算出功率来,十分有助于统计手机发热问题。 BatteryManager并没有提供获取手机毫安的方法, 只提供了手机剩余毫安的方法,以及手机当前电量百分比。 这样虽然可以近似还原手机总毫安,.... Read More >
202007-18 Unity3D研究院之获取FrameDebugger每帧颜色数据(一百一十七) 最近一直在思考如何能更好的做优化渲染,本篇文章只是另一种实现的思路,其实我也没完全想好怎么应用到实际游戏中来统计,希望各位看官多多提宝贵意见。 1.本例Unity的版本是Unity2019.3.1.4 2.采用URP渲染管线,老的渲染管线没有试过,大家可以试试看。 3.FrameD.... Read More >
202007-14 C#事件管理器清空所有监听 C#事件使用+= -=使用起来是很方便的,但是却不能整体清空所有事件。比如一个常见的操作,打开界面注册监听事件,关闭界面需要把所有的事件清空了,这要在写一堆-=操作,如果漏清空的话肯定会造成隐患,如果在lua里这个很容易,但是C#却不行。所以我想了个办法,对Action和Func进行一次包装,就可以解决这个问题了。 这里我只封装了两个参数,大家可以继续拓展新的参数,我在项目里一共拓展了5个参.... Read More >
202006-07 Unity3D研究院之静态合并贴图(一百一十六) 最近研究了一下Texture2D.PackTextures方法。它可以在运行时或者编辑时对贴图进行合并。运行时它不支持任意贴图格式的合并,比如现在主流的ASTC,它会合并成RGBA32格式。而且无法指定贴图合并到大图具体某个位置上。 动态合并贴图的方法可以参考我之前的文章,这篇主要考虑静态合并.... Read More >
202005-23 Unity3D研究院之方便找和写URP的shader 项目升级URP了一段时间了,Shader找起来太麻烦各种嵌套。以前的shader基本都在一个文件里搞定,普通的记事本都能写。 第一步安装VSCode以及Shader Languages support for vs Code 插件。 如果是内网办公的同学,可以先把插件下载下来,然后点击下.... Read More >
202004-17 Unity3D研究院之UnityEngine.Object和System.Object(一百一十五) 最近在使用C#7的语法时遇到一个挺有意思的问题,深究其原理后发现值得写一篇文章。在C#中任何一个class类即使不写class XXX :System.Object 也会被默认继承System.Object,在C#中还有一个object关键字它和System.Object是一回事。所以UnityEn.... Read More >
202001-18 Unity3D研究院之给每个贴图指定不同mipmap减低纹理带宽(一百一十四) GPU发热的元凶之一“带宽” 所以通常我们都会打开mipmap,如下图所示,在unity中可以拖动右上角的条来查看贴图每个等级的mipmap贴图。那么它的等级一共分成0级-9级, 0级表示最清楚,9级表示最模糊。 贴图分辨率是依次减半,如512 256 128 64 32 16 8 4 2 0 .... Read More >
202001-04 Unity3D研究院之动态分辨率降低渲染开销(一百一十三) 之前项目降低分辨率我们都普遍使用Screen.SetResolution,但是它有两个问题。 1.每次设置的时候屏幕会闪烁。 2.降低分辨率与摄像机无关,无法做到只降低3D摄像机的分辨率,保留UI摄像机不降低分辨率。 其实我们可以使用摄像机动态分辨率,如下图所示,给需要降低分辨率的.... Read More >
201912-28 Unity3D研究院之ECS渲染Sprite(一百一十二) 首先我们先借助Unity的SpriteAtlas构建一个图集,同一个图集只会占用一个DrawCall。 接着写一个脚本,把需要参与ECS渲染的Sprite拖上去。 渲染的原理就是 m_BatchRendererGroup.AddBatch ECS负责坐标的修改 .... Read More >
201912-01 Unity3D研究院之优化Graphics.DrawMeshInstanced(一百一十一) 如果项目中使用GPU Instancing的话,很多人都会用底层API Graphics.DrawMeshInstanced在Update中绘制。 我们先来做个极端的测试,如下代码所示。 [crayon-673f05e16a23f533744971/] 如下图所示,能看出来在Update每.... Read More >
201911-24 Unity3D研究院之LWRP中计算准确overdraw(一百一十) 书接上文,在LWRP上Camera.SetReplacementShader是用不了的,而且就算能用算出来的不透明物体overdraw也是不对的。如果你的项目已经使用了LWRP,那么我们可以借助Custom Renderer Data来拓展渲染overdraw。如下图所示,需要自己创建一个自定义Re.... Read More >