Пример #1
0
        static public void load(GameObject goRootp, SceneRootData sceneRootData)
        {
            GraphRoot GraphRoot = goRootp.AddComponent <GraphRoot>();

            goRootp.transform.position = new Vector3(0, 0, 0);
            GraphRoot.initBySceneRootData(sceneRootData);
        }
Пример #2
0
        public static void Load()
        {
            //获取当前打开场景(path)
            string currSceneName = EditorApplication.currentScene;

            //获取当前打开场景名称
            currSceneName = currSceneName.Substring(currSceneName.LastIndexOf("/") + 1);
            currSceneName = currSceneName.Replace(".unity", "");
            SceneRootData sceneRootData = (SceneRootData)AssetDatabase.LoadAssetAtPath(string.Format("Assets/Resources/SceneRectData/SceneRectData_{0}.asset", currSceneName),
                                                                                       typeof(SceneRootData));

            GraphRoot.load(new GameObject("GraphLoadRoot"), sceneRootData);
        }
Пример #3
0
        /// <summary>
        /// 通过反序列化后的 SceneRootData 创建
        /// </summary>
        /// <param name="sceneRootData"></param>
        public void initBySceneRootData(SceneRootData sceneRootData)
        {
            isLoadBySceneRootData = true;

            this.sceneRootData = sceneRootData;

            x_Num = sceneRootData.xNum;
            z_Num = sceneRootData.zNum;

            tile_w = sceneRootData.tilex;
            tile_h = sceneRootData.tilez;
            //创建预制体模板
            initPrefab(sceneRootData);

            arr = new Graph[x_Num, z_Num];
            SceneRectData sceneRectData;
            Graph         tNode;

            for (int i = 0; i < sceneRootData.sceneRectDataArr.Length; i++)
            {
                sceneRectData = sceneRootData.sceneRectDataArr[i];
                tNode         = new Graph();
                tNode.root    = this;
                arr[sceneRectData.xIndex, sceneRectData.zIndex] = tNode;
                tNode.xIndex = sceneRectData.xIndex;
                tNode.zIndex = sceneRectData.zIndex;
                for (int j = 0; j < sceneRectData.sceneObjectDataArr.Length; j++)
                {
                    tNode.list.Add(sceneRectData.sceneObjectDataArr[j]);
                }
                tNode.create();
            }

            for (int x = 0; x < x_Num; x++)
            {
                for (int z = 0; z < z_Num; z++)
                {
                    arr[x, z].getTree(arr);
                }
            }
        }
Пример #4
0
        //加载 Scene
        IEnumerator LoadGameSceneAsync(string assetBundleName)
        {
            WWW download = new WWW(AppContentPath() + assetBundleName);

            yield return(download);

            assetBundle = download.assetBundle;
            string[] assetPaths = assetBundle.GetAllAssetNames();

            SceneRootData sceneRootData = assetBundle.LoadAsset <SceneRootData>(assetPaths[0]);

            string goName = assetBundlesPath;

            if (assetBundlesPath.LastIndexOf("/") > -1)
            {
                goName = assetBundlesPath.Substring(assetBundlesPath.LastIndexOf("/") + 1);
            }

            GraphRoot.load(new GameObject("GraphRoot_" + goName), sceneRootData);

            //perfabAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath +   "/" + "map001.prefab");
        }
