Exemple #1
0
 private void SetVal(ref _ClassField cf, PropertyInfo field, Assembly hotCode, object hotInstance)
 {
     if (field.PropertyType != typeof(UnityEngine.Object) ||
         !field.PropertyType.IsSubclassOf(hotCode.GetType("JEngine.Core.JBehaviour")))
     {
         try
         {
             cf.value = field.GetValue(hotInstance).ToString();
         }catch
         {
             Log.PrintWarning($"无法对JBehaviour派生类的属性{cf.fieldName}自动赋值构造值(如果没有可忽略)");
         }
     }
 }
Exemple #2
0
 private static void SetType(_ClassField cf, Type type, Assembly hotCode)
 {
     if (type == typeof(GameObject))
     {
         cf.fieldType = _ClassField.FieldType.GameObject;
     }
     else if (type == typeof(UnityEngine.Component) || type.IsSubclassOf(typeof(MonoBehaviour)) || type.IsSubclassOf(hotCode.GetType("JEngine.Core.JBehaviour")))
     {
         cf.fieldType = _ClassField.FieldType.UnityComponent;
     }
     else if (type.IsSubclassOf(typeof(UnityEngine.Object)))
     {
         cf.fieldType = _ClassField.FieldType.HotUpdateResource;
     }
     else
     {
         if (type == typeof(short))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(ushort))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(int))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(uint))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(long))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(ulong))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(float))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(decimal))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(double))
         {
             cf.fieldType = _ClassField.FieldType.Number;
         }
         else if (type == typeof(string))
         {
             cf.fieldType = _ClassField.FieldType.String;
         }
         else if (type == typeof(bool))
         {
             cf.fieldType = _ClassField.FieldType.Bool;
         }
     }
 }
Exemple #3
0
        public static async void DoConvert(ClassBind instance)
        {
            int affectCounts = 0;

            foreach (var _cb in instance.ScriptsToBind) //遍历
            {
                string   className = $"{_cb.Namespace}.{_cb.Class}";
                Assembly hotCode   = Assembly
                                     .LoadFile("Assets/HotUpdateResources/Dll/Hidden~/HotUpdateScripts.dll");
                Type t = hotCode.GetType(className); //加载热更类

                if (t == null)
                {
                    EditorUtility.DisplayDialog("ClassBind Error", $"Class {className} does not exist " +
                                                $"in hot update scripts solution!\n" +
                                                $"'{className}'类在热更工程中不存在", "OK");
                    return;
                }

                //热更实例
                object hotInstance = null;
                if (!t.IsSubclassOf(hotCode.GetType("JEngine.Core.JBehaviour"))) //JBehaviour派生类不构造对象,不进行赋值
                {
                    hotInstance = Activator.CreateInstance(t);
                }

                var fieldsInCb = _cb.Fields.Select(f => f.fieldName).ToList(); //全部已经设置的字段
                var fs         = t.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance |
                                             BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
                var ps = t.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance |
                                         BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);

                foreach (var field in fs)
                {
                    //遍历字段

                    EditorUtility.DisplayProgressBar("ClassBind Progress",
                                                     "Converting FieldInfos " + fs.ToList().IndexOf(field) + "/" + fs.Length,
                                                     (float)fs.ToList().IndexOf(field) / (float)fs.Length);

                    if (!fieldsInCb.Contains(field.Name))
                    {
                        _ClassField cf        = new _ClassField();
                        string      fieldName = field.Name;
                        cf.fieldName = fieldName;

                        SetType(cf, field.FieldType, hotCode);
                        SetVal(ref cf, field, hotCode, hotInstance);

                        _cb.Fields.Add(cf);
                        affectCounts++;
                    }

                    await Task.Delay(10); //延迟一下,动画更丝滑
                }

                EditorUtility.DisplayProgressBar("ClassBind Progress",
                                                 $"Converting FieldInfos {fs.Length}/{fs.Length}", 1);

                await Task.Delay(50); //延迟一下,动画更丝滑

                foreach (var property in ps)
                {
                    //遍历属性
                    EditorUtility.DisplayProgressBar("ClassBind Progress",
                                                     "Converting PropertyInfos " + ps.ToList().IndexOf(property) + "/" + ps.Length,
                                                     (float)ps.ToList().IndexOf(property) / (float)ps.Length);
                    if (!fieldsInCb.Contains(property.Name))
                    {
                        _ClassField cf        = new _ClassField();
                        string      fieldName = property.Name;
                        cf.fieldName = fieldName;

                        SetType(cf, property.PropertyType, hotCode);
                        SetVal(ref cf, property, hotCode, hotInstance);

                        _cb.Fields.Add(cf);
                        affectCounts++;
                    }

                    await Task.Delay(10); //延迟一下,动画更丝滑
                }

                EditorUtility.DisplayProgressBar("ClassBind Progress",
                                                 $"Converting PropertyInfos {ps.Length}/{ps.Length}", 1);

                await Task.Delay(50); //延迟一下,动画更丝滑

                EditorUtility.DisplayProgressBar("ClassBind Progress",
                                                 $"Processing next class", 1);

                await Task.Delay(150); //延迟一下,动画更丝滑
            }

            await Task.Delay(50); //延迟一下,动画更丝滑

            EditorUtility.ClearProgressBar();

            //转换后保存场景
            bool saveResult = false;

            AssetDatabase.SaveAssets();
            bool isPreviewSceneObject = EditorSceneManager.IsPreviewSceneObject(Selection.activeGameObject);

            if (PrefabUtility.IsPartOfAnyPrefab(instance.gameObject) || PrefabUtility.IsPartOfPrefabAsset(instance.gameObject))
            {
                PrefabUtility.SavePrefabAsset(instance.gameObject, out saveResult);
            }
            else if (isPreviewSceneObject)
            {
                EditorSceneManager.SaveOpenScenes();
            }
            else
            {
                var scene = EditorSceneManager.GetActiveScene();
                saveResult = EditorSceneManager.SaveScene(scene, scene.path);
            }

            string result   = saveResult ? "succeeded" : "failed";
            string resultZh = saveResult ? "成功" : "失败";

            EditorUtility.DisplayDialog("ClassBind Result",
                                        $"Added {affectCounts} fields into ClassBind: {instance.name} and saved the scene {result}\n" +
                                        $"ClassBind: {instance.name}的fields添加了{affectCounts}个,且保存{resultZh}",
                                        "Done");
        }
