以下内容是根据Unity 2020.1.0f1版本进行编写的
1、目的
日常使用Unity的UGUI时,新建Image组件或者RowImage组件默认都会把组件上的Raycast Target属性开启。这个属性是用于射线检测的,当用户点击开启了Raycast Target属性的Image组件后,会用户点击到层级在其下方的物体。
默认关闭Raycast Target属性的好处有很多,可以减少不必要的射线检测,降低GPU压力,防止错误遮挡等。
一般来说,只有需要交互的组件才需要开启Raycast Target属性,例如滑动列表,按钮,或者有需要遮挡的区域。因此,实际上需要开启Raycast Target属性的情况不多,可以实现一个工具,重写生成Image组件和RowImage组件的逻辑,使其生成的时候默认取消勾选Raycast Target属性。
2、实现
看UGUI源代码可以知道,UGUI是将全部的入口定义在了MenuOptions类。
接下来就简单了,新建一个脚本放到Editor目录下,照抄就行,然后在获取到的GameObject上获取Image组件(或RawImage组件),然后将组件对应的rayCastTarget属性设置为false即可。
代码:
重写Image:
//重写Create->UI->Image事件
[MenuItem("GameObject/UI/Image", false, 2001)]
static void AddImage(MenuCommand menuCommand)
{GameObject go = DefaultControls.CreateImage(MenuOptions.GetStandardResources());MenuOptions.PlaceUIElementRoot(go, menuCommand);go.GetComponent<RectTransform>().localPosition = Vector3.zero;Image image = go.GetComponent<Image>();//将raycastTarget置为falseimage.raycastTarget = false;
}重写Raw Image:
//重写Create->UI->Raw Image事件
[MenuItem("GameObject/UI/Raw Image", false, 2002)]
static void AddRawImage(MenuCommand menuCommand)
{GameObject go = DefaultControls.CreateRawImage(MenuOptions.GetStandardResources());MenuOptions.PlaceUIElementRoot(go, menuCommand);go.GetComponent<RectTransform>().localPosition = Vector3.zero;RawImage image = go.GetComponent<RawImage>();//将raycastTarget置为falseimage.raycastTarget = false;
}
有一个点要注意,这里用到了MenuOptions类的GetStandardResources方法和PlaceUIElementRoot方法,可以直接将MenuOptions类复制到Editor目录下,复制后需要注释掉全部UGUI控件的入口(例如Text、Image、Button、EventSystem等),因为项目默认已经有一套UGUI引用了。