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

原文地址:https://www.cnblogs.com/plateFace/p/8432008.html

时间: 2024-08-20 12:53:22

Unity Inspector 给组件自动关联引用(二)的相关文章

浅析关联引用

背景 今日吃饱了,确实撑得慌,找了我的邻居-阿杰一起散步,走了好大一圈,最后在小区下聊起了技术,从YYKit,SDWebImage 等第三方库,扯到了关联引用,因为他们都用到了这个技术,然而我又想到了单例,单例和关联引用在实现上有一个相同点-都需要一个静态变量:那么疑问就来了:同样都需要一个静态变量,为什么结果不一样呢?或许你还没明白我的疑问是什么,请继续阅读吧! 一.回顾单例 我简单的写了个单例类 SingletonObject ,把静态变量 instance 放在 sharedInstanc

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

【Unity 3D】学习笔记三十二:游戏元素——游戏光源

游戏光源 在3D游戏中,光源是一个非常具有特色的游戏组件.用来提升游戏画面质感的.如果没有加入光源,游戏场景可能就会显得很昏暗.在unity中提供了三种不同的光源类型:点光源,聚光灯,平行光. 点光源 顾名思义,点光源是从一个点向周围散发出光的光源,就像电灯一样.创建点光源在hierarchy视图中点击create--point light: 创建完以后,点击点光源对象,在右侧inspector视图中可以看到点光源的所有信息: type:光源的类型.有point(点光源),directional

Loadrunner脚本自动关联和手动关联

关于Loadrunner关联一.什么时候需要关联 1.关联的含义        关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联.        其实关联也属于一同特殊的参数化,只是与一般的参数化有些不同        一般的参数化的参数来源于一个文件.一个定义的table.通过sql写

【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型

[Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698.html 写作本系列文章时使用的是Unity5.3. 写代码之前: 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧? 阅读本系列文章之前你需要有一些编程的概念. 在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示

如何做LR自动关联和手动关联?

一.什么时候需要关联   1.关联的含义        关联的含义A(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联. 关联的含义B(correlation):就是把脚本中某些写死的代码(hard_coded)数据,转变成撷(xie)取自服务器所送的.动态的.每次都不一样的数据. 其实关联也

关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明

一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载),Explicit Loading(显式加载),其中Lazy Loading和Explicit Loading都是延迟加载. (注:由于Entity Framework版本的不同,以及采用不同的模式(DB First,Model First,Code First)来构建的Entity,最终导致可能自

扩展 Unity 内置类型 (组件)

Unity 内置组件基本没有可以继承的.某些比较常用但现有 API 没有定义的功能,我们可以通过C# 的扩展类方法来实现.下面是一些比较实用的扩展方法. 扩展 Transform 每一个 GameObject 都含有一个 Transform 组件(在 UGUI 里新引入的 RectTransform 继承 Transform),GameObject 的层级也是由 Transform 负责的.以下扩展方法使用了 C# 的委托,关于委托可以参考这里:C# 中的 delegate 和 event. /

LoadRunner-关联(自动关联和手动关联)

使用LR录制脚本,新建课程:每次新建课程都会产生一个新的courseid和partid,直接使用录制的脚本执行是不行的.所以用到了关联. 注:关联分手动和自动关联,自动关联搜索出一些不必要关联的数据,有些关联有时扫不出.所以最后我使用的是手动关联才成功的. 方法一:replay后会自动进行关联扫描,或者使用菜单工具"Scan Script for Correlations"进行自动关联(如下图) 扫描结果查看点击"show/hide output window" 再