Пример #5
0
        /// <summary>
        /// 重新绑定Prefab
        /// </summary>

        /*
         * static public void setPrefab()
         * {
         #if UNITY_EDITOR
         *  //获取当前打开场景(path)
         *  string currSceneName = EditorApplication.currentScene;
         *  //获取当前打开场景名称
         *  currSceneName = currSceneName.Substring(currSceneName.LastIndexOf("/") + 1);
         *  currSceneName = currSceneName.Replace(".unity", "");
         *
         *  string sceneRectDataAssetPath = string.Format("Assets/Resources/SceneRectData/SceneRectData_{0}.asset", currSceneName);
         *
         *  string[] files = System.IO.Directory.GetFiles(Application.dataPath + "/Resources/SceneRectData/");
         *
         *  for (int i = 0; i < files.Length; i++)
         *  {
         *      string file = files[i];
         *      if (file.EndsWith(".meta"))
         *      {
         *          continue;
         *      }
         *      if (file.IndexOf(currSceneName) < 0)
         *      {
         *          continue;
         *      }
         *
         *      file = file.Substring(file.LastIndexOf("/Assets/Resources/") + 1);
         *      sceneRectDataAssetPath = file;
         *
         *      SceneRootData sceneRootData = (SceneRootData)AssetDatabase.LoadAssetAtPath(sceneRectDataAssetPath,
         *                                     typeof(SceneRootData));
         *
         *      Dictionary<string, UnityEngine.Object> prefabNameDic = new Dictionary<string, UnityEngine.Object>();
         *
         *      foreach (SceneRectData sceneRectData in sceneRootData.sceneRectDataArr)
         *      {
         *          foreach (SceneObjectData sceneObjectData in sceneRectData.sceneObjectDataArr)
         *          {
         *              GameObject gameObject = GameObject.Find(sceneObjectData.gameObjectPath);
         *              if (gameObject == null)
         *              {
         *                  EditorUtility.DisplayDialog("error", "无效路径=>" + sceneObjectData.gameObjectPath, "ok");
         *                  return;
         *              }
         *              if (PrefabUtility.GetPrefabType(gameObject) == PrefabType.PrefabInstance)
         *              {
         *                  UnityEngine.Object parentObject = EditorUtility.GetPrefabParent(gameObject);
         *                  string assetPath = AssetDatabase.GetAssetPath(parentObject);
         *                  //直接设置数据会更新到 Assets 文件
         *                  sceneObjectData.prefabName = assetPath;
         *
         *                  if (!prefabNameDic.ContainsKey(assetPath))
         *                  {
         *                      //GameObject prefabGo = null;
         *                      //prefabNameDic.TryGetValue(assetPath, out prefabGo);
         *                      prefabNameDic.Add(assetPath, parentObject);
         *                  }
         *                  Debug.LogWarning(gameObject + "  =  " + assetPath + "," + gameObject.GetInstanceID());
         *              }
         *              else
         *              {
         *
         *              }
         *          }
         *      }
         *
         *      sceneRootData.prefabPathArr = new string[prefabNameDic.Keys.Count];
         *      prefabNameDic.Keys.CopyTo(sceneRootData.prefabPathArr, 0);
         *
         *      sceneRootData.prefabAssetBundleNameArr = new string[prefabNameDic.Keys.Count];
         *      //设置依赖 prefab 打包
         *      for (int j = 0; j < sceneRootData.prefabPathArr.Length; j++)
         *      {
         *          //设置打包路径
         *          AssetImporter assetImporter = AssetImporter.GetAtPath(sceneRootData.prefabPathArr[j]);
         *          assetImporter.assetBundleName = currSceneName + ".prefab";
         *
         *          sceneRootData.prefabAssetBundleNameArr[j] = assetImporter.assetBundleName;
         *
         *          //GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath(sceneRootData.prefabPathArr[i], typeof(GameObject));
         *          //GameObject prefabGameObject = GameObject.Instantiate<GameObject>(prefab);
         *          //prefabGameObject.transform.parent = prefabRoot.transform;
         *          //prefabNameDic.Add(sceneRootData.prefabPathArr[i], prefabGameObject);
         *
         *      }
         *  }
         *  //不需要删除后重新创建!!! LoadAssetAtPath 加载数据后【赋值】【直接更新】到 asset 文件!!
         *  //AssetDatabase.DeleteAsset(sceneRectDataAssetPath);
         *  //AssetDatabase.CreateAsset(sceneRootData, string.Format("Assets/Resources/SceneRectData/SceneRectData_{0}.asset", currSceneName));
         *  }
         #endif
         *
         * }
         */
        /// <summary>
        /// 保存场景数据到 序列化对象 SceneRootData 中
        /// 由工具链调用
        /// </summary>
        static public void save()
        {
            GraphRoot graphRoot = GameObject.FindObjectOfType <GraphRoot>();

            if (graphRoot == null)
            {
#if UNITY_EDITOR
                EditorUtility.DisplayDialog("error", " 场景没有 Root 请先执行 build 操作 ", "ok!");
#endif
                return;
            }

            SceneRootData sceneRootData = new SceneRootData();

            int xNum = graphRoot.x_Num;
            int zNum = graphRoot.z_Num;

            sceneRootData.xNum  = xNum;
            sceneRootData.zNum  = zNum;
            sceneRootData.tilex = graphRoot.tile_w;
            sceneRootData.tilez = graphRoot.tile_h;

            sceneRootData.sceneRectDataArr = new SceneRectData[graphRoot.transform.GetChildCount()];

            int index = 0;

            for (int x = 0; x < xNum; x++)
            {
                for (int z = 0; z < zNum; z++)
                {
                    Graph         t             = graphRoot.arr[x, z];
                    SceneRectData sceneRectData = new SceneRectData();
                    sceneRectData.xIndex             = x;
                    sceneRectData.zIndex             = z;
                    sceneRectData.sceneObjectDataArr = t.list.ToArray();

                    sceneRootData.sceneRectDataArr[index++] = sceneRectData;
                }
            }

            sceneRootData.prefabPathArr = new string[graphRoot.prefabNameDic.Keys.Count];
            graphRoot.prefabNameDic.Keys.CopyTo(sceneRootData.prefabPathArr, 0);

#if UNITY_EDITOR
            //获取当前打开场景(path)
            string currSceneName = EditorApplication.currentScene;
            //获取当前打开场景名称
            currSceneName = currSceneName.Substring(currSceneName.LastIndexOf("/") + 1);
            currSceneName = currSceneName.Replace(".unity", "");
            //string resourcesPath = Application.dataPath + string.Format("/Resources/SceneRectData_{0}", currSceneName);
            string resourcesPath = Application.dataPath + "/Resources/SceneRectData";
            if (!Directory.Exists(resourcesPath))
            {
                System.IO.Directory.CreateDirectory(resourcesPath);
            }
            //AssetDatabase.CreateAsset(sceneRootData, string.Format("Assets/Resources/SceneRectData/SceneRectData_{0}.asset", currSceneName));
            string colliderLayerStr = Convert.ToString(graphRoot.layer.value, 2);
            string layerStr         = string.Empty;
            char[] charArr          = colliderLayerStr.ToCharArray();
            Array.Reverse(charArr);

            for (int i = 0; i < colliderLayerStr.Length; i++)
            {
                char c        = charArr[i];
                int  layerInt = int.Parse(c.ToString());
                if (layerInt == 1)
                {
                    layerStr += LayerMask.LayerToName(i) + "_";
                }
            }
            AssetDatabase.CreateAsset(sceneRootData, string.Format("Assets/Resources/SceneRectData/SceneRectData_{0}_{1}.asset", currSceneName, layerStr));
            //AssetDatabase.CreateAsset(sceneRootData, string.Format("Assets/Resources/SceneRectData/SceneRectData_{0}_{1}.asset" , currSceneName, colliderLayerStr));
#endif
        }
