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/

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM