SRPG游戏开发(十九)第六章 基本框架 - 四 程序入口(Application Entry)

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

返回总目录

第六章 基本框架(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,加载场景之前,事件参数。

其中,OnLoadSceneArgsSceneManager中没有对应事件,这是我们自己添加的。
其他事件参数与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提供两种方式——buildIndexsceneName
如果在项目中混用,我们需要知道是使用了哪种类型。

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的场景事件。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值