UI特效插件-UIParticle

前言 在UI上显示特效是一直是一个比较棘手的问题,一开始的方案是调整UI特效的渲染顺序,设置其sortingLayer和sortingOrder+offset,在每个单独的UI以后渲染。 这种方法能满足大部分的需求,但也有缺点。 如果需要在特效上再盖一层UI的话,由于特效并不属于Canvas的一部分,所以修改Hierarchy并不能改变其渲染顺序,特效会在渲染完Canvas的UI元素以后再进行渲染,所以需要把这个UI的层级通过添加Canvas继续往上抬。 再者无法被RectMask2D和Mask裁剪,除非改造Shader,并手动传入裁剪区域。 最好的方法就是让特效像UI一样,直接按Hierarchy 顺序渲染,并支持遮罩,就是这文章的主角UIParticle。 原理 This package utilizes the new APIsMeshBake/MashTrailBake(introduced with Unity 2018.2) to render particles through CanvasRenderer. You can render, mask, and sort your ParticleSystems for UI without the necessity of an additional Camera, RenderTexture, or Canvas. 这是项目首页的原理,具体就是通过一个API让例子特效通过CanvasRender进行渲染,这样就和普通的UI没什么不同了。 使用 按官方的教程,直接引入包,添加组件到特效上,直接拖到UI中即可。 改造已有shader以支持遮罩 项目推荐我们使用UIShader,如UIDefault或者UIAdditive。 Mask通过模板测试实现遮罩,RectMask2D通过传入裁剪区域实现。 所以自定义的Shader只需要参考上面的UIShader使其拥有遮罩特效即可,注意RenderQueue设置为Transparent,下面贴一下关键Shader代码。 Shader "Your/Custom/Shader" { Properties { // ... // #### required for Mask #### _StencilComp ("Stencil Comparison", Float) = 8 _Stencil ("Stencil ID", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0 _StencilWriteMask ("Stencil Write Mask", Float) = 255 _StencilReadMask ("Stencil Read Mask", Float) = 255 _ColorMask ("Color Mask", Float) = 15 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 } SubShader { Tags { // ... } // #### required for Mask #### Stencil { Ref [_Stencil] Comp [_StencilComp] Pass [_StencilOp] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] } ColorMask [_ColorMask] // ... Pass { // ... // #### required for RectMask2D #### #include "UnityUI.cginc" #pragma multi_compile __ UNITY_UI_CLIP_RECT float4 _ClipRect; // #### required for Mask #### #pragma multi_compile __ UNITY_UI_ALPHACLIP struct appdata_t { // ... }; struct v2f { // ... // #### required for RectMask2D #### float4 worldPosition : TEXCOORD1; }; v2f vert(appdata_t v) { v2f OUT; // ... // #### required for RectMask2D #### OUT.worldPosition = v.vertex; return OUT; } fixed4 frag(v2f IN) : SV_Target { // ... // #### required for RectMask2D #### #ifdef UNITY_UI_CLIP_RECT color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); #endif // #### required for Mask #### #ifdef UNITY_UI_ALPHACLIP clip (color.a - 0.001); #endif return color; } ENDCG } } } 总结 至此已经可以像UI一样使用UI特效了,具体的性能分析,参考一下首页。 ...

2024-6-6 · Dand

使用状态机初始化游戏

前言 最近在写游戏demo的时候,在写初始化流程的时候遇到一些问题,一开始通过回调函数来控制初始化流程,并不直观,也不好分离逻辑。进入游戏以后首先是准备好必要的资源,通过YooAssets进行加载,加载完成以后再进行游戏系统的初始化。一开始是在资源加载接口加了回调,加载完以后再进行游戏初始化,但不够优雅,如果需要更多的流程控制会写得比较乱。 最后用状态机实现游戏初始化的流程,首先就是要写一个有限状态机了,参考了一下开源的项目,这里总结一下。 状态机 管理状态:启动,状态转换,管理状态的生命周期 数据处理能力:增删查数据,状态中可以使用这些全局数据 状态 状态定义具体的逻辑,有OnInit,OnEnter,OnUpdate,OnLeave,OnDestroy生命周期。状态内调用状态机进行状态的切换。 UML类图 参考 GitHub - EllanJiang/GameFramework: This is literally a game framework, based on Unity game engine. It encapsulates commonly used game modules during development, and, to a large degree, standardises the process, enhances the development speed and ensures the product quality. UniFramework/UniFramework at main · gmhevinci/UniFramework

2024-6-2 · Dand

YooAsset学习笔记1:接入流程

2024-5-21 · Dand

利用ActionManger拓展psd2gui

2024-3-16 · Dand

Unity开发性能优化总结

2023-7-8 · Dand