Unity Inspector 给组件自动关联引用(二)

通过声明的变量名称,主动关联引用.

使用这个关联引用两种方式
1.  给你组件继承  MonoAutoQuote 点击组件inspector 按钮执行
2.  给你组件类添加[AAutoQuote] 特性  通过Plateface/SetSelectGameRef 执行

 

[AAutoQuote]
public class MonoAutoQuote : MonoBehaviour ,IAutoQuote{}

public interface IAutoQuote { }

public class AAutoQuote : Attribute {}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Reflection;


//[CanEditMultipleObjects]
[CustomEditor(typeof(MonoAutoQuote), true)]
public class AutoQuoteEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        if (GUILayout.Button("关联子节点引用"))
        {
            Component c = target as Component;
            if (c != null)
                AutioQuoteMenu.SetRef(c, c.gameObject);
        }


    }
}

public class AutioQuoteMenu
{
    [MenuItem("Plateface/SetSelectGameRef %&A")]
    public static void SetRef()
    {
        GameObject o = Selection.activeGameObject;
        if (o != null)
        {
            Component[] cAry = o.GetComponents<Component>();
            foreach (var c in cAry)
            {
                System.Type componentType = c.GetType();
                if ((typeof(MonoBehaviour).IsAssignableFrom(componentType)) || IsHasAttribute(componentType))
                {
                    SetRef(c, o);
                }
            }
        }
    }

    public static void SetRef(Component c, GameObject o)
    {
        System.Type t = c.GetType();
        var infoList = t.GetFields(BindingFlags.Public | BindingFlags.Instance);
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        string name = string.Empty;
        foreach (var item in infoList)
        {
            var fieldType = item.FieldType;

            if ((typeof(MonoBehaviour).IsAssignableFrom(fieldType)))
            {
                if (item.Name.StartsWith("m"))
                {
                    name = item.Name.Substring(1);
                    Transform tr = o.transform.Find(name);
                    if (tr == null)
                    {
                        Debug.LogError(name + "引用没找到");
                        continue;
                    }

                    Component com = tr.GetComponent(fieldType);
                    item.SetValue(c, com);
                }
            }
        }
    }


    public static bool IsHasAttribute(System.Type type)
    {
        System.Object[] oList = type.GetCustomAttributes(typeof(AAutoQuote), false);
        foreach (var item in oList)
        {
            if ((item as AAutoQuote) != null)
                return true;
        }

        return false;
    }
}
posted @ 2018-02-08 16:09  盘子脸  阅读(828)  评论(0编辑  收藏  举报