DMLoadPagedLodFromFileManagerEditor.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEditor;
  4. using UnityEngine;
  5. using System.IO;
  6. using System.Threading;
  7. using UnityEditor.SceneManagement;
  8. namespace AIPagedLod
  9. {
  10. [CustomEditor(typeof(LoadPagedLodFromFileManager))]
  11. public class LoadPagedLodFromFileManagerEditor : Editor
  12. {
  13. LoadPagedLodFromFileManager mTarget;
  14. int mLoadedCount = 0;
  15. Thread mLoadThread = null;
  16. List<PagedLodFileLoader> mNeedPagedLodLoaderList = new List<PagedLodFileLoader>();
  17. List<string> mExistTile = new List<string>();
  18. bool mStopLoadFlag = false;
  19. bool mGenerateGameObjectFlag = false;
  20. public static bool mUpdateSceneUIFlag = false;
  21. void OnEnable()
  22. {
  23. PagedLodConfig.mInstance = Component.FindObjectOfType<PagedLodConfig>();
  24. mTarget = (LoadPagedLodFromFileManager)target;
  25. mTarget.mConfig.mStartLevel = LoadPagedLodFromFileManager.GetDataStartLevel(mTarget.mConfig.mDataPath);
  26. }
  27. private void OnDisable()
  28. {
  29. DisposeLoader();
  30. mUpdateSceneUIFlag = false;
  31. mGenerateGameObjectFlag = false;
  32. mStopLoadFlag = true;
  33. mLoadThread = null;
  34. }
  35. public override void OnInspectorGUI()
  36. {
  37. GUILayoutOption[] option1 = { GUILayout.Width(110) };
  38. EditorGUILayout.BeginHorizontal();
  39. EditorGUILayout.LabelField("IsUpdate", option1);
  40. mTarget.mConfig.mIsUpdate = EditorGUILayout.Toggle(mTarget.mConfig.mIsUpdate);
  41. EditorGUILayout.EndHorizontal();
  42. EditorGUILayout.BeginHorizontal();
  43. EditorGUILayout.LabelField("DataPath", option1);
  44. mTarget.mConfig.mDataPath = EditorGUILayout.TextField(mTarget.mConfig.mDataPath);
  45. EditorGUILayout.EndHorizontal();
  46. EditorGUILayout.BeginHorizontal();
  47. EditorGUILayout.LabelField("DataUrl", option1);
  48. mTarget.mConfig.mBaseUrl = EditorGUILayout.TextField(mTarget.mConfig.mBaseUrl);
  49. EditorGUILayout.EndHorizontal();
  50. EditorGUILayout.BeginHorizontal();
  51. EditorGUILayout.LabelField("DataName", option1);
  52. mTarget.mConfig.mDataName = EditorGUILayout.TextField(mTarget.mConfig.mDataName);
  53. EditorGUILayout.EndHorizontal();
  54. EditorGUILayout.BeginHorizontal();
  55. EditorGUILayout.LabelField("IsDJData", option1);
  56. mTarget.mConfig.mIsDaJiangData = EditorGUILayout.Toggle(mTarget.mConfig.mIsDaJiangData);
  57. EditorGUILayout.EndHorizontal();
  58. EditorGUILayout.BeginHorizontal();
  59. EditorGUILayout.LabelField("StartLevel", option1);
  60. EditorGUILayout.LabelField(mTarget.mConfig.mStartLevel.ToString());
  61. EditorGUILayout.EndHorizontal();
  62. EditorGUILayout.BeginHorizontal();
  63. mTarget.mConfig.mLoadStartLevelFlag = EditorGUILayout.ToggleLeft("StartLoadLevel:", mTarget.mConfig.mLoadStartLevelFlag, option1);
  64. mTarget.mConfig.mStartLoadLevel = EditorGUILayout.IntField(mTarget.mConfig.mStartLoadLevel, option1);
  65. EditorGUILayout.EndHorizontal();
  66. EditorGUILayout.BeginHorizontal();
  67. EditorGUILayout.LabelField("LoadTileCount", option1);
  68. mTarget.mConfig.mLoadPagedLodCount = EditorGUILayout.IntField(mTarget.mConfig.mLoadPagedLodCount);
  69. EditorGUILayout.EndHorizontal();
  70. EditorGUILayout.BeginHorizontal();
  71. EditorGUILayout.LabelField("IsGenerateCollider", option1);
  72. mTarget.mConfig.mIsGenerateCollider = EditorGUILayout.Toggle(mTarget.mConfig.mIsGenerateCollider);
  73. EditorGUILayout.EndHorizontal();
  74. EditorGUILayout.BeginHorizontal();
  75. EditorGUILayout.LabelField("TileCount ", option1);
  76. EditorGUILayout.LabelField(mTarget.transform.childCount.ToString());
  77. EditorGUILayout.EndHorizontal();
  78. if (mLoadThread != null)
  79. {
  80. if (GUILayout.Button("StopLoad(" + mNeedPagedLodLoaderList.Count + "/" + mLoadedCount + ")"))
  81. {
  82. mStopLoadFlag = true;
  83. }
  84. }
  85. else
  86. {
  87. if (GUILayout.Button("开始加载"))
  88. {
  89. LoadFromFile();
  90. }
  91. }
  92. if (GUILayout.Button("清除所有"))
  93. {
  94. List<GameObject> removeObjList = new List<GameObject>();
  95. for (int i = 0; i < mTarget.transform.childCount; ++i)
  96. {
  97. removeObjList.Add(mTarget.transform.GetChild(i).gameObject);
  98. }
  99. foreach (var obj in removeObjList)
  100. {
  101. GameObject.DestroyImmediate(obj);
  102. }
  103. }
  104. if (!Application.isPlaying)
  105. {
  106. EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
  107. }
  108. }
  109. private void OnSceneGUI()
  110. {
  111. if (mUpdateSceneUIFlag)
  112. {
  113. EditorUtility.SetDirty(mTarget);
  114. }
  115. if (mGenerateGameObjectFlag)
  116. {
  117. GenerateGameObject();
  118. }
  119. }
  120. void GenerateGameObject()
  121. {
  122. int loadedCount = 0;
  123. for (int i = 0; i < mNeedPagedLodLoaderList.Count; ++i)
  124. {
  125. PagedLodFileLoader loader = mNeedPagedLodLoaderList[i];
  126. if (loader.mIsFinished)
  127. {
  128. if (!loader.mIsLoaded)
  129. {
  130. loader.mIsLoaded = true;
  131. PagedLod pagedLod = LoadPagedLodFromFileManager.LoadPagedLod(loader, mTarget.transform);
  132. if (PagedLodConfig.mInstance.mTileDataType == TileDataType.OSGB)
  133. {
  134. pagedLod.LoadOsgbBasicInfo(loader);
  135. }
  136. else
  137. {
  138. pagedLod.LoadTileSetJsonFile();
  139. pagedLod.LoadB3dmBasicInfo(loader);
  140. }
  141. pagedLod.GetMeshRenders();
  142. pagedLod.mIsRootTile = true;
  143. if (mTarget.mConfig.mIsGenerateCollider)
  144. {
  145. LoadPagedLodFromFileManager.GenerateColliderObject(pagedLod);
  146. }
  147. loader.mLoadedEvent.Set();
  148. loadedCount++;
  149. }
  150. else
  151. {
  152. loadedCount++;
  153. }
  154. }
  155. }
  156. mLoadedCount = loadedCount;
  157. }
  158. public void LoadFromFile()
  159. {
  160. mExistTile.Clear();
  161. for (int i = 0; i < mTarget.transform.childCount; ++i)
  162. {
  163. mExistTile.Add(mTarget.transform.GetChild(i).name);
  164. }
  165. mLoadedCount = 0;
  166. mStopLoadFlag = false;
  167. mGenerateGameObjectFlag = false;
  168. mUpdateSceneUIFlag = true;
  169. mLoadThread = new Thread(LoadPagedLodData);
  170. mLoadThread.IsBackground = true;
  171. mLoadThread.Start();
  172. }
  173. public void LoadPagedLodData()
  174. {
  175. GetNeedLoadTiles();
  176. if (!mStopLoadFlag)
  177. {
  178. //bool的读写是原子操作,无需加锁判断
  179. mGenerateGameObjectFlag = true;
  180. }
  181. for (int i = 0; i < mNeedPagedLodLoaderList.Count; ++i)
  182. {
  183. if (mStopLoadFlag)
  184. {
  185. break;
  186. }
  187. mNeedPagedLodLoaderList[i].LoadObjectBasicInfo();
  188. mNeedPagedLodLoaderList[i].LoadObjectMeshInfo();
  189. mNeedPagedLodLoaderList[i].StartLoad();
  190. mNeedPagedLodLoaderList[i].mLoadedEvent.WaitOne();
  191. }
  192. DisposeLoader();
  193. mLoadThread = null;
  194. mUpdateSceneUIFlag = false;
  195. mGenerateGameObjectFlag = false;
  196. }
  197. void GetNeedLoadTiles()
  198. {
  199. mNeedPagedLodLoaderList.Clear();
  200. DirectoryInfo dataDir = new DirectoryInfo(mTarget.mConfig.mDataPath);
  201. int count = 0;
  202. List<DirectoryInfo> dirInfos = new List<DirectoryInfo>(dataDir.GetDirectories());
  203. for (int i = 0; i < dirInfos.Count; ++i)
  204. {
  205. DirectoryInfo tileDir = dirInfos[i];
  206. if (mStopLoadFlag)
  207. {
  208. break;
  209. }
  210. if (count < mTarget.mConfig.mLoadPagedLodCount)
  211. {
  212. if (!mExistTile.Contains(tileDir.Name))
  213. {
  214. if (!mTarget.mConfig.mLoadStartLevelFlag)
  215. {
  216. string fileName = tileDir.FullName + "/" + tileDir.Name + PagedLodConfig.mInstance.GetFileSufix();
  217. if (File.Exists(fileName))
  218. {
  219. FileInfo fileInfo = new FileInfo(fileName);
  220. PagedLodFileLoader pagedLodLoader = PagedLodFileLoader.GetPagedLodFileLoader(fileInfo, mTarget.mConfig.mStartLevel,
  221. tileDir.Name,mTarget.mConfig.mIsDaJiangData);
  222. mNeedPagedLodLoaderList.Add(pagedLodLoader);
  223. }
  224. else
  225. {
  226. Debug.Log("GetNeedLoadTiles file not exist: " + fileName);
  227. }
  228. }
  229. else
  230. {
  231. FileInfo[] fileInfos = tileDir.GetFiles("*" + PagedLodConfig.mInstance.GetFileSufix());
  232. bool isExist = false;
  233. for (int j = 0; j < fileInfos.Length; ++j)
  234. {
  235. FileInfo fileInfo = fileInfos[j];
  236. int level = LoadPagedLodFromFileManager.GetTileFileLevel(tileDir.Name, fileInfo.Name);
  237. if (level == mTarget.mConfig.mStartLoadLevel)
  238. {
  239. PagedLodFileLoader pagedLodLoader = PagedLodFileLoader.GetPagedLodFileLoader(fileInfo,level,tileDir.Name,
  240. mTarget.mConfig.mIsDaJiangData);
  241. mNeedPagedLodLoaderList.Add(pagedLodLoader);
  242. isExist = true;
  243. }
  244. if (level > mTarget.mConfig.mStartLoadLevel)
  245. {
  246. if(!isExist)
  247. {
  248. Debug.Log(tileDir.Name + " StartLevel " + mTarget.mConfig.mStartLoadLevel + " Not Exist File ");
  249. }
  250. break;
  251. }
  252. }
  253. }
  254. }
  255. }
  256. else
  257. {
  258. break;
  259. }
  260. count++;
  261. }
  262. }
  263. public void DisposeLoader()
  264. {
  265. for (int i = 0; i < mNeedPagedLodLoaderList.Count; ++i)
  266. {
  267. mNeedPagedLodLoaderList[i].Dispose();
  268. mNeedPagedLodLoaderList[i] = null;
  269. }
  270. mNeedPagedLodLoaderList.Clear();
  271. }
  272. }
  273. }