Ugui创建ui的组件时,会默认产生RaycastTarget 属性,但是很多时候我们根本不需要有事件交互。所以我们能不能在创建相关ui组件时关闭这个属性,答案是肯定的。我们重写创建菜单。把相关属性关闭。
一开始加入这功能后,在UI有Canvas的情况下并没有产生问题,但是如果你在场景或者UI没有父节点为Canvas的情况下,就无法正常创建组件。这里我加入了兼容。
Tips:引用了编辑器命名空间,文件必须放在Editor命名的文件夹下。
using System;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class NoRaycastTarget : MonoBehaviour
{
/// <summary>
/// 自动取消RatcastTarget
/// </summary>
[MenuItem("GameObject/UI/Image")]
static void CreatImage()
{
if (Selection.activeTransform)
{
if (Selection.activeTransform.GetComponentInParent<Canvas>())
{
GameObject go = new GameObject("Image", typeof(Image));
go.GetComponent<Image>().raycastTarget = false;
go.transform.SetParent(Selection.activeTransform);
}
}
else
{
Canvas canvas = CheckHasCanvas();
if (canvas != null)
{
GameObject go = new GameObject("Image", typeof(Image));
go.GetComponent<Image>().raycastTarget = false;
go.transform.SetParent(canvas.transform);
}
}
}
//重写Create->UI->Text事件
[MenuItem("GameObject/UI/Text")]
static void CreatText()
{
if (Selection.activeTransform)
{
//如果选中的是列表里的Canvas
if (Selection.activeTransform.GetComponentInParent<Canvas>())
{
//新建Text对象
GameObject go = new GameObject("Text", typeof(Text));
//将raycastTarget置为false
go.GetComponent<Text>().raycastTarget = false;
//设置其父物体
go.transform.SetParent(Selection.activeTransform);
}
}
else
{
Canvas canvas = CheckHasCanvas();
if (canvas != null)
{
GameObject go = new GameObject("Text", typeof(Text));
go.GetComponent<Text>().raycastTarget = false;
go.transform.SetParent(canvas.transform);
}
}
}
//重写Create->UI->Text事件
[MenuItem("GameObject/UI/Raw Image")]
static void CreatRawImage()
{
if (Selection.activeTransform)
{
//如果选中的是列表里的Canvas
if (Selection.activeTransform.GetComponentInParent<Canvas>())
{
//新建Text对象
GameObject go = new GameObject("RawImage", typeof(RawImage));
//将raycastTarget置为false
go.GetComponent<RawImage>().raycastTarget = false;
//设置其父物体
go.transform.SetParent(Selection.activeTransform);
}
}
else
{
Canvas canvas = CheckHasCanvas();
if (canvas != null)
{
GameObject go = new GameObject("RawImage", typeof(RawImage));
go.GetComponent<RawImage>().raycastTarget = false;
go.transform.SetParent(canvas.transform);
}
}
}
/// <summary>
/// 兼容没有选择物体时创建
/// </summary>
/// <returns></returns>
static Canvas CheckHasCanvas()
{
Canvas canvas = GameObject.FindObjectOfType<Canvas>();
if (canvas == null)
{
GameObject go = new GameObject("Canvas");
canvas = go.AddComponent<Canvas>();
go.AddComponent<CanvasScaler>();
go.AddComponent<GraphicRaycaster>();
GameObject eventSystem = new GameObject("EventSystem");
eventSystem.AddComponent<UnityEngine.EventSystems.EventSystem>();
eventSystem.AddComponent<UnityEngine.EventSystems.StandaloneInputModule>();
}
return canvas;
}
}
[InitializeOnLoad]
public class Factory
{
static Factory()
{
ObjectFactory.componentWasAdded += ComponentWasAdded;
}
private static void ComponentWasAdded(Component component)
{
Image image = component as Image;
if (image != null)
image.raycastTarget = false;
RawImage rawImage = component as RawImage;
if (rawImage != null)
rawImage.raycastTarget = false;
Text text = component as Text;
if (text != null)
text.raycastTarget = false;
}
}
网友评论