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}自动赋值构造值(如果没有可忽略)"); } } }
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; } } }
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"); }
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; } } }