zoukankan      html  css  js  c++  java
  • 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/

      

  • 相关阅读:
    让vs2013自带的IISExpress支持apk文件下载
    使用h5开发跨平台APP确保数据安全交互---服务器篇
    如何使用iis发布多个ftp,为何ftp 503错误?
    HttpApplication执行顺序
    EXCEL2010分成多个窗口的,解决单个窗口显示多个文档的弊病
    搜索引擎优化(SEO)解决方案
    .net网站快速停机设置app_offline
    SQL SERVER 连接 SQL SERVER 连接服务器
    SQL SERVER 备份还原 局域网 远程
    postgres 临时表
  • 原文地址:https://www.cnblogs.com/beeasy/p/8678195.html
Copyright © 2011-2022 走看看