コード例 #1
0
        /// <summary>
        /// Set value
        /// </summary>
        /// <param name="classData"></param>
        public void SetVal(ClassData classData)
        {
            string classType =
                $"{classData.classNamespace + (classData.classNamespace == "" ? "" : ".")}{classData.className}";
            Type t           = classData.ClassType; //获取实际属性
            var  clrInstance = classData.ClrInstance;

            //绑定数据
            classData.BoundData = false;
            var fields      = classData.fields.ToArray();
            var bindingAttr = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance |
                              BindingFlags.Static;

            foreach (ClassField field in fields)
            {
                if (field.fieldType == ClassField.FieldType.NotSupported)
                {
                    continue;
                }

                object obj = null;
                try
                {
                    if (field.fieldType == ClassField.FieldType.Number)
                    {
                        var fieldType = t.GetField(field.fieldName, bindingAttr).FieldType ??
                                        (t.BaseType.GetField(field.fieldName, bindingAttr).FieldType ??
                                         (t.GetProperty(field.fieldName, bindingAttr).PropertyType ??
                                          t.BaseType.GetProperty(field.fieldName, bindingAttr).PropertyType));
                        fieldType = fieldType is ILRuntimeWrapperType wrapperType ? wrapperType.RealType : fieldType;

                        if (fieldType == typeof(SByte))
                        {
                            obj = SByte.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(Byte))
                        {
                            obj = Byte.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(Int16))
                        {
                            obj = Int16.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(UInt16))
                        {
                            obj = UInt16.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(Int32))
                        {
                            obj = Int32.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(UInt32))
                        {
                            obj = UInt32.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(Int64))
                        {
                            obj = Int64.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(UInt64))
                        {
                            obj = UInt64.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(Single))
                        {
                            obj = Single.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(Decimal))
                        {
                            obj = Decimal.Parse(field.value);
                            classData.BoundData = true;
                        }
                        else if (fieldType == typeof(Double))
                        {
                            obj = Double.Parse(field.value);
                            classData.BoundData = true;
                        }
                    }

                    else if (field.fieldType == ClassField.FieldType.String)
                    {
                        obj = field.value;
                        classData.BoundData = true;
                    }
                    else if (field.fieldType == ClassField.FieldType.Bool)
                    {
                        field.value         = field.value.ToLower();
                        obj                 = field.value == "true";
                        classData.BoundData = true;
                    }

                    if (field.fieldType == ClassField.FieldType.GameObject)
                    {
                        GameObject go = field.gameObject;
                        if (go == null)
                        {
                            try
                            {
                                go = field.value == "${this}"
                                    ? gameObject
                                    : GameObject.Find(field.value);
                                if (go == null) //找父物体
                                {
                                    go = FindSubGameObject(field);
                                    if (go == null) //如果父物体还不存在
                                    {
                                        continue;
                                    }
                                }
                            }
                            catch (Exception) //找父物体(如果抛出空异常)
                            {
                                go = FindSubGameObject(field);
                                if (go == null) //如果父物体还不存在
                                {
                                    continue;
                                }
                            }
                        }

                        obj = go;
                        classData.BoundData = true;
                    }
                    else if (field.fieldType == ClassField.FieldType.UnityComponent)
                    {
                        GameObject go = field.gameObject;
                        if (go == null)
                        {
                            try
                            {
                                if (field.value.Contains("."))
                                {
                                    field.value =
                                        field.value.Remove(field.value.IndexOf(".", StringComparison.Ordinal));
                                }

                                go = field.value == "${this}"
                                    ? gameObject
                                    : GameObject.Find(field.value);
                                if (go == null) //找父物体
                                {
                                    go = FindSubGameObject(field);
                                    if (go == null) //如果父物体还不存在
                                    {
                                        continue;
                                    }
                                }
                            }
                            catch (Exception) //找父物体(如果抛出空异常)
                            {
                                go = FindSubGameObject(field);
                                if (go == null) //如果父物体还不存在
                                {
                                    continue;
                                }
                            }
                        }

                        var tp = t.GetField(field.fieldName, bindingAttr);
                        if (tp == null)
                        {
                            tp = t.BaseType?.GetField(field.fieldName, bindingAttr);
                        }
                        if (tp != null)
                        {
                            var fieldType = tp.FieldType;
                            fieldType = fieldType is ILRuntimeWrapperType wrapperType ? wrapperType.RealType : fieldType;

                            if (fieldType is ILRuntimeType) //如果在热更中
                            {
                                var components = go.GetComponents <CrossBindingAdaptorType>();
                                foreach (var c in components)
                                {
                                    if (c.ILInstance.Type.ReflectionType == fieldType)
                                    {
                                        obj = c.ILInstance;
                                        classData.BoundData = true;
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                var component = go.GetComponent(fieldType);
                                if (component != null)
                                {
                                    obj = component;
                                    classData.BoundData = true;
                                }
                            }
                        }
                        else
                        {
                            var pi = t.GetProperty(field.fieldName, bindingAttr);
                            if (pi == null)
                            {
                                pi = t.BaseType?.GetProperty(field.fieldName, bindingAttr);
                            }
                            if (pi != null)
                            {
                                var fieldType = pi.PropertyType;
                                fieldType = fieldType is ILRuntimeWrapperType wrapperType ? wrapperType.RealType : fieldType;

                                if (fieldType is ILRuntimeType) //如果在热更中
                                {
                                    var components = go.GetComponents <CrossBindingAdaptorType>();
                                    foreach (var c in components)
                                    {
                                        if (c.ILInstance.Type.ReflectionType == fieldType)
                                        {
                                            obj = c.ILInstance;
                                            classData.BoundData = true;
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    var component = go.GetComponent(fieldType);
                                    if (component != null)
                                    {
                                        obj = component;
                                        classData.BoundData = true;
                                    }
                                }
                            }
                            else
                            {
                                Log.PrintError(
                                    $"自动绑定{name}出错:{classType}.{field.fieldName}赋值出错:{field.fieldName}不存在");
                            }
                        }
                    }
                    else if (field.fieldType == ClassField.FieldType.HotUpdateResource)
                    {
                        obj = AssetMgr.Load(field.value);
                        classData.BoundData = true;
                    }
                }
                catch (Exception except)
                {
                    Log.PrintError(
                        $"自动绑定{name}出错:{classType}.{field.fieldName}获取值{field.value}出错:{except.Message},已跳过");
                }

                //如果有数据再绑定
                if (classData.BoundData)
                {
                    void _setVal(MemberInfo mi)
                    {
                        try
                        {
                            switch (mi)
                            {
                            case null:
                                throw new NullReferenceException();

                            case FieldInfo info:
                                info.SetValue(clrInstance.ILInstance, obj);
                                break;

                            case PropertyInfo inf:
                                inf.SetValue(clrInstance.ILInstance, obj);
                                break;
                            }
                        }
                        catch (Exception e)
                        {
                            Log.PrintError(
                                $"自动绑定{name}出错:{classType}.{field.fieldName}赋值出错:{e.Message},已跳过");
                        }
                    }

                    var fi = t.GetField(field.fieldName, bindingAttr);
                    if (fi == null)
                    {
                        fi = t.BaseType?.GetField(field.fieldName, bindingAttr);
                    }
                    if (fi != null)
                    {
                        _setVal(fi);
                    }
                    else
                    {
                        var pi = t.GetProperty(field.fieldName, bindingAttr);
                        if (pi == null)
                        {
                            pi = t.BaseType?.GetProperty(field.fieldName, bindingAttr);
                        }
                        _setVal(pi);
                    }
                }
            }
        }
コード例 #2
0
ファイル: JResource.cs プロジェクト: ErQing/JEngine
 /// <summary>
 /// 加载热更资源
 /// Load hot update resource
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="path"></param>
 /// <param name="mode"></param>
 /// <returns></returns>
 public static T LoadRes <T>(string path, MatchMode mode = MatchMode.AutoMatch) where T : UnityEngine.Object
 {
     return(AssetMgr.Load(ResPath(path, mode), typeof(T)) as T);
 }