今天要分享的主题是在项目优化阶段经常会使用到的一个功能,在UGUI的对象组件中,有一些类似于Image Text等组件,上面自带了一个属性,名为 Raycast Target,用来检测事件接收。
举个例子,如果一个Image上勾选了Raycast Target,在相同位置下有一个Button对象,那么在运行时,该Button是无法接收到正常的点击事件的,因为被Raycast Target遮挡屏蔽了,那实际在项目中,这个功能是有一定的性能消耗的,所以会要求做到只给特定的对象Raycast Target的选项勾选为True。
而默认的组件在创建的时候是True的,或者项目初期没有注意,而到了一定阶段和程度了才开始优化,想要把项目中的raycast进行优化,那就会涉及到一个功能,比如说想一键将多个对象上的Raycast Target进行去除。那该如何做呢?其实很简单,直接上逻辑
using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEngine.UI; using System.Linq; /// <summary> /// Add By HanDongji /// </summary> public class DisableRaycast : MonoBehaviour { #region Public Methods [MenuItem("Tools/UI/Disable RayCast")] public static void DisableCompoRaycast() { List<Transform> seletObjs = Selection.transforms.ToList(); if(seletObjs.Count <= 0) { EditorUtility.DisplayDialog ("提示", "请选择你要去掉RayCast的对象", "确定"); } else { List<Graphic> graphicObjs = new List<Graphic> (); foreach(Transform go in seletObjs) { graphicObjs.Clear (); graphicObjs = go.GetComponentsInChildren<Graphic> (true).ToList (); if (graphicObjs.Count <= 0) { Debug.Log ("当前对象: " + go.name + " 不包含Graphic组件,已跳过该对象继续设置"); continue; } foreach(Graphic item in graphicObjs) { item.raycastTarget = false; } } Debug.Log ("本次设置Raycast结束"); } } #endregion}
在Unity中执行的时候,从菜单栏选择点击后会有以下几张情况,首先,一个对象都不选,会有以下提示
其次如果选择的对象没有Raycast Target对象,也会有文字console提示
完整视频如下(忽略这个视频的黑边,时间实在有限,视频内容主要展示最开始Canvas下组件的Raycast为勾选状态,执行菜单栏后,全部去掉Raycast Target,并且隐藏的对象依然有效)
好了,今天的分享主要点就是代码区,希望能帮助到需要的小伙伴~
本文分享自微信公众号 - 韩东吉的Unity杂货铺(DeveloperJimin)
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2019-02-26
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句