zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    Java五
    Java I/O流
    第二周学习笔记
    第一周学习笔记
    第六次作业修改版
    第六周作业
    java第四次作业(补)
    java第五次作业
    Java第三次作业
    java第二次作业
  • 原文地址:https://www.cnblogs.com/plateFace/p/8432008.html
Copyright © 2011-2022 走看看