Пример #6
0
        static public void setPrefabByDataAsset(string sceneRectDataAssetPath, string[] prefabSearchPathArr, bool isSetPrefabAbPath = false)
        {
            if (sceneRectDataAssetPath.StartsWith("Assets/"))
            {
                Debug.LogWarningFormat("sceneRectDataAssetPath 完整路径=>{0} ", sceneRectDataAssetPath);
            }
            else
            {
                sceneRectDataAssetPath = string.Format("Assets/Resources/SceneRectData/{0}", sceneRectDataAssetPath);
            }
            if (sceneRectDataAssetPath.EndsWith(".asset"))
            {
                Debug.LogWarningFormat("sceneRectDataAssetPath 完整后缀=>{0} ", sceneRectDataAssetPath);
            }
            else
            {
                sceneRectDataAssetPath += ".asset";
            }

            Debug.LogWarningFormat("sceneRectDataAssetPath 读取路径=>{0} ", sceneRectDataAssetPath);

            string sceneRectDataAssetFileName = sceneRectDataAssetPath;

            //获取当前打开场景名称
            sceneRectDataAssetFileName = sceneRectDataAssetFileName.Substring(sceneRectDataAssetFileName.LastIndexOf("/") + 1);
            sceneRectDataAssetFileName = sceneRectDataAssetFileName.Replace(".asset", "");

            SceneRootData sceneRootData = (SceneRootData)AssetDatabase.LoadAssetAtPath(sceneRectDataAssetPath,
                                                                                       typeof(SceneRootData));

            Dictionary <string, UnityEngine.Object> prefabNameDic = new Dictionary <string, UnityEngine.Object>();

            Dictionary <string, string> prefabPathDic = new Dictionary <string, string>();

            for (int i = 0; i < prefabSearchPathArr.Length; i++)
            {
                string prefabSearchPath = prefabSearchPathArr[i];
                if (prefabSearchPath.StartsWith("Assets/"))
                {
                    prefabSearchPath = prefabSearchPath.Replace("Assets/", "");
                }

                string[] files = System.IO.Directory.GetFiles(Application.dataPath + (prefabSearchPath.StartsWith("/")?"":"/") + prefabSearchPathArr[i]);

                for (int j = 0; j < files.Length; j++)
                {
                    string file = files[j];

                    file = file.Replace("\\", "/");

                    if (file.EndsWith(".prefab"))
                    {
                        string prefabNameKey = file.Substring(file.LastIndexOf("/") + 1,
                                                              file.LastIndexOf(".") - (file.LastIndexOf("/") + 1));
                        string prefabPath = file.Replace(Application.dataPath, "Assets");
                        //prefabPath += file.Substring( file.LastIndexOf("/") + 1);
                        if (prefabPathDic.ContainsKey(prefabNameKey))
                        {
                            Debug.LogWarningFormat("已经存在! prefab {0} => file {1}", prefabNameKey, files[j]);
                        }
                        else
                        {
                            prefabPathDic.Add(prefabNameKey, prefabPath);
                        }
                    }
                }
            }

            foreach (SceneRectData sceneRectData in sceneRootData.sceneRectDataArr)
            {
                foreach (SceneObjectData sceneObjectData in sceneRectData.sceneObjectDataArr)
                {
                    //检查物件是否存在
                    GameObject gameObject = GameObject.Find(sceneObjectData.gameObjectPath);
                    if (gameObject == null)
                    {
                        //EditorUtility.DisplayDialog("error", "无效路径=>" + sceneObjectData.gameObjectPath, "ok");
                        Debug.LogErrorFormat("无效路径 => {0}", sceneObjectData.gameObjectPath);
                        continue;
                    }
                    //是个完整关联 Prefab
                    if (PrefabUtility.GetPrefabType(gameObject) == PrefabType.PrefabInstance)
                    {
                        UnityEngine.Object parentObject = EditorUtility.GetPrefabParent(gameObject);
                        string             assetPath    = AssetDatabase.GetAssetPath(parentObject);
                        //直接设置数据会更新到 Assets 文件
                        sceneObjectData.prefabName = assetPath;

                        if (!prefabNameDic.ContainsKey(assetPath))
                        {
                            //GameObject prefabGo = null;
                            //prefabNameDic.TryGetValue(assetPath, out prefabGo);
                            prefabNameDic.Add(assetPath, parentObject);
                        }
                        Debug.LogWarning(gameObject + "  =  " + assetPath + "," + gameObject.GetInstanceID());
                    }
                    else
                    {
                        string gameObjectPath;

                        if (sceneObjectData.gameObjectPath.LastIndexOf("(") > sceneObjectData.gameObjectPath.LastIndexOf("/") &&
                            sceneObjectData.gameObjectPath.LastIndexOf(")") + 1 == sceneObjectData.gameObjectPath.Length)
                        {
                            gameObjectPath = sceneObjectData.gameObjectPath.Substring(sceneObjectData.gameObjectPath.LastIndexOf("/") + 1);
                            gameObjectPath = gameObjectPath.Substring(0, gameObjectPath.IndexOf("("));
                            gameObjectPath = gameObjectPath.Trim();
                        }
                        else
                        {
                            gameObjectPath = sceneObjectData.gameObjectPath.Substring(sceneObjectData.gameObjectPath.LastIndexOf("/") + 1);
                        }

                        if (prefabPathDic.ContainsKey(gameObjectPath))
                        {
                            sceneObjectData.prefabName = prefabPathDic[gameObjectPath];
                            Debug.LogWarning(gameObject + "  =  " + prefabPathDic[gameObjectPath] + "," + gameObject.GetInstanceID());
                        }
                        else
                        {
                            Debug.LogErrorFormat("{0} 没有找到对应的 prefab", gameObjectPath);
                        }
                        //if (prefabPathDic.ContainsKey(gameObjectPath))
                    }
                    // string gameObjectPath;
                }
            }

            string[] prefabNameDicArr = new string[prefabNameDic.Keys.Count];
            prefabNameDic.Keys.CopyTo(prefabNameDicArr, 0);

            string[] prefabPathDicArr = new string[prefabPathDic.Values.Count];
            prefabPathDic.Values.CopyTo(prefabPathDicArr, 0);

            sceneRootData.prefabPathArr = ArrTools.MergerArray(prefabNameDicArr, prefabPathDicArr);

            sceneRootData.prefabAssetBundleNameArr = new string[sceneRootData.prefabPathArr.Length];
            //设置依赖 prefab 打包
            for (int j = 0; j < sceneRootData.prefabPathArr.Length; j++)
            {
                //设置打包路径
                AssetImporter assetImporter = AssetImporter.GetAtPath(sceneRootData.prefabPathArr[j]);
                //在prefab没有设置打包路径的情况下才设置 打包ab名
                if (isSetPrefabAbPath || assetImporter.assetBundleName != null && assetImporter.assetBundleName.Equals(string.Empty))
                {
                    assetImporter.assetBundleName = sceneRectDataAssetFileName + ".prefab";
                }

                sceneRootData.prefabAssetBundleNameArr[j] = assetImporter.assetBundleName;

                /*
                 * GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath(sceneRootData.prefabPathArr[i], typeof(GameObject));
                 * GameObject prefabGameObject = GameObject.Instantiate<GameObject>(prefab);
                 * prefabGameObject.transform.parent = prefabRoot.transform;
                 *
                 * prefabNameDic.Add(sceneRootData.prefabPathArr[i], prefabGameObject);
                 */
            }

            EditorUtility.DisplayDialog("LOG", "prefab 设置完成 " + sceneRectDataAssetPath, "ok");
        }
