今天要分享的主题是在项目优化阶段经常会使用到的一个功能,在UGUI的对象组件中,有一些类似于Image Text等组件,上面自带了一个属性,名为 Raycast Target,用来检测事件接收。
举个例子,如果一个Image上勾选了Raycast Target,在相同位置下有一个Button对象,那么在运行时,该Button是无法接收到正常的点击事件的,因为被Raycast Target遮挡屏蔽了,那实际在项目中,这个功能是有一定的性能消耗的,所以会要求做到只给特定的对象Raycast Target的选项勾选为True。
而默认的组件在创建的时候是True的,或者项目初期没有注意,而到了一定阶段和程度了才开始优化,想要把项目中的raycast进行优化,那就会涉及到一个功能,比如说想一键将多个对象上的Raycast Target进行去除。那该如何做呢?其实很简单,直接上逻辑
代码语言:javascript复制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,并且隐藏的对象依然有效)
好了,今天的分享主要点就是代码区,希望能帮助到需要的小伙伴~