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/

相關文章
相關標籤/搜索