| 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();        }    }}
 |