当前位置: 首页 > news >正文

控制特效在UI上面

控制特效在UI上,需要改动两个地方:
1、渲染队列为透明
2、保证sorting layer正确
如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine.CFEventSystems;
namespace UnityEngine.CFUI
{
    public class CFParticleControl : UIBehaviour
    {
        [SerializeField]
        public int renderQueueOffset = 0;
        public int renderQueue = 3000;
        public Renderer[] renderers;
        public Canvas mCanvas;
        public CFRectMask2D mCurrentMask;
        private bool running = false;

        public void Render(bool reset = true, bool atOnce = false)
        {
            if (!isActiveAndEnabled) return;
            running = true;
            if (atOnce)
                Update();
        }


        private void ReInitialize()
        {
            renderers = GetRenderers();
            mCanvas = GetFatherCanvas();
            mCurrentMask = GetClippable();
        }


        private void RenderSorting()
        {
            if (mCanvas == null) return;
            if (renderers != null)
            {
                for (int i = 0; i < renderers.Length; ++i)
                {
                    renderers[i].sortingLayerID = mCanvas.sortingLayerID;
                    renderers[i].sortingLayerName = mCanvas.sortingLayerName;
                    renderers[i].sortingOrder = mCanvas.sortingOrder;
                    renderers[i].enabled = mCanvas.enabled;
                    if (Application.isPlaying)
                    {
                        InnterUpdate(renderers[i].material);
                    }
                    else
                    {
                        InnterUpdate(renderers[i].sharedMaterial);
                    }
                }
            }
        }

        private Renderer[] GetRenderers()
        {
            return transform.GetComponentsInChildren<Renderer>(true);
        }

        private Canvas GetFatherCanvas()
        {
            List<Canvas> list = ListPool<Canvas>.Get();
            transform.GetComponentsInParent(true, list);
            Canvas returnCanvas = null;
            if (list.Count > 0) returnCanvas = list[0];
            ListPool<Canvas>.Release(list);
            return returnCanvas;
        }


        private CFRectMask2D GetClippable()
        {
            List<CFRectMask2D> components = ListPool<CFRectMask2D>.Get();
            transform.GetComponentsInParent(true, components);
            CFRectMask2D mask = null;
            if (components.Count > 0) mask = components[0];
            ListPool<CFRectMask2D>.Release(components);
            return mask;
        }

        private void InnterUpdate(Material material)
        {
            if (material == null) return;
            if (material.renderQueue != renderQueue + renderQueueOffset)
            {
                material.renderQueue = renderQueue + renderQueueOffset;
            }
        }


        protected override void OnEnable()
        {
            base.OnEnable();
            Render(false);
        }

        protected override void OnDisable()
        {
            base.OnDisable();
            mCanvas = null;
            mCurrentMask = null;
            renderers = null;
        }

        private void Update()
        {
            if (!running) return;
            running = false;
            ReInitialize();
            RenderSorting();
            RenderClippable();
        }

        protected override void OnCanvasHierarchyChanged()
        {
            running = true;
        }


        protected override void OnRectTransformDimensionsChange()
        {
            running = true;
        }

        protected override void OnTransformParentChanged()
        {
            running = true;
        }

        protected override void OnDidApplyAnimationProperties()
        {
            running = true;
        }


        readonly Vector3[] corners = new Vector3[4];
        private Vector4 border = new Vector4();
        private void RenderClippable()
        {
            if (renderers == null) return;
            if (mCurrentMask == null)
            {
                for (int i = 0; i < renderers.Length; ++i)
                {
                    if (renderers[i].material == null) continue;
                    renderers[i].material.DisableKeyword("UNITY_UI_CLIP_RECT");
                    border.Set(0, 0, 0, 0);
                }
            }
            else
            {
                for (int i = 0; i < renderers.Length; ++i)
                {
                    if (renderers[i].material == null) continue;
                    mCurrentMask.rectTransform.GetWorldCorners(corners);
                    renderers[i].material.EnableKeyword("UNITY_UI_CLIP_RECT");
                    border.Set(corners[0].x, corners[0].y, corners[2].x, corners[2].y);
                }
            }
        }
    }
}

关键代码在:

renderers[i].sortingLayerID = mCanvas.sortingLayerID;
renderers[i].sortingLayerName = mCanvas.sortingLayerName;
renderers[i].sortingOrder = mCanvas.sortingOrder;

无论是使用mesh的特效,还是使用particleSystem的特效,最终获取render即可。
注意:PartcileSystem的render获取到的是ParticleSystemRender。但ParticleSystemRender是Render的子类,所以也能获取的到。

相关文章:

  • python-opencv学习第一章
  • Hive启动失败
  • kajiya-kay 头发
  • Prncnfg.vbs参数详解
  • Docker安装
  • Precomputed Radiance Transfer for Real-Time Rendering in Dynamic, Low-Frequency Lighting Environment
  • Ocelot-基于.NET Core的开源网关实现
  • Real-Time Rendering——Chapter 6 Texturing
  • 边缘分析及直线和圆拟合——第5讲
  • Towards Real-Time Photorealistic Rendering: Challenges and Solutions
  • SpringBoot——定时任务+WebSocket(问题)
  • unity调试lua工具和方法——IntelliJ IDEA+EmmyLua
  • cad.net 更改高版本填充交互方式为低版本样子
  • xlua——03_UIEvent学习
  • Ant构建原理及build.xml文档描述
  • 【node学习】协程
  • Android组件 - 收藏集 - 掘金
  • CAP理论的例子讲解
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • js算法-归并排序(merge_sort)
  • Linux下的乱码问题
  • Python_OOP
  • Spring Cloud中负载均衡器概览
  • Web设计流程优化:网页效果图设计新思路
  • 从0到1:PostCSS 插件开发最佳实践
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 缓存与缓冲
  • 那些被忽略的 JavaScript 数组方法细节
  • 判断客户端类型,Android,iOS,PC
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 手写双向链表LinkedList的几个常用功能
  • 微信支付JSAPI,实测!终极方案
  • 一道闭包题引发的思考
  • 【干货分享】dos命令大全
  • MPAndroidChart 教程:Y轴 YAxis
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​Linux·i2c驱动架构​
  • #162 (Div. 2)
  • (145)光线追踪距离场柔和阴影
  • (175)FPGA门控时钟技术
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (算法)Game
  • (一)SpringBoot3---尚硅谷总结
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net 验证控件和javaScript的冲突问题
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器