自动引用

作者: JervieQin | 来源:发表于2018-07-15 16:31 被阅读25次

    背景
    创建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中的效果:

    这些引用自动添加!

    相关文章

      网友评论

        本文标题:自动引用

        本文链接:https://www.haomeiwen.com/subject/zwmppftx.html