Unity Inspector 给组件自动关联引用
项目进入上线阶段了, 有一些地方需要总结和优化. 我发现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 给组件自动关联引用的更多相关文章
- Unity Inspector 给组件自动关联引用(二)
通过声明的变量名称,主动关联引用. 使用这个关联引用两种方式1. 给你组件继承 MonoAutoQuote 点击组件inspector 按钮执行2. 给你组件类添加[AAutoQuote] 特性 ...
- 022 component(组件)关联映射
Component关联映射: 目前有两个类如下: 值对象没有标识,而实体对象具有标识,值对象属于某一个实体,使用它重复使用率提升,而且更清析. 以上关系的映射称为component(组件)关联映射 在 ...
- Qt 编程指南 3_1 按钮弹窗手动和自动关联示例
触发的两种模式 connect() 和 on_控件ID_控件函数(参数) 两者优缺点对比: 虽然 Qt 有比较好用的自动关联大法,但自动关联不是万能的,尤其是涉及到多个窗体的时候,比如 A 窗体私有按 ...
- C# 组件模组引用第三方组件问题
对接上一文章由于是动态加载指定程序集,会把当前目录下所有dll都加载进来.如果像sqlite这种第三组件调用了由C.C++非.net语言所以生成的Dll.因为自动生成的原因.会把非C#生成的dll都加 ...
- 二、Vue组件(component):组件的相互引用、通过props实现父子组件互传值
一.组件各部分说明及互相引用 1.一个vue组件由三个部分组成 Template 只能存在一个根元素 2.Script 3.Style scoped:样式只在当前组件内生效 1.1 组件的基本引用代码 ...
- Qt信号与槽自动关联机制
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
- Hibernate组件和关联映射
一.基本定义 组件:建立一个类,为了方便代码复用和建立模型,但类在数据库中并没有对应的表,此类可以作为一个组件插入到其他类中(有数据表的类) 组件和关联映射的关系是组件是没有对应的类;组件是值类型的, ...
- Android Studio2.x版本无法自动关联源码的解决方法
Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...
- 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明
一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...
随机推荐
- JAVA - hashcode与equals作用、关系
Hashcode的作用 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set.前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. ...
- Hadoop安装测试简单记录
安装的节点如下:1个namenode.1个hiveserver.3个dataNode192.168.1.139 namenode1192.168.1.146 hiveserver 192.16 ...
- starting Intent from ProcessRecord with revoked permission android.permission.CALL_PHONE 的错误
昨天写个电话拨号器,很简单就一个Edittext和一个button,用来输入号码并且点击按钮拨打电话,但是写好以后报的是安全错误,我上网查了下,原来是缺少授权,于是我在AndroidManifest. ...
- bash:ifconfig command not found for contos7.0
CentOS7刚发布,我忍不住把DELL T410从CentOS6升级到CentOS7.好不容易等安装结束后,立即配置网络,然后在yum源上安装环境.可是执行ifconfig的时候系统提示让我傻了眼: ...
- XIB自定义视图的整理
- (void)setAppInfo:(AppInfo *)appInfo { _appInfo = appInfo; _icon.image = appInfo.image; _label.text ...
- ubuntu 下源码安装Postgreql pgAdmin3
一.安装 PostgreSQL 1.安装相关依赖,在终端下执行: sudo apt-get install zlib1g-dev sudo apt-get install libreadline ...
- Ehcache入门(一)——开发环境的搭建
EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. 那么.如何搭建Ehcache的开发环境呢? 1.下载相关的jar包,这 ...
- 使用 phpMyAdmin无法登录mysql的问题
今天使用使用phpmyadmin时出现了以下错误: (1)第一次时: 当配置文件config.inc.php里的配置项是: $cfg['Servers'][$i]['host'] = 'localho ...
- C语言杂记 -- 简陋的<深入理解计算机系统>笔记
程序的表示 l 32位64位操作系统是由CPU寄存器的位数决定,即虚拟寻址的范围为2^32.2^64. l 字节的大端小端法是以字节为基本单位的:比如十进制的7在十六位机器上表示 · 地址 100 1 ...
- iOS 数据库操作(使用FMDB)
iOS 数据库操作(使用FMDB) iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...