UGUI中显示粒子特效

  今天在UGUI上显示粒子特效的时候遇到的一些问题,Mark一下。原理:修改特效中每个ParticleSystem的Layer为UI,而且把ParticleSystemRenderer.sortingOrder值设置为大于Canvas中的sortingOrder值。其实就是控制两个组件html

的Render Order。this

1. 在UI控件上(eg: Image)显示一个粒子特效

  1).首先建立一个Canvas,RenderMode = Screen Space-Camera ,而后建立一个UICamera ,参数设置为:Clear Flags: Depth Only; Culling Mask : UI;spa

而后把这个UICamera设置为Canvas的RenderCamera。以下图:3d

  2). 添加一个粒子特效预设Boom到Image1下面,咱们须要在Image1上显示粒子效果。而后咱们须要对这个Boom特效的中的粒子系统设置对应的sortingOrder为1code

  添加一个脚本UIEffectPlayer.cs到这个go上,它会递归遍历这个预设上的全部子对象,分别设置它们的sortingOrder和所属Layer。代码以下:orm

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上面。htm

2. 若是须要在两个UI层之间显示特效怎么办?(特效Boom显示在图片Image1和Image2之间)

  很容易想到的办法是新建立一个Canvas,(这个Canvas相似NGUI中的UIPanel)将其sortingOrder的值设置为大于粒子系统的sortingOrder的值,而后将Image2放到Canvas2下面进行绘制。对象

效果以下:blog

能够看到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/