项目进入上线阶段了, 有一些地方需要总结和优化.  我发现UI一改变,我就要拖很久的UI。 UI结构发生改变我还必须给一些变量设置好引用,后来我去看别人预设的时候组件拖放的变量至少10个以上, 它们一旦丢失了引用了, 作为一个外人就很难把他们关联起来.  预设就定义了m_xxx名字必须和GameObject名字一样, 这样就方便其他人帮你修复预设的引用啦.

今天就突然想起写一个辅助用具, 一键把一些简单的引用帮我赋值上去. 就再也不用手动拖啦.

代码如下:

using UnityEngine;
using System.Collections;
using UnityEngine;
using UnityEditor;
using System;
using System.Reflection; public class PLAutoAssignment : MonoBehaviour
{ /// <summary>
/// 变量名存在_, m_name, name代表你要去搜索的GameObject名字,再根据类型自动赋值到该变量上面去,
/// m_name_a, a代表你要去搜索的GameObject名字
/// </summary>
[MenuItem("Plateface/AutoAssignment %F1")]
public static void AutoAssignment()
{
Debug.ClearDeveloperConsole(); GameObject go = Selection.activeGameObject;
//Debug.Log(go.name); IAutoAssignment com = go.GetComponent<IAutoAssignment>(); Type e = com.GetType();
var fiedlAry = e.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); object valueObj = null;
object[] attrAry = null;
bool isSeriualizeField = false;
Component[] comAry = null;
string gameObjectName = string.Empty; foreach (var item in fiedlAry)
{
//Debug.Log(item.Name + "-" + item.FieldType.Name + " - "); valueObj = item.GetValue(com);
if (item.Name.Contains("_"))
{
gameObjectName = item.Name.Substring(item.Name.LastIndexOf('_') + 1);
}
else
{
gameObjectName = item.Name;
} if (item.FieldType.IsClass && valueObj == null || "null".Equals(valueObj.ToString()))
{ if (!item.IsPublic)
{
attrAry = item.GetCustomAttributes(typeof(SerializeField), false);
for (int i = 0; i < attrAry.Length; i++)
{
if (attrAry[i] is SerializeField)
{
isSeriualizeField = true;
break;
}
}
} if (item.IsPublic || isSeriualizeField)
{ Transform[] tfAry = go.GetComponentsInChildren<Transform>(true); for (int i = 0; i < tfAry.Length; i++)
{
if (tfAry[i].name == gameObjectName)
{
if (item.FieldType.Name == "GameObject")
{
item.SetValue(com, tfAry[i].gameObject);
break;
}
else
{
comAry = tfAry[i].GetComponents<Component>();
for (int j = 0; j < comAry.Length; j++)
{
if (comAry[j].GetType().Name == item.FieldType.Name)
{
item.SetValue(com, comAry[j]);
break;
}
}
}
break;
}
}
}
isSeriualizeField = false;
}
}
}
} public interface IAutoAssignment { }

Unity Inspector 给组件自动关联引用的更多相关文章

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

    通过声明的变量名称,主动关联引用. 使用这个关联引用两种方式1.  给你组件继承  MonoAutoQuote 点击组件inspector 按钮执行2.  给你组件类添加[AAutoQuote] 特性 ...

  2. 022 component(组件)关联映射

    Component关联映射: 目前有两个类如下: 值对象没有标识,而实体对象具有标识,值对象属于某一个实体,使用它重复使用率提升,而且更清析. 以上关系的映射称为component(组件)关联映射 在 ...

  3. Qt 编程指南 3_1 按钮弹窗手动和自动关联示例

    触发的两种模式 connect() 和 on_控件ID_控件函数(参数) 两者优缺点对比: 虽然 Qt 有比较好用的自动关联大法,但自动关联不是万能的,尤其是涉及到多个窗体的时候,比如 A 窗体私有按 ...

  4. C# 组件模组引用第三方组件问题

    对接上一文章由于是动态加载指定程序集,会把当前目录下所有dll都加载进来.如果像sqlite这种第三组件调用了由C.C++非.net语言所以生成的Dll.因为自动生成的原因.会把非C#生成的dll都加 ...

  5. 二、Vue组件(component):组件的相互引用、通过props实现父子组件互传值

    一.组件各部分说明及互相引用 1.一个vue组件由三个部分组成 Template 只能存在一个根元素 2.Script 3.Style scoped:样式只在当前组件内生效 1.1 组件的基本引用代码 ...

  6. Qt信号与槽自动关联机制

    参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...

  7. Hibernate组件和关联映射

    一.基本定义 组件:建立一个类,为了方便代码复用和建立模型,但类在数据库中并没有对应的表,此类可以作为一个组件插入到其他类中(有数据表的类) 组件和关联映射的关系是组件是没有对应的类;组件是值类型的, ...

  8. Android Studio2.x版本无法自动关联源码的解决方法

    Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...

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

    一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...

随机推荐

  1. Chapter 7. Dependency Management Basics 依赖管理基础

    This chapter introduces some of the basics of dependency management in Gradle. 7.1. What is dependen ...

  2. apache SetEnv 设置

    php的服务器预定义变量 $_SERVER 可以通过apache的mod_env模块来添加我们所需要的内容 来段官网介绍 Description: Modifies the environment w ...

  3. hdu 1870

    水题.... AC代码: #include <iostream> #include <queue> using namespace std; int main() { char ...

  4. (转)安装 Apache 出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试

    在安装Apache的过程中出现: 仔细查看提示: make_sock: could not bind to address 0.0.0.0:80 恍然大悟,计算机上安装了IIS7,80端口已占用. 打 ...

  5. 关于.NET中的验证码

    常用的生成验证码程序 ,图片效果如下: 源程序如下: 复制代码 代码如下:using System; using System.IO; using System.Drawing; using Syst ...

  6. 《CSS网站布局实录》学习笔记(六)

    第六章 CSS高级应用与技巧 6.1 id与class 6.1.1 什么是id id是XHTML元素的一个属性,用于标识对象名称.无论是class还是id,都是XHTML所支持的公共属性,并且也是其核 ...

  7. oracle 中 group by 加强

    group by rollup(a,b) = group by a,b + group by a + group by null SQL> select deptno,job,sum(sal) ...

  8. memmove 的实现

    baidu的笔试题目 用C语言实现一个公用库函数void * memmove(void *dest,const void *src,size_t n).该函数的功能是拷贝src所指的内存内容前n个字节 ...

  9. 数据库触发器new old

    数据库触发器new old: "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . col ...

  10. d3可视化实战00:d3的使用心得和学习资料汇总

    最近以来,我使用d3进行我的可视化工具的开发已经3个月了,同时也兼用其他一些图表类库,自我感觉稍微有点心得.之前我也写过相关文章,我涉及的数据可视化的实现技术和工具,但是那篇文章对于项目开发而言太浅了 ...