背景
创建UI并不是令人愉快的事情,主要是因为你有许多脚本,需要很多的引用,你必须手动分配。如果能让引用都是自己填充的,这不是很好吗?
实现案例
using System.Linq;
using UnityEngine;
public class AutoReferencer<T> : MonoBehaviour where T : AutoReferencer<T> {
#if UNITY_EDITOR
// 这个方法在脚本被加到gameobject上时被调用
protected new virtual void Reset()
{
// 反射的魅力
// 对于类/组件中的每个字段,我们只查找那些为空/ null的字段
foreach (var field in typeof(T).GetFields().Where(field => field.GetValue(this) == null))
{
// 现在我们正在寻找与字段具有相同名称的对象(自身或子物体)
Transform obj;
if (transform.name == field.Name)
{
obj = transform;
}
else
{
// 或者你需要实现递归以寻找更深层次的子节点
obj = transform.Find(field.Name);
}
//如果我们找到与字段具有相同名称的对象,我们将尝试获取将在字段类型中并分配它的组件
if (obj!=null)
{
field.SetValue(this, obj.GetComponent(field.FieldType));
}
}
}
#endif
}
以下是该实现的使用示例:
using UnityEngine;
using UnityEngine.UI;
public class DialogWindow : AutoReferencer<DialogWindow> {
public Text DialogLabel;
public Button ConfirmButton;
}
以下是它在Unity中的效果:
这些引用自动添加!
网友评论