UGUI中显示粒子特效

  今天在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/

 

 

  

posted @ 2018-03-30 20:01  VZXM  阅读(3463)  评论(2编辑  收藏  举报