123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- 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<PagedLodFileLoader> mNeedPagedLodLoaderList = new List<PagedLodFileLoader>();
- List<string> mExistTile = new List<string>();
- bool mStopLoadFlag = false;
- bool mGenerateGameObjectFlag = false;
- public static bool mUpdateSceneUIFlag = false;
- void OnEnable()
- {
- PagedLodConfig.mInstance = Component.FindObjectOfType<PagedLodConfig>();
- 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<GameObject> removeObjList = new List<GameObject>();
- 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<DirectoryInfo> dirInfos = new List<DirectoryInfo>(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();
- }
- }
- }
|