protected override void DoExport()
        {
            EditorUtility.DisplayProgressBar("导出插件脚本", "", 0.0f);
            var           plugins            = ConfigManager.configEntry.unityPluginConfig.unityPlugins;
            List <string> allRecursiveAssets = new List <string>();

            int i   = 0;
            int len = plugins.Count;

            try {
                plugins
                .Where(p => p.enable).ToList()
                .ForEach(plugin => {
                    EditorUtility.DisplayProgressBar("处理插件", "", (float)i / len);
                    DirectoryInfo jsDir = null;
                    string pluginName   = plugin.pluginName;
                    if (plugin.pluginState == UnityPlugin.PluginState.convert && plugin.convertedPath.convertedJSPath != null && plugin.convertedPath.convertedJSPath != "")
                    {
                        jsDir = new DirectoryInfo(plugin.convertedPath.convertedJSPath);
                    }
                    else if (plugin.pluginState == UnityPlugin.PluginState.stub && plugin.stubPath.stubJSPath != null && plugin.stubPath.stubJSPath != "")
                    {
                        jsDir       = new DirectoryInfo(plugin.stubPath.stubJSPath);
                        pluginName += "-stub";
                    }

                    // 有文件就直接打包,没文件就转换
                    if (jsDir == null || !jsDir.Exists || jsDir.GetFiles() == null || jsDir.GetFiles().Length == 0)
                    {
                        BridgeExport.ExportPluginMenu(plugin);
                    }
                    PackFiles(pluginName, jsDir.FullName);
                    i++;
                });
            } catch (Exception e) {
                throw e;
            } finally {
                EditorUtility.ClearProgressBar();
            }

            Debug.Log("导出插件代码: " + i);
        }
        public override void OnModuleInit()
        {
            Debug.Log(this.ToString() + " install callback");

            // Build Directories
            var path  = Path.Combine(DirectoryStructure.TopRoot, "References~", "Bridge", "Bridge.dll");
            var exist = Precheck();

            if (!exist)
            {
                Debug.Log("Bridge resources not exist, download...");
                EditorUtility.DisplayProgressBar("Module Install", "下载模块所需资源", 0.0f);
                DownloadRes();
            }

            EditorUtility.DisplayProgressBar("Module Install", "初始化资源", 0.5f);
            BuildDirectories(exist);

            EditorUtility.DisplayProgressBar("Module Install", "清空临时文件", 0.9f);
            BridgeExport.RemoveProjectCodeDir();
            CleanTmpDirectory();

            EditorUtility.ClearProgressBar();
        }
