当UI脚本上须要赋值的组件太多的时候,利用反射机制主动给参数赋值就显得很不便。只须要参数名称和UI节点的名称相一致(能够定义本人的匹配规定)
    /// <summary>    /// 给字段赋值    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="root"></param>    /// <param name="tObj"></param>    public static void SetFieldValue<T>(this Transform root,T tObj)    {        var fields = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic)?.Where(p => p.FieldType.IsSubclassOf(typeof(Component))).ToList();        RecursiveSetValue(root, fields, tObj);    }    /// <summary>    /// 递归函数给类里的字段赋值    /// </summary>    /// <typeparam name="T"></typeparam>    /// <param name="root"></param>    /// <param name="fieldInfos"></param>    /// <param name="tObj"></param>    private static void RecursiveSetValue<T>(Transform root,List<FieldInfo> fieldInfos,T tObj)    {        if (fieldInfos == null || fieldInfos.Count == 0) return;        for (int i = 0; i < root.childCount; i++)        {            var child = root.GetChild(i);            RecursiveSetValue(child, fieldInfos,tObj);            for (int j = fieldInfos.Count - 1; j >= 0; j--)            {                var fieldInfo = fieldInfos[j];                if (fieldInfo.FieldType.IsSubclassOf(typeof(Component)) && fieldInfo.Name.IsMatch(child.name))                {                    var component = child.GetComponent(fieldInfo.FieldType);                    fieldInfo.SetValue(tObj, component);                    fieldInfos.RemoveAt(j);                }            }        }    }    /// <summary>    /// 判断字段的名称和节点的名称是否匹配    /// </summary>    /// <param name="name"></param>    /// <param name="transName"></param>    /// <returns></returns>    private static bool IsMatch(this string name,string transName)    {        var temp = name.StartsWith("_") ? name.Substring(1, name.Length - 1) : name;        return temp.ToLower().Equals(transName.ToLower());    }