예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
            });
        }
예제 #3
0
 public NormalViewCoderExecuter(ViewCoder coder) : base(coder)
 {
 }
 public BindingViewCoderExecuter(ViewCoder viewCoder) : base(viewCoder)
 {
 }
 public ViewCoderExecuter(ViewCoder viewCoder)
 {
     this.viewCoder = viewCoder;
 }