static public void load(GameObject goRootp, SceneRootData sceneRootData) { GraphRoot GraphRoot = goRootp.AddComponent <GraphRoot>(); goRootp.transform.position = new Vector3(0, 0, 0); GraphRoot.initBySceneRootData(sceneRootData); }
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); }
/// <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); } } }
//加载 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"); }
/// <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 }
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"); }
/// <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 * }*/ }