第六章 基本框架(Framework)
四 程序入口(Application Entry)
游戏入口,一般来说,作用有初始化游戏和一些游戏配置属性。
在这里,我们的游戏入口类,也是同样的作用。
但我们同时将场景的操作也写入其中,作为SceneManager
的扩展。
1 了解场景管理器(SceneManager)
Unity管理场景的API都在SceneManager
中,它在UnityEngine.SceneManagement
命名空间中。
说到场景的管理,主要功能就是加载场景,卸载场景与改变场景。
同时还能从SceneManager
中获取场景信息,场景信息类型为Scene
。
常用方法(Method)如下:
- GetActiveScene
,获取当前激活场景。
- LoadScene
,卸载所有场景后,加载场景。
- LoadSceneAsync
,卸载所有场景后,异步加载场景。
- UnloadSceneAsync
,当加载的场景多余1个时,异步卸载场景。
- SetActiveScene
,当加载的场景多余1个时,改变当前激活场景。
常用事件(Events)如下:
- activeSceneChanged
,当前激活场景发生改变时触发。
- sceneLoaded
,场景加载完成事件。
- sceneUnloaded
,场景卸载完成事件。
我们要做的主要工作是在入口中,执行这些操作时,利用MessageCenter
发送相应事件。
2 事件参数(Event Args)
在MessageCenter
发送事件时,我们需要场景信息作为参数。
MessageCenter
所需参数如下:
- OnActiveSceneChangedArgs
,激活场景改变时,事件参数。
- OnSceneLoadedArgs
,场景加载完成时,事件参数。
- OnSceneUnloadedArgs
,场景卸载完成时,事件参数。
- OnLoadSceneArgs
,加载场景之前,事件参数。
其中,OnLoadSceneArgs
在SceneManager
中没有对应事件,这是我们自己添加的。
其他事件参数与SceneManager
中对应事件参数是相同的。
这些事件与扩展,按需添加,并不一定全部要添加。
2.1 OnActiveSceneChangedArgs.cs
using UnityEngine.SceneManagement;
namespace DR.Book.SRPG_Dev.Framework
{
public class OnActiveSceneChangedArgs : MessageArgs
{
public Scene scene1;
public Scene scene2;
}
}
2.2 OnSceneLoadedArgs.cs
using UnityEngine.SceneManagement;
namespace DR.Book.SRPG_Dev.Framework
{
public class OnSceneLoadedArgs : MessageArgs
{
public Scene scene;
public LoadSceneMode mode;
}
}
2.3 OnSceneUnloadedArgs.cs
using UnityEngine.SceneManagement;
namespace DR.Book.SRPG_Dev.Framework
{
public class OnSceneUnloadedArgs : MessageArgs
{
public Scene scene;
}
}
2.4 OnLoadSceneArgs.cs
在加载场景时,Unity提供两种方式——buildIndex
与sceneName
。
如果在项目中混用,我们需要知道是使用了哪种类型。
LoadSceneType.cs:
namespace DR.Book.SRPG_Dev.Framework
{
public enum LoadSceneType
{
BuildIndex,
SceneName
}
}
OnLoadSceneArgs.cs:
using UnityEngine.SceneManagement;
namespace DR.Book.SRPG_Dev.Framework
{
public class OnLoadSceneArgs : MessageArgs
{
public Scene activeScene; // 当前Scene
public int buildIndex; // 使用BuildIndex读取Scene
public string sceneName; // 使用SceneName读取Scene
public LoadSceneType type; // 使用BuildIndex或者SceneName
public LoadSceneMode mode; // 加载方式
public bool async; // 是否异步加载
}
}
3 程序入口基类(ApplicationEntry.cs)
到这里,我们就可以创建我们的游戏入口了。
游戏入口在整个游戏中只有一个,必然是个单例,所以我们让它继承UnitySingleton
。
这样游戏入口成为了一个MonoBehaviour
,在游戏最初的场景(初始化场景)中,我们将它挂载在场景的物体上。
namespace DR.Book.SRPG_Dev.Framework
{
public abstract class ApplicationEntry<T> : UnitySingleton<T> where T : ApplicationEntry<T>
{
// TODO
}
}
3.1 事件(Event)
首先,事件需要事件名称与参数,而这些事件由于只在入口中发送,所以我们建立静态参数。
public const string k_Event_OnActiveSceneChanged = "Event_OnActiveSceneChanged";
public const string k_Event_OnSceneLoaded =