2020
12-28
12-28
Unity3D研究院之UI完整透下事件(一百二十二)
以前写过一篇类似的文章用于解决新手引导的问题, Unity3D研究院之将UI的点击事件渗透下去(九十) 最近策划又提出一个需求,Tips窗口打开以后点击空白区域关掉,但是如果空白区域下有按钮滑动输入一类的要关掉Tips的同时要响应相面的事件,所以透下的事件就要比较完整了。开始我觉得这个需求很不合理,.... Read More >
专注移动互联网,专注Unity3D游戏开发
以前写过一篇类似的文章用于解决新手引导的问题, Unity3D研究院之将UI的点击事件渗透下去(九十) 最近策划又提出一个需求,Tips窗口打开以后点击空白区域关掉,但是如果空白区域下有按钮滑动输入一类的要关掉Tips的同时要响应相面的事件,所以透下的事件就要比较完整了。开始我觉得这个需求很不合理,.... Read More >
技美在调shader的时候可能不太擅长C#编辑面板的代码,所以有了这篇文章。我封装了一个通用的着色器GUI面板,这样就可以不需要写C#代码了,实现的过程中试图解决了这几个问题。 1.视图解决分组面板展开与缩进 2.if标签与原生标签的混合 我看了下编辑器下C#的代码自定义MaterialProper.... Read More >
美术希望在3D UI中显示自定义的网格,比如显示一个带弧形的UI。纯3D确实是可以做的,但是涉及到UI事件或者裁切就无法统一。 由于默认的UI是矩形,UI的显示与相应区域就是RectTransform的size,如果我们使用自定义Mesh的UI那么显示区域就要单独调整,比如单独设置显示的旋转、缩放、.... Read More >
URP以后并不是所有Pass都会执行,因为它预制了两个Pass所以,优先执行"UniversalForward"在执行"SrpDefaultUnlit"的Pass 以上代码就可以在URP中实现PrePass的功能,如果场景中只绘制一个物体那么这样做没啥问题,可是如果场景绘制多个相同材质或不同参数的物.... Read More >
灵感来自Android的BatteryManager,可以实时获取到手机的电流。因为电压是恒定的,这样就能算出功率来,十分有助于统计手机发热问题。 BatteryManager并没有提供获取手机毫安的方法, 只提供了手机剩余毫安的方法,以及手机当前电量百分比。 这样虽然可以近似还原手机总毫安,但是还.... Read More >
最近一直在思考如何能更好的做优化渲染,本篇文章只是另一种实现的思路,其实我也没完全想好怎么应用到实际游戏中来统计,希望各位看官多多提宝贵意见。 1.本例Unity的版本是Unity2019.3.1.4 2.采用URP渲染管线,老的渲染管线没有试过,大家可以试试看。 3.FrameDebugger会将.... Read More >
最近在使用C#7的语法时遇到一个挺有意思的问题,深究其原理后发现值得写一篇文章。在C#中任何一个class类即使不写class XXX :System.Object 也会被默认继承System.Object,在C#中还有一个object关键字它和System.Object是一回事。所以UnityEn.... Read More >
GPU发热的元凶之一“带宽” 所以通常我们都会打开mipmap,如下图所示,在unity中可以拖动右上角的条来查看贴图每个等级的mipmap贴图。那么它的等级一共分成0级-9级, 0级表示最清楚,9级表示最模糊。 贴图分辨率是依次减半,如512 256 128 64 32 16 8 4 2 0 所以.... Read More >
之前项目降低分辨率我们都普遍使用Screen.SetResolution,但是它有两个问题。 1.每次设置的时候屏幕会闪烁。 2.降低分辨率与摄像机无关,无法做到只降低3D摄像机的分辨率,保留UI摄像机不降低分辨率。 其实我们可以使用摄像机动态分辨率,如下图所示,给需要降低分辨率的摄像机打开allo.... Read More >
首先我们先借助Unity的SpriteAtlas构建一个图集,同一个图集只会占用一个DrawCall。 接着写一个脚本,把需要参与ECS渲染的Sprite拖上去。 渲染的原理就是 m_BatchRendererGroup.AddBatch ECS负责坐标的修改 1.参与渲染的sprite数量发生变化.... Read More >
如果项目中使用GPU Instancing的话,很多人都会用底层API Graphics.DrawMeshInstanced在Update中绘制。 我们先来做个极端的测试,如下代码所示。 如下图所示,能看出来在Update每帧都有一个比较高的耗时。 如果每帧的调用Graphics.DrawMeshI.... Read More >
最近在研究如何把overdraw统计成准确的数据值,让美术同学能直观的知道自己做的特效、场景、角色到底有多费,再加上好久没有写文章了,自己也有点心得今天就分享给大家并且希望可以后面一起讨论。 首先Unity的overdraw是不准确的,如下图所示,我们放两个不透明的物体,在SceneView切到ov.... Read More >
前段时间用Stencil实现了一套裁切,但是Stencil原理只能是裁或者不裁,这样是无法实现像NGUI这样的软裁切功能。之前的笔记在这里 https://www.xuanyusong.com/archives/4562 如下图所示,我们用Rect2DMask组件同时软裁切3D模型和Image。 裁切最容易出.... Read More >
Unity2017是明确不支持GPU Instancing的,如果在材质上勾选了enable GPU Instancing后,如下图所示,在Frame Debugger中,我们能清楚的看到所有的游戏对象没有合批,提示Objects are lightmapped。 所以为了让Unity2017支持G.... Read More >
烘焙Lightmap以后unity会自动给参与烘焙的所有mesh添加uv2的属性,例如,三角形每个顶点都会有UV2它记录着这个每个顶点对应Lightmap图中的UV值,这样拥有3个顶点的三角形面就可以通过UV2在Lightmap中线性采样烘焙颜色了。 LightmapIndex: 所以每个MeshR.... Read More >
AssetBundle.LoadFromMemory基本上是无法在手机上用的,因为要多占一份内存,所以大多Unity项目都不进行资源加密。 Unity2017.2提供了一个新的API AssetBundle.LoadFromStream,通过名字就可以知道它是流加载,那么就不会像AssetBundl.... Read More >
最近在优化项目,发现字符串拼接的堆内存非常大,而且非常频繁。 大概原因如下 1.字符串就是char[] 长短发生变化必然要重新分配长度,以及拷贝之前的部分,产生GC 2.字符串+=进行拼接会产生装箱,生成GC 3.Append传入值类型数据,它会调用ToString方法,需要new string 然.... Read More >
最近被浮点数坑了,所以一定要写篇文章记录下。先看看如下代码 通过上面代码,我们可以发现float和uint(为了取最大值,这里就用无符号整形)都是4字节,那么为什么float的取值范围要比int大呢?继续再看一段代码 如果有人不知道 取值范围 -3.402823E+38-3.402823E+38 其.... Read More >
手机上可以把一段时间的profiler日志保存在本地,接着在手机里把文件取出来就可以在电脑上查看了,很方便,上代码,在需要保存手机Profiler日志的时候调用 ProfilerUtils.BeginRecord();并且我已经封装好了。 最后在Profier窗口中点击load载入即可.... Read More >
我以前写过一篇 Unity3D研究院专治IOS查看日志各种不服(九十五) 但是今天无意间发现了一个工具iOSLogInfo,这个工具比之前的做法更好更方便。 下载地址:https://www.blackberry.com/blackberrytraining/web/KB_Resources/KB3.... Read More >