Exemplo n.º 3
0
        protected override void DoExport()
        {
            var build = DirectoryBuilder.GetDirectory("build");
            // check cache
            var projectDir = new DirectoryInfo(build["Project"].FullPath);

            // Debug.Log(projectDir.GetFiles().Length);
            if (!projectDir.Exists || projectDir.GetFiles() == null || projectDir.GetFiles().Length <= 1)
            {
                BridgeExport.ExportCodeMenu();
            }

            // convert
            // BridgeExport.ExportCode();

            // EditorUtility.ClearProgressBar();
            // BridgeExport.isProcessing = false;
            EditorUtility.DisplayProgressBar("代码导出", "", 0.0f);

            var dirPath = BridgeExport.PROJECT_CODE_PATH;
            var files   = Directory.EnumerateFiles(dirPath, "*.js", SearchOption.AllDirectories).ToList();

            List <string> allRecursiveAssets = new List <string>();

            // all converted scripts
            var t = 0;

            foreach (var file in files)
            {
                // bridge plugin blacklist
                var name = Path.GetFileName(file);
                // Debug.Log(name);
                // 使用引擎插件不打包这几个文件,以节省代码包体积
                if (WXBridge.isWXBridgePlugin && (
                        name.Equals("minigame-adaptor-lib.js") ||
                        name.Equals("minigame-adaptor-lib.meta.js") ||
                        name.Equals("minigame-adaptor-lib-patch.js")))
                {
                    continue;
                }
                JSONObject metadata = new JSONObject(JSONObject.Type.OBJECT);
                metadata.AddField("version", 1);
                // string path = Path.GetFullPath(file).Replace(Path.Combine(Application.dataPath.Replace("Assets", ""), "__tmp_dist_script~"), "Assets");
                var    cutIndex = Path.GetFullPath(file).IndexOf(dirPath) + dirPath.Length + 1; //      +1 : '/'
                string path     = Path.GetFullPath(file).Substring(cutIndex).Replace('\\', '/');
                // Debug.Log(path);
                // Debug.Log(file + "===" + path);
                // Debug.Log(path);

                string content = File.ReadAllText(file);
                ExportStore.AddTextFile(path, content, WXUtility.GetMD5FromString(content));
                List <string> useFile = new List <string>();
                useFile.Add(path);
                ExportStore.AddResource(path, "script", null, useFile);
                allRecursiveAssets.Add(path);

                EditorUtility.DisplayProgressBar("代码导出", "", t++ / files.Count);
            }

            // var libs = Directory.EnumerateFiles(Path.Combine(bridgeRootPath, "lib"), "*.lib");
            var libs = Directory.EnumerateFiles(DirectoryBuilder.GetDirectory("references")["Adaptor"].FullPath, "*.lib");

            // Debug.Log(libs);
            foreach (var lib in libs)
            {
                var name = Path.GetFileName(lib);
                //  Debug.Log(name);

                // bridge plugin blacklist
                // 使用引擎插件的情况
                if (WXBridge.isWXBridgePlugin)
                {
                    // 如果使用了插件但是要用自己的adaptor.js,这个文件也要打包
                    if (!WXBridge.isWXBridgePluginAdaptor)
                    {
                        if (!name.Equals("minigame-adaptor-util.js.lib") && !name.Equals("minigame-adaptor-config.js.lib") && !name.Equals("minigame-adaptor.js.lib"))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (!name.Equals("minigame-adaptor-util.js.lib") && !name.Equals("minigame-adaptor-config.js.lib"))
                        {
                            continue;
                        }
                    }
                }

                JSONObject metadata = new JSONObject(JSONObject.Type.OBJECT);
                metadata.AddField("version", 1);
                string path = name.Substring(0, name.Length - 4);

                // 配置文件内容根据插件的配置来生成
                if (name.Equals("minigame-adaptor-config.js.lib"))
                {
                    // var content = String.Format("module.exports = {{\r\n    userMiniGameAdaptorPlugin:{0},\r\n    userMiniGameAdaptorJs:{1},\r\n    pluginAlias:'WXBridge'\r\n}}", WXBridge.isWXBridgePlugin ? 1 : 0, WXBridge.isWXBridgePluginAdaptor ? 1 : 0);
                    var content = ScriptExportHelper.ExportGameConfig();
                    ExportStore.AddTextFile(path, content, WXUtility.GetMD5FromString(content));
                }
                else
                {
                    string content = File.ReadAllText(lib);
                    ExportStore.AddTextFile(path, content, WXUtility.GetMD5FromString(content));
                }


                List <string> useFile = new List <string>();
                useFile.Add(path);
                ExportStore.AddResource(path, "script", null, useFile);
                allRecursiveAssets.Add(path);
            }

            // game config js
            // {
            //     JSONObject metadata = new JSONObject(JSONObject.Type.OBJECT);
            //     metadata.AddField("version", 1);
            //     string path = "Assets/bridge_game_config.js";

            //     JSONObject content = ScriptExportHelper.ExportSceneJson();
            //     WXExportStore.AddJSONFile(path, content, WXUtility.GetMD5FromString(content.ToString()));
            //     List<string> useFile = new List<string>();
            //     useFile.Add(path);
            //     WXExportStore.AddResource(path, "script", null, useFile);
            //     allRecursiveAssets.Add(path);
            // }

            //string savePath = Path.Combine(SAVE_BASE_PATH, "Scripts.mgepackage/");
            //JSONObject manifestRoot = new JSONObject(JSONObject.Type.OBJECT);
            //manifestRoot.AddField("resourceMeta", exportContext.writeResourcesTo(savePath, allRecursiveAssets));
            //wxFileUtil.SaveJsonFile(manifestRoot, savePath + "group.manifest.json");



            ExportStore.GenerateResourcePackage(
                "WXScripts",
                allRecursiveAssets
                );

            EditorUtility.ClearProgressBar();
            Debug.Log("导出工程代码: 1");
        }
        private static void IterateBridgeComponent(GameObject go, WXEntity obj, WXHierarchyContext context, ExportPreset preset)
        {
            if (preset.presetKey == "ngui-prefab" || preset.presetKey == "ngui-asset" || preset.presetKey == "ngui-prefabfolder" || preset.presetKey == "ngui-rootScene")
            {
                WXBridge.isNGUIPreset = true;
            }
            if (preset.presetKey == "ugui-prefab" || preset.presetKey == "ugui-asset" || preset.presetKey == "ugui-prefabfolder" || preset.presetKey == "ugui-rootScene")
            {
                WXBridge.isUGUIPreset = true;
            }

            var monoBehaviours = go.GetComponents <MonoBehaviour>();

            foreach (var behaviour in monoBehaviours)
            {
                // 处理用户脚本丢失的情况
                if (behaviour == null)
                {
                    continue;
                }
                // user's MonoBehaviour or not?
                if (!BridgeExport.GetDevTypesSet().Contains(behaviour.GetType()))
                {
                    continue;
                }
                if (WXMonoBehaviourExportHelper.IsInBlackList(behaviour.GetType()))
                {
                    continue;
                }

                obj.components.Add(context.AddComponent(new WXEngineMonoBehaviour(behaviour), behaviour));
            }

            // for a ngui-prefab, we don't need to export any other components
            if (WXBridge.isNGUIPreset)
            {
                return;
            }
            if (WXBridge.isUGUIPreset)
            {
                return;
            }

            /**
             * 下面的Component为adaptor对齐unity独有的组件
             * 需要根据对应类型新建一个对应的Component的class
             */

            // Colliders
            Collider[] colliders = go.GetComponents <Collider>();
            if (colliders != null && colliders.Length > 0)
            {
                foreach (var collider in colliders)
                {
                    if (collider is BoxCollider)
                    {
                        //obj.components.Add(context.AddComponent(new WXBoxCollider((BoxCollider)collider), collider));
                        obj.components.Add(context.AddComponent(new WXUnityComponent(collider), collider));
                    }
                    else if (collider is SphereCollider)
                    {
                        //obj.components.Add(context.AddComponent(new WXSphereCollider((SphereCollider)collider), collider));
                        obj.components.Add(context.AddComponent(new WXUnityComponent(collider), collider));
                    }
                    else if (collider is CapsuleCollider)
                    {
                        //obj.components.Add(context.AddComponent(new WXCapsuleCollider((CapsuleCollider)collider), collider));
                        obj.components.Add(context.AddComponent(new WXUnityComponent(collider), collider));
                    }
                    else if (collider is MeshCollider)
                    {
                        //obj.components.Add(context.AddComponent(new WXMeshCollider((MeshCollider)collider), collider));
                        obj.components.Add(context.AddComponent(new WXUnityComponent(collider), collider));
                    }
                }
            }

            // AudioSource(s)
            AudioSource[] audioSources = go.GetComponents <AudioSource>();
            if (audioSources != null && audioSources.Length > 0)
            {
                foreach (var audioSource in audioSources)
                {
                    obj.components.Add(context.AddComponent(new WXEngineAudioSource(audioSource), audioSource));
                }
            }

            Rigidbody rigidbody = go.GetComponent <Rigidbody>();

            if (rigidbody != null)
            {
                //obj.components.Add(context.AddComponent(new WXRigidbody(rigidbody), rigidbody));
                obj.components.Add(context.AddComponent(new WXUnityComponent(rigidbody), rigidbody));
            }


            /**
             * 下面的Component为adaptor对齐unity,但引擎也有类似Component的组件
             * 需要在WXUnityComponent中对应做处理,增加ref对象指向对应引擎对象
             */

            obj.components.Add(context.AddComponent(new WXUnityComponent(go.transform), go.transform));

            // Particle System
            ParticleSystem particle = go.GetComponent <ParticleSystem>();

            if (particle != null)
            {
                //Debug.Log("addComponentParticleSystem");
                obj.components.Add(context.AddComponent(new WXUnityComponent(particle), particle));
            }

            // Animator
            Animator animator = go.GetComponent <Animator>();

            if (animator != null)
            {
                obj.components.Add(context.AddComponent(new WXUnityComponent(animator), animator));
            }

            // Animation
            Animation animation = go.GetComponent <Animation>();

            if (animation != null)
            {
                obj.components.Add(context.AddComponent(new WXUnityComponent(animation), animation));
            }

            // Renderers
            Renderer renderer = go.GetComponent <Renderer>();

            if (renderer != null)
            {
                if (renderer is MeshRenderer)
                {
                    obj.components.Add(context.AddComponent(new WXUnityComponent((MeshRenderer)renderer), renderer));
                    // 由于引擎没有MeshFilter组件,这里强制在导出MeshRenderer的时候带上一个MeshFilter
                    obj.components.Add(context.AddComponent(new WXMeshFilter(), renderer));
                }
                else if (renderer is LineRenderer)
                {
                    obj.components.Add(context.AddComponent(new WXUnityComponent((LineRenderer)renderer), renderer));
                }
                else if (renderer is SkinnedMeshRenderer)
                {
                    obj.components.Add(context.AddComponent(new WXUnityComponent((SkinnedMeshRenderer)renderer), renderer));
                    obj.components.Add(context.AddComponent(new WXMeshFilter(), renderer));
                }
            }

            // Camera
            Camera camera = go.GetComponent <Camera>();

            if (camera != null)
            {
                obj.components.Add(context.AddComponent(new WXUnityComponent(camera), camera));
            }

            // Light
            Light light = go.GetComponent <Light>();

            if (light != null)
            {
                obj.components.Add(context.AddComponent(new WXUnityComponent(light), light));
            }
        }