美文网首页程序员
Ugui创建组件去除RaycastTarget 属性

Ugui创建组件去除RaycastTarget 属性

作者: AngerCow | 来源:发表于2020-05-20 14:20 被阅读0次

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;
    }
}

相关文章

网友评论

    本文标题:Ugui创建组件去除RaycastTarget 属性

    本文链接:https://www.haomeiwen.com/subject/itzgohtx.html