Пример #7
0
        /// <summary>
        /// 创建 Prefab 模板池
        /// </summary>
        /// <param name="sceneRootData"></param>
        public void initPrefab(SceneRootData sceneRootData)
        {
            GameObject prefabRoot = new GameObject("PrefabRoot");

            prefabRoot.transform.parent = this.transform;

            /*
             *  sceneRootData.prefabPathArr.Length = sceneRootData.prefabAssetBundleNameArr.Length
             */

            //加载光照贴图

            /*
             *
             * 数组 prefabPathArr  <- index -> 数组 prefabAssetBundleNameArr
             * prefab路径 下标相对应 AssetBundle路径
             */
            for (int i = 0; i < sceneRootData.prefabPathArr.Length; i++)
            {
                AssetBundle assetBundle = null;
                assetBundleDic.TryGetValue(sceneRootData.prefabAssetBundleNameArr[i], out assetBundle);
                if (assetBundle == null)
                {
                    assetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + sceneRootData.prefabAssetBundleNameArr[i]);
                    assetBundleDic.Add(sceneRootData.prefabAssetBundleNameArr[i], assetBundle);
                }

                //string[] allAssetNames = assetBundle.GetAllAssetNames();
                if (!prefabNameDic.ContainsKey(sceneRootData.prefabPathArr[i]))
                {
                    GameObject prefab = null;
                    if (assetBundle != null)
                    {
                        prefab = assetBundle.LoadAsset <GameObject>(sceneRootData.prefabPathArr[i]);
                    }
#if UNITY_EDITOR
                    if (prefab == null)
                    {
                        prefab = (GameObject)AssetDatabase.LoadAssetAtPath(sceneRootData.prefabPathArr[i], typeof(GameObject));
                    }
#endif

                    GameObject prefabGameObject = GameObject.Instantiate <GameObject>(prefab);
                    prefabGameObject.SetActive(false);
                    prefabGameObject.transform.parent = prefabRoot.transform;

                    prefabNameDic.Add(sceneRootData.prefabPathArr[i], prefabGameObject);
                }
            }

            /*
             * for (int i = 0; i < sceneRootData.prefabPathArr.Length; i++)
             * {
             #if UNITY_EDITOR
             *  GameObject prefab = (GameObject)AssetDatabase.LoadAssetAtPath(sceneRootData.prefabPathArr[i],typeof(GameObject));
             *  GameObject prefabGameObject = GameObject.Instantiate<GameObject>(prefab);
             *  prefabGameObject.transform.parent = prefabRoot.transform;
             *
             *  prefabNameDic.Add(sceneRootData.prefabPathArr[i], prefabGameObject);
             #endif
             * }*/
        }