using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; using System.IO; using System.Threading; using UnityEditor.SceneManagement; namespace AIPagedLod { [CustomEditor(typeof(LoadPagedLodFromFileManager))] public class LoadPagedLodFromFileManagerEditor : Editor { LoadPagedLodFromFileManager mTarget; int mLoadedCount = 0; Thread mLoadThread = null; List mNeedPagedLodLoaderList = new List(); List mExistTile = new List(); bool mStopLoadFlag = false; bool mGenerateGameObjectFlag = false; public static bool mUpdateSceneUIFlag = false; void OnEnable() { PagedLodConfig.mInstance = Component.FindObjectOfType(); mTarget = (LoadPagedLodFromFileManager)target; mTarget.mConfig.mStartLevel = LoadPagedLodFromFileManager.GetDataStartLevel(mTarget.mConfig.mDataPath); } private void OnDisable() { DisposeLoader(); mUpdateSceneUIFlag = false; mGenerateGameObjectFlag = false; mStopLoadFlag = true; mLoadThread = null; } public override void OnInspectorGUI() { GUILayoutOption[] option1 = { GUILayout.Width(110) }; EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("IsUpdate", option1); mTarget.mConfig.mIsUpdate = EditorGUILayout.Toggle(mTarget.mConfig.mIsUpdate); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("DataPath", option1); mTarget.mConfig.mDataPath = EditorGUILayout.TextField(mTarget.mConfig.mDataPath); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("DataUrl", option1); mTarget.mConfig.mBaseUrl = EditorGUILayout.TextField(mTarget.mConfig.mBaseUrl); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("DataName", option1); mTarget.mConfig.mDataName = EditorGUILayout.TextField(mTarget.mConfig.mDataName); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("IsDJData", option1); mTarget.mConfig.mIsDaJiangData = EditorGUILayout.Toggle(mTarget.mConfig.mIsDaJiangData); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("StartLevel", option1); EditorGUILayout.LabelField(mTarget.mConfig.mStartLevel.ToString()); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); mTarget.mConfig.mLoadStartLevelFlag = EditorGUILayout.ToggleLeft("StartLoadLevel:", mTarget.mConfig.mLoadStartLevelFlag, option1); mTarget.mConfig.mStartLoadLevel = EditorGUILayout.IntField(mTarget.mConfig.mStartLoadLevel, option1); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("LoadTileCount", option1); mTarget.mConfig.mLoadPagedLodCount = EditorGUILayout.IntField(mTarget.mConfig.mLoadPagedLodCount); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("IsGenerateCollider", option1); mTarget.mConfig.mIsGenerateCollider = EditorGUILayout.Toggle(mTarget.mConfig.mIsGenerateCollider); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("TileCount ", option1); EditorGUILayout.LabelField(mTarget.transform.childCount.ToString()); EditorGUILayout.EndHorizontal(); if (mLoadThread != null) { if (GUILayout.Button("StopLoad(" + mNeedPagedLodLoaderList.Count + "/" + mLoadedCount + ")")) { mStopLoadFlag = true; } } else { if (GUILayout.Button("开始加载")) { LoadFromFile(); } } if (GUILayout.Button("清除所有")) { List removeObjList = new List(); for (int i = 0; i < mTarget.transform.childCount; ++i) { removeObjList.Add(mTarget.transform.GetChild(i).gameObject); } foreach (var obj in removeObjList) { GameObject.DestroyImmediate(obj); } } if (!Application.isPlaying) { EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); } } private void OnSceneGUI() { if (mUpdateSceneUIFlag) { EditorUtility.SetDirty(mTarget); } if (mGenerateGameObjectFlag) { GenerateGameObject(); } } void GenerateGameObject() { int loadedCount = 0; for (int i = 0; i < mNeedPagedLodLoaderList.Count; ++i) { PagedLodFileLoader loader = mNeedPagedLodLoaderList[i]; if (loader.mIsFinished) { if (!loader.mIsLoaded) { loader.mIsLoaded = true; PagedLod pagedLod = LoadPagedLodFromFileManager.LoadPagedLod(loader, mTarget.transform); if (PagedLodConfig.mInstance.mTileDataType == TileDataType.OSGB) { pagedLod.LoadOsgbBasicInfo(loader); } else { pagedLod.LoadTileSetJsonFile(); pagedLod.LoadB3dmBasicInfo(loader); } pagedLod.GetMeshRenders(); pagedLod.mIsRootTile = true; if (mTarget.mConfig.mIsGenerateCollider) { LoadPagedLodFromFileManager.GenerateColliderObject(pagedLod); } loader.mLoadedEvent.Set(); loadedCount++; } else { loadedCount++; } } } mLoadedCount = loadedCount; } public void LoadFromFile() { mExistTile.Clear(); for (int i = 0; i < mTarget.transform.childCount; ++i) { mExistTile.Add(mTarget.transform.GetChild(i).name); } mLoadedCount = 0; mStopLoadFlag = false; mGenerateGameObjectFlag = false; mUpdateSceneUIFlag = true; mLoadThread = new Thread(LoadPagedLodData); mLoadThread.IsBackground = true; mLoadThread.Start(); } public void LoadPagedLodData() { GetNeedLoadTiles(); if (!mStopLoadFlag) { //bool的读写是原子操作,无需加锁判断 mGenerateGameObjectFlag = true; } for (int i = 0; i < mNeedPagedLodLoaderList.Count; ++i) { if (mStopLoadFlag) { break; } mNeedPagedLodLoaderList[i].LoadObjectBasicInfo(); mNeedPagedLodLoaderList[i].LoadObjectMeshInfo(); mNeedPagedLodLoaderList[i].StartLoad(); mNeedPagedLodLoaderList[i].mLoadedEvent.WaitOne(); } DisposeLoader(); mLoadThread = null; mUpdateSceneUIFlag = false; mGenerateGameObjectFlag = false; } void GetNeedLoadTiles() { mNeedPagedLodLoaderList.Clear(); DirectoryInfo dataDir = new DirectoryInfo(mTarget.mConfig.mDataPath); int count = 0; List dirInfos = new List(dataDir.GetDirectories()); for (int i = 0; i < dirInfos.Count; ++i) { DirectoryInfo tileDir = dirInfos[i]; if (mStopLoadFlag) { break; } if (count < mTarget.mConfig.mLoadPagedLodCount) { if (!mExistTile.Contains(tileDir.Name)) { if (!mTarget.mConfig.mLoadStartLevelFlag) { string fileName = tileDir.FullName + "/" + tileDir.Name + PagedLodConfig.mInstance.GetFileSufix(); if (File.Exists(fileName)) { FileInfo fileInfo = new FileInfo(fileName); PagedLodFileLoader pagedLodLoader = PagedLodFileLoader.GetPagedLodFileLoader(fileInfo, mTarget.mConfig.mStartLevel, tileDir.Name,mTarget.mConfig.mIsDaJiangData); mNeedPagedLodLoaderList.Add(pagedLodLoader); } else { Debug.Log("GetNeedLoadTiles file not exist: " + fileName); } } else { FileInfo[] fileInfos = tileDir.GetFiles("*" + PagedLodConfig.mInstance.GetFileSufix()); bool isExist = false; for (int j = 0; j < fileInfos.Length; ++j) { FileInfo fileInfo = fileInfos[j]; int level = LoadPagedLodFromFileManager.GetTileFileLevel(tileDir.Name, fileInfo.Name); if (level == mTarget.mConfig.mStartLoadLevel) { PagedLodFileLoader pagedLodLoader = PagedLodFileLoader.GetPagedLodFileLoader(fileInfo,level,tileDir.Name, mTarget.mConfig.mIsDaJiangData); mNeedPagedLodLoaderList.Add(pagedLodLoader); isExist = true; } if (level > mTarget.mConfig.mStartLoadLevel) { if(!isExist) { Debug.Log(tileDir.Name + " StartLevel " + mTarget.mConfig.mStartLoadLevel + " Not Exist File "); } break; } } } } } else { break; } count++; } } public void DisposeLoader() { for (int i = 0; i < mNeedPagedLodLoaderList.Count; ++i) { mNeedPagedLodLoaderList[i].Dispose(); mNeedPagedLodLoaderList[i] = null; } mNeedPagedLodLoaderList.Clear(); } } }