今天在UGUI上显示粒子特效的时候遇到的一些问题,Mark一下。原理:修改特效中每一个ParticleSystem的Layer为UI,并且把ParticleSystemRenderer.sortingOrder值设置为大于Canvas中的sortingOrder值。其实就是控制两个组件
的Render Order。
1. 在UI控件上(eg: Image)显示一个粒子特效
1).首先创建一个Canvas,RenderMode = Screen Space-Camera ,然后创建一个UICamera ,参数设置为:Clear Flags: Depth Only; Culling Mask : UI;
然后把这个UICamera设置为Canvas的RenderCamera。如下图:
2). 添加一个粒子特效预设Boom到Image1下面,我们需要在Image1上显示粒子效果。然后我们需要对这个Boom特效的中的粒子系统设置对应的sortingOrder为1
添加一个脚本UIEffectPlayer.cs到这个go上,它会递归遍历这个预设上的所有子对象,分别设置它们的sortingOrder和所属Layer。代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class UIEffectPlayer : MonoBehaviour { // Use this for initialization void Awake() { if (gameObject.GetComponent<RectTransform>() == null) { RectTransform rt = gameObject.AddComponent<RectTransform>(); rt.anchorMin = Vector3.zero; rt.anchorMax = Vector3.zero; rt.anchoredPosition = new Vector2(130, 160); } //设置所有的粒子特效的Layer为UI,把粒子系统的Render的sortingOrder设置为大于Canvas的OrderInLayer //Canvas的Order In Layer默认为0,所以这里默认设置为1 SetLayerAndSortOrder(gameObject.transform,5,1); } void SetLayerAndSortOrder(Transform parent,int layer,int sortOrder) { parent.gameObject.layer = layer; ParticleSystem ps = parent.GetComponent<ParticleSystem>(); if (ps != null) { ParticleSystemRenderer psRender = gameObject.GetComponent<ParticleSystemRenderer>(); if(psRender != null) { psRender.sortingOrder = sortOrder; } } foreach(Transform child in parent) { SetLayerAndSortOrder(child, layer,sortOrder); } } void Start () { } // Update is called once per frame void Update () { } }
3).运行游戏即可看见特效显示在Image1上面。
2. 如果需要在两个UI层之间显示特效怎么办?(特效Boom显示在图片Image1和Image2之间)
很容易想到的办法是新创建一个Canvas,(这个Canvas类似NGUI中的UIPanel)将其sortingOrder的值设置为大于粒子系统的sortingOrder的值,然后将Image2放到Canvas2下面进行绘制。
效果如下:
可以看到Boom特效显示在Image1和Image2之间了,Image2显示为半透明。好像还有别的办法不用新建一个Canvas,
后续试试再写进去。欢迎留言指教。
参考:https://docs.unity3d.com/ScriptReference/Renderer-sortingOrder.html
https://docs.unity3d.com/ScriptReference/Canvas.html
https://docs.unity3d.com/ScriptReference/ParticleSystem.html
https://answers.unity.com/questions/306777/how-to-access-particlesystemrenderer.html
----码字不易,欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/beeasy/