Exemple #4
0
 private void SetType(ref _ClassField cf, PropertyInfo field, Assembly hotCode)
 {
     if (field.PropertyType == typeof(GameObject))
     {
         cf.fieldType = _ClassField.FieldType.GameObject;
     }
     else if (field.PropertyType == typeof(UnityEngine.Component))
     {
         cf.fieldType = _ClassField.FieldType.UnityComponent;
     }
     else if (field.PropertyType.IsSubclassOf(hotCode.GetType("JEngine.Core.JBehaviour")))
     {
         cf.fieldType = _ClassField.FieldType.UnityComponent;
     }
     else if (field.PropertyType == typeof(UnityEngine.Object))
     {
         cf.fieldType = _ClassField.FieldType.HotUpdateResource;
     }
     else
     {
         if (field.PropertyType == typeof(short))
         {
             cf.fieldType = _ClassField.FieldType.Short;
         }
         else if (field.PropertyType == typeof(ushort))
         {
             cf.fieldType = _ClassField.FieldType.UShort;
         }
         else if (field.PropertyType == typeof(int))
         {
             cf.fieldType = _ClassField.FieldType.Int;
         }
         else if (field.PropertyType == typeof(uint))
         {
             cf.fieldType = _ClassField.FieldType.UInt;
         }
         else if (field.PropertyType == typeof(long))
         {
             cf.fieldType = _ClassField.FieldType.Long;
         }
         else if (field.PropertyType == typeof(ulong))
         {
             cf.fieldType = _ClassField.FieldType.ULong;
         }
         else if (field.PropertyType == typeof(float))
         {
             cf.fieldType = _ClassField.FieldType.Float;
         }
         else if (field.PropertyType == typeof(decimal))
         {
             cf.fieldType = _ClassField.FieldType.Decimal;
         }
         else if (field.PropertyType == typeof(double))
         {
             cf.fieldType = _ClassField.FieldType.Double;
         }
         else if (field.PropertyType == typeof(string))
         {
             cf.fieldType = _ClassField.FieldType.String;
         }
         else if (field.PropertyType == typeof(bool))
         {
             cf.fieldType = _ClassField.FieldType.Bool;
         }
     }
 }