123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- //------------------------------------------------------------
- // Game Framework
- // Copyright © 2013-2021 loyalsoft. All rights reserved.
- // Homepage: http://www.game7000.com/
- // Feedback: http://www.game7000.com/
- //------------------------------------------------------------
- using GameFramework.Resource;
- using System;
- using System.Collections.Generic;
- namespace GameFramework.Scene
- {
- /// <summary>
- /// 场景管理器。
- /// </summary>
- internal sealed class SceneManager : GameFrameworkModule, ISceneManager
- {
- private readonly List<string> m_LoadedSceneAssetNames;
- private readonly List<string> m_LoadingSceneAssetNames;
- private readonly List<string> m_UnloadingSceneAssetNames;
- private readonly LoadSceneCallbacks m_LoadSceneCallbacks;
- private readonly UnloadSceneCallbacks m_UnloadSceneCallbacks;
- private IResourceManager m_ResourceManager;
- private EventHandler<LoadSceneSuccessEventArgs> m_LoadSceneSuccessEventHandler;
- private EventHandler<LoadSceneFailureEventArgs> m_LoadSceneFailureEventHandler;
- private EventHandler<LoadSceneUpdateEventArgs> m_LoadSceneUpdateEventHandler;
- private EventHandler<LoadSceneDependencyAssetEventArgs> m_LoadSceneDependencyAssetEventHandler;
- private EventHandler<UnloadSceneSuccessEventArgs> m_UnloadSceneSuccessEventHandler;
- private EventHandler<UnloadSceneFailureEventArgs> m_UnloadSceneFailureEventHandler;
- /// <summary>
- /// 初始化场景管理器的新实例。
- /// </summary>
- public SceneManager()
- {
- m_LoadedSceneAssetNames = new List<string>();
- m_LoadingSceneAssetNames = new List<string>();
- m_UnloadingSceneAssetNames = new List<string>();
- m_LoadSceneCallbacks = new LoadSceneCallbacks(LoadSceneSuccessCallback, LoadSceneFailureCallback, LoadSceneUpdateCallback, LoadSceneDependencyAssetCallback);
- m_UnloadSceneCallbacks = new UnloadSceneCallbacks(UnloadSceneSuccessCallback, UnloadSceneFailureCallback);
- m_ResourceManager = null;
- m_LoadSceneSuccessEventHandler = null;
- m_LoadSceneFailureEventHandler = null;
- m_LoadSceneUpdateEventHandler = null;
- m_LoadSceneDependencyAssetEventHandler = null;
- m_UnloadSceneSuccessEventHandler = null;
- m_UnloadSceneFailureEventHandler = null;
- }
- /// <summary>
- /// 获取游戏框架模块优先级。
- /// </summary>
- /// <remarks>优先级较高的模块会优先轮询,并且关闭操作会后进行。</remarks>
- internal override int Priority
- {
- get
- {
- return 2;
- }
- }
- /// <summary>
- /// 加载场景成功事件。
- /// </summary>
- public event EventHandler<LoadSceneSuccessEventArgs> LoadSceneSuccess
- {
- add
- {
- m_LoadSceneSuccessEventHandler += value;
- }
- remove
- {
- m_LoadSceneSuccessEventHandler -= value;
- }
- }
- /// <summary>
- /// 加载场景失败事件。
- /// </summary>
- public event EventHandler<LoadSceneFailureEventArgs> LoadSceneFailure
- {
- add
- {
- m_LoadSceneFailureEventHandler += value;
- }
- remove
- {
- m_LoadSceneFailureEventHandler -= value;
- }
- }
- /// <summary>
- /// 加载场景更新事件。
- /// </summary>
- public event EventHandler<LoadSceneUpdateEventArgs> LoadSceneUpdate
- {
- add
- {
- m_LoadSceneUpdateEventHandler += value;
- }
- remove
- {
- m_LoadSceneUpdateEventHandler -= value;
- }
- }
- /// <summary>
- /// 加载场景时加载依赖资源事件。
- /// </summary>
- public event EventHandler<LoadSceneDependencyAssetEventArgs> LoadSceneDependencyAsset
- {
- add
- {
- m_LoadSceneDependencyAssetEventHandler += value;
- }
- remove
- {
- m_LoadSceneDependencyAssetEventHandler -= value;
- }
- }
- /// <summary>
- /// 卸载场景成功事件。
- /// </summary>
- public event EventHandler<UnloadSceneSuccessEventArgs> UnloadSceneSuccess
- {
- add
- {
- m_UnloadSceneSuccessEventHandler += value;
- }
- remove
- {
- m_UnloadSceneSuccessEventHandler -= value;
- }
- }
- /// <summary>
- /// 卸载场景失败事件。
- /// </summary>
- public event EventHandler<UnloadSceneFailureEventArgs> UnloadSceneFailure
- {
- add
- {
- m_UnloadSceneFailureEventHandler += value;
- }
- remove
- {
- m_UnloadSceneFailureEventHandler -= value;
- }
- }
- /// <summary>
- /// 场景管理器轮询。
- /// </summary>
- /// <param name="elapseSeconds">逻辑流逝时间,以秒为单位。</param>
- /// <param name="realElapseSeconds">真实流逝时间,以秒为单位。</param>
- internal override void Update(float elapseSeconds, float realElapseSeconds)
- {
- }
- /// <summary>
- /// 关闭并清理场景管理器。
- /// </summary>
- internal override void Shutdown()
- {
- string[] loadedSceneAssetNames = m_LoadedSceneAssetNames.ToArray();
- foreach (string loadedSceneAssetName in loadedSceneAssetNames)
- {
- if (SceneIsUnloading(loadedSceneAssetName))
- {
- continue;
- }
- UnloadScene(loadedSceneAssetName);
- }
- m_LoadedSceneAssetNames.Clear();
- m_LoadingSceneAssetNames.Clear();
- m_UnloadingSceneAssetNames.Clear();
- }
- /// <summary>
- /// 设置资源管理器。
- /// </summary>
- /// <param name="resourceManager">资源管理器。</param>
- public void SetResourceManager(IResourceManager resourceManager)
- {
- if (resourceManager == null)
- {
- throw new GameFrameworkException("Resource manager is invalid.");
- }
- m_ResourceManager = resourceManager;
- }
- /// <summary>
- /// 获取场景是否已加载。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <returns>场景是否已加载。</returns>
- public bool SceneIsLoaded(string sceneAssetName)
- {
- if (string.IsNullOrEmpty(sceneAssetName))
- {
- throw new GameFrameworkException("Scene asset name is invalid.");
- }
- return m_LoadedSceneAssetNames.Contains(sceneAssetName);
- }
- /// <summary>
- /// 获取已加载场景的资源名称。
- /// </summary>
- /// <returns>已加载场景的资源名称。</returns>
- public string[] GetLoadedSceneAssetNames()
- {
- return m_LoadedSceneAssetNames.ToArray();
- }
- /// <summary>
- /// 获取已加载场景的资源名称。
- /// </summary>
- /// <param name="results">已加载场景的资源名称。</param>
- public void GetLoadedSceneAssetNames(List<string> results)
- {
- if (results == null)
- {
- throw new GameFrameworkException("Results is invalid.");
- }
- results.Clear();
- results.AddRange(m_LoadedSceneAssetNames);
- }
- /// <summary>
- /// 获取场景是否正在加载。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <returns>场景是否正在加载。</returns>
- public bool SceneIsLoading(string sceneAssetName)
- {
- if (string.IsNullOrEmpty(sceneAssetName))
- {
- throw new GameFrameworkException("Scene asset name is invalid.");
- }
- return m_LoadingSceneAssetNames.Contains(sceneAssetName);
- }
- /// <summary>
- /// 获取正在加载场景的资源名称。
- /// </summary>
- /// <returns>正在加载场景的资源名称。</returns>
- public string[] GetLoadingSceneAssetNames()
- {
- return m_LoadingSceneAssetNames.ToArray();
- }
- /// <summary>
- /// 获取正在加载场景的资源名称。
- /// </summary>
- /// <param name="results">正在加载场景的资源名称。</param>
- public void GetLoadingSceneAssetNames(List<string> results)
- {
- if (results == null)
- {
- throw new GameFrameworkException("Results is invalid.");
- }
- results.Clear();
- results.AddRange(m_LoadingSceneAssetNames);
- }
- /// <summary>
- /// 获取场景是否正在卸载。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <returns>场景是否正在卸载。</returns>
- public bool SceneIsUnloading(string sceneAssetName)
- {
- if (string.IsNullOrEmpty(sceneAssetName))
- {
- throw new GameFrameworkException("Scene asset name is invalid.");
- }
- return m_UnloadingSceneAssetNames.Contains(sceneAssetName);
- }
- /// <summary>
- /// 获取正在卸载场景的资源名称。
- /// </summary>
- /// <returns>正在卸载场景的资源名称。</returns>
- public string[] GetUnloadingSceneAssetNames()
- {
- return m_UnloadingSceneAssetNames.ToArray();
- }
- /// <summary>
- /// 获取正在卸载场景的资源名称。
- /// </summary>
- /// <param name="results">正在卸载场景的资源名称。</param>
- public void GetUnloadingSceneAssetNames(List<string> results)
- {
- if (results == null)
- {
- throw new GameFrameworkException("Results is invalid.");
- }
- results.Clear();
- results.AddRange(m_UnloadingSceneAssetNames);
- }
- /// <summary>
- /// 检查场景资源是否存在。
- /// </summary>
- /// <param name="sceneAssetName">要检查场景资源的名称。</param>
- /// <returns>场景资源是否存在。</returns>
- public bool HasScene(string sceneAssetName)
- {
- return m_ResourceManager.HasAsset(sceneAssetName) != HasAssetResult.NotExist;
- }
- /// <summary>
- /// 加载场景。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- public void LoadScene(string sceneAssetName)
- {
- LoadScene(sceneAssetName, Constant.DefaultPriority, null);
- }
- /// <summary>
- /// 加载场景。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <param name="priority">加载场景资源的优先级。</param>
- public void LoadScene(string sceneAssetName, int priority)
- {
- LoadScene(sceneAssetName, priority, null);
- }
- /// <summary>
- /// 加载场景。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <param name="userData">用户自定义数据。</param>
- public void LoadScene(string sceneAssetName, object userData)
- {
- LoadScene(sceneAssetName, Constant.DefaultPriority, userData);
- }
- /// <summary>
- /// 加载场景。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <param name="priority">加载场景资源的优先级。</param>
- /// <param name="userData">用户自定义数据。</param>
- public void LoadScene(string sceneAssetName, int priority, object userData)
- {
- if (string.IsNullOrEmpty(sceneAssetName))
- {
- throw new GameFrameworkException("Scene asset name is invalid.");
- }
- if (m_ResourceManager == null)
- {
- throw new GameFrameworkException("You must set resource manager first.");
- }
- if (SceneIsUnloading(sceneAssetName))
- {
- throw new GameFrameworkException(Utility.Text.Format("Scene asset '{0}' is being unloaded.", sceneAssetName));
- }
- if (SceneIsLoading(sceneAssetName))
- {
- throw new GameFrameworkException(Utility.Text.Format("Scene asset '{0}' is being loaded.", sceneAssetName));
- }
- if (SceneIsLoaded(sceneAssetName))
- {
- throw new GameFrameworkException(Utility.Text.Format("Scene asset '{0}' is already loaded.", sceneAssetName));
- }
- m_LoadingSceneAssetNames.Add(sceneAssetName);
- m_ResourceManager.LoadScene(sceneAssetName, priority, m_LoadSceneCallbacks, userData);
- }
- /// <summary>
- /// 卸载场景。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- public void UnloadScene(string sceneAssetName)
- {
- UnloadScene(sceneAssetName, null);
- }
- /// <summary>
- /// 卸载场景。
- /// </summary>
- /// <param name="sceneAssetName">场景资源名称。</param>
- /// <param name="userData">用户自定义数据。</param>
- public void UnloadScene(string sceneAssetName, object userData)
- {
- if (string.IsNullOrEmpty(sceneAssetName))
- {
- throw new GameFrameworkException("Scene asset name is invalid.");
- }
- if (m_ResourceManager == null)
- {
- throw new GameFrameworkException("You must set resource manager first.");
- }
- if (SceneIsUnloading(sceneAssetName))
- {
- throw new GameFrameworkException(Utility.Text.Format("Scene asset '{0}' is being unloaded.", sceneAssetName));
- }
- if (SceneIsLoading(sceneAssetName))
- {
- throw new GameFrameworkException(Utility.Text.Format("Scene asset '{0}' is being loaded.", sceneAssetName));
- }
- if (!SceneIsLoaded(sceneAssetName))
- {
- throw new GameFrameworkException(Utility.Text.Format("Scene asset '{0}' is not loaded yet.", sceneAssetName));
- }
- m_UnloadingSceneAssetNames.Add(sceneAssetName);
- m_ResourceManager.UnloadScene(sceneAssetName, m_UnloadSceneCallbacks, userData);
- }
- private void LoadSceneSuccessCallback(string sceneAssetName, float duration, object userData)
- {
- m_LoadingSceneAssetNames.Remove(sceneAssetName);
- m_LoadedSceneAssetNames.Add(sceneAssetName);
- if (m_LoadSceneSuccessEventHandler != null)
- {
- LoadSceneSuccessEventArgs loadSceneSuccessEventArgs = LoadSceneSuccessEventArgs.Create(sceneAssetName, duration, userData);
- m_LoadSceneSuccessEventHandler(this, loadSceneSuccessEventArgs);
- ReferencePool.Release(loadSceneSuccessEventArgs);
- }
- }
- private void LoadSceneFailureCallback(string sceneAssetName, LoadResourceStatus status, string errorMessage, object userData)
- {
- m_LoadingSceneAssetNames.Remove(sceneAssetName);
- string appendErrorMessage = Utility.Text.Format("Load scene failure, scene asset name '{0}', status '{1}', error message '{2}'.", sceneAssetName, status, errorMessage);
- if (m_LoadSceneFailureEventHandler != null)
- {
- LoadSceneFailureEventArgs loadSceneFailureEventArgs = LoadSceneFailureEventArgs.Create(sceneAssetName, appendErrorMessage, userData);
- m_LoadSceneFailureEventHandler(this, loadSceneFailureEventArgs);
- ReferencePool.Release(loadSceneFailureEventArgs);
- return;
- }
- throw new GameFrameworkException(appendErrorMessage);
- }
- private void LoadSceneUpdateCallback(string sceneAssetName, float progress, object userData)
- {
- if (m_LoadSceneUpdateEventHandler != null)
- {
- LoadSceneUpdateEventArgs loadSceneUpdateEventArgs = LoadSceneUpdateEventArgs.Create(sceneAssetName, progress, userData);
- m_LoadSceneUpdateEventHandler(this, loadSceneUpdateEventArgs);
- ReferencePool.Release(loadSceneUpdateEventArgs);
- }
- }
- private void LoadSceneDependencyAssetCallback(string sceneAssetName, string dependencyAssetName, int loadedCount, int totalCount, object userData)
- {
- if (m_LoadSceneDependencyAssetEventHandler != null)
- {
- LoadSceneDependencyAssetEventArgs loadSceneDependencyAssetEventArgs = LoadSceneDependencyAssetEventArgs.Create(sceneAssetName, dependencyAssetName, loadedCount, totalCount, userData);
- m_LoadSceneDependencyAssetEventHandler(this, loadSceneDependencyAssetEventArgs);
- ReferencePool.Release(loadSceneDependencyAssetEventArgs);
- }
- }
- private void UnloadSceneSuccessCallback(string sceneAssetName, object userData)
- {
- m_UnloadingSceneAssetNames.Remove(sceneAssetName);
- m_LoadedSceneAssetNames.Remove(sceneAssetName);
- if (m_UnloadSceneSuccessEventHandler != null)
- {
- UnloadSceneSuccessEventArgs unloadSceneSuccessEventArgs = UnloadSceneSuccessEventArgs.Create(sceneAssetName, userData);
- m_UnloadSceneSuccessEventHandler(this, unloadSceneSuccessEventArgs);
- ReferencePool.Release(unloadSceneSuccessEventArgs);
- }
- }
- private void UnloadSceneFailureCallback(string sceneAssetName, object userData)
- {
- m_UnloadingSceneAssetNames.Remove(sceneAssetName);
- if (m_UnloadSceneFailureEventHandler != null)
- {
- UnloadSceneFailureEventArgs unloadSceneFailureEventArgs = UnloadSceneFailureEventArgs.Create(sceneAssetName, userData);
- m_UnloadSceneFailureEventHandler(this, unloadSceneFailureEventArgs);
- ReferencePool.Release(unloadSceneFailureEventArgs);
- return;
- }
- throw new GameFrameworkException(Utility.Text.Format("Unload scene failure, scene asset name '{0}'.", sceneAssetName));
- }
- }
- }
|