/// <summary> /// 分析代码的的组件信息 /// </summary> /// <param name="component"></param> /// <param name="components"></param> public static void AnalysisComponent(MonoBehaviour component, List <ComponentItem> components, GenCodeRule rule) { var type = component.GetType(); rule.nameSpace = type.Namespace; var propertys = type.GetProperties(BindingFlags.GetProperty | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach (var prop in propertys) { var support = typeof(UnityEngine.MonoBehaviour).IsAssignableFrom(prop.PropertyType) || typeof(ScriptableObject).IsAssignableFrom(prop.PropertyType) || prop.PropertyType == typeof(GameObject); if (support) { var compItem = components.Find(x => "m_" + x.name == prop.Name || x.name == prop.Name); if (compItem == null) { compItem = new ComponentItem(); compItem.name = prop.Name.Replace("m_", ""); components.Add(compItem); } var value = prop.GetValue(component, new object[0]); if (value != null) { if (prop.PropertyType == typeof(GameObject)) { compItem.target = value as GameObject; compItem.components = SortComponent(compItem.target); var types = Array.ConvertAll(compItem.components, x => x.type); compItem.componentID = Array.IndexOf(types, typeof(GameObject)); } else if (typeof(ScriptableObject).IsAssignableFrom(prop.PropertyType)) { compItem.UpdateAsScriptObject(value as ScriptableObject); } else { compItem.target = (value as MonoBehaviour).gameObject; compItem.components = SortComponent(compItem.target); var types = Array.ConvertAll(compItem.components, x => x.type); compItem.componentID = Array.IndexOf(types, value.GetType()); } } } } ViewCoder coder = new ViewCoder(); coder.AnalysisBinding(component, components.ToArray(), rule); }
/// <summary> /// 异步从已经存在的脚本加载 /// </summary> /// <param name="prefab"></param> /// <param name="nameSpace"></param> /// <param name="onGet"></param> private static void LoadBindingScriptAsnyc(GameObject prefab, List <ComponentItem> components, Action <ViewCoder> onGet) { ChoiseAnReferenceMonobehiver(prefab, (x) => { ViewCoder coder = new ViewCoder(); coder.className = prefab.name + "_Internal"; coder.refClassName = prefab.name + "_Reference"; coder.nameSpace = Setting.defultNameSpace; coder.path = InitScriptPath(prefab, "_Internal"); var referenceItems = WorpReferenceItems(components); if (x != null) { var refClassType = x.GetType(); coder.nameSpace = refClassType.Namespace; coder.refClassName = refClassType.Name; var dataField = refClassType.GetField("m_data", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic); if (dataField != null) { coder.innerFields = dataField.FieldType.GetFields(BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance); } onGet(coder); } else { var script = BindingReferenceEditor.CreateScript(coder.nameSpace, coder.refClassName, referenceItems); var path = InitScriptPath(prefab, "_Reference"); System.IO.File.WriteAllText(path, script); var scriptType = typeof(BridgeUI.IUIPanelReference).Assembly.GetType(coder.nameSpace + "." + coder.refClassName); if (scriptType != null) { prefab.AddComponent(scriptType); } prefab.AddComponent <ReferenceCatchBehaiver>().SetReferenceItems(referenceItems); } onGet(coder); }); }
public NormalViewCoderExecuter(ViewCoder coder) : base(coder) { }
public BindingViewCoderExecuter(ViewCoder viewCoder) : base(viewCoder) { }
public ViewCoderExecuter(ViewCoder viewCoder) { this.viewCoder = viewCoder; }