第六章 基本框架(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 = "Event_OnSceneLoaded";
public const string k_Event_OnSceneUnloaded = "Event_OnSceneUnloaded";
public const string k_Event_OnLoadScene = "Event_OnLoadScene";
private static readonly OnSceneUnloadedArgs s_OnSceneUnloadedArgs = new OnSceneUnloadedArgs();
private static readonly OnSceneLoadedArgs s_OnSceneLoadedArgs = new OnSceneLoadedArgs();
private static readonly OnActiveSceneChangedArgs s_OnActiveSceneChangedArgs = new OnActiveSceneChangedArgs();
private static readonly OnLoadSceneArgs s_OnLoadSceneArgs = new OnLoadSceneArgs();
其次,游戏开始后,我们需要让游戏能够运行Unity的场景事件。

本文详细介绍了在Unity中开发SRPG游戏时的程序入口(Application Entry)和场景管理。主要内容包括理解场景管理器(SceneManager),事件参数如OnActiveSceneChangedArgs和OnSceneLoadedArgs,以及如何实现程序入口基类(ApplicationEntry.cs)的事件、加载和卸载场景功能。文章还讨论了在游戏入口中如何发送和处理场景变更、加载和卸载的事件,以及在不同场景间切换的策略。
最低0.47元/天 解锁文章
9555

被折叠的 条评论
为什么被折叠?



