分类 中文 下的文章

问题的提出:由于原先的场景管理器是需要同步服务端所有的场景到客户端,这适合于端对端的游戏模式,在c/s模式中并不常见。开房间游戏是需要动态创建新场景的,这个功能原先的场景管理器并不支持,需要自己实现。

改动一:因为是要实现在互联网上的游戏大厅联网游戏,所以把这个场景管理器替换成一个简单的场景管理器。在这个简单的场景管理器里,客户端只有一个场景,而服务端有许多个场景。客户端选择哪个场景,服务端就同步哪个场景。

改动二:约定所有场景具备唯一的名称,在服务端加载一个名为Active的空场景,并且设定为Active Scene。也就是说,所有动态创建的网络对象,缺省都在这个空场景里创建。创建完成后,再使用SceneManager.MoveGameObjectToScene将其移动到指定的场景里去。网络环境中,不可能大家各自指定一个活动场景,这样会导致冲突的,这样约定后,就没有冲突了。

改动三:增加了一个方法,来创建和加载并合并场景。开房间的游戏大家都知道,有一个房间创建者,新开的房间场景,就以类似”Room_玩家用户名”这样的命名方式来命名。而这个新建的场景,是以固定场景Room加载进来,再合并到一个新的名称”Room_玩家用户名”。同样,主游戏场景也是这样的过程,加载固定的Game场景,然后合并到新建的"Game_玩家用户名"场景里去。然后由场景管理器实现服务端和客户端之间的场景同步。

自定义场景管理器的实例引用为NetworkManager.Singleton.SceneManager,他的方法如下:

//服务端加载场景
//sceneName为场景名称
void SvrLoadScene(string sceneName);

// 服务端卸载场景
//sceneName场景名称
void SvrUnloadScene(string sceneName);

// 服务端创建新场景并且加载另外一个场景,然后以offset为偏移合并加载的场景到新创建的场景里去。
//id指定客户端id
//desScene目标场景名
//srcScene源场景名
//offset"场景偏移
void SvrCreateAndMergeScene(ulong id,string desScene,string srcScene,Vector3 offset);

//客户端切换当前场景
//curScene指定场景名
void ClientSwitchScene(string curScene);

// 在服务端切换某个客户端的场景
//id指定客户端id
//curScene指定场景名
void ServerSwitchScene(ulong id,string curScene);

//设置缺省场景,在客户端第一次连接到服务端的时候,服务端会同步缺省场景给客户端。
//defaultScene缺省场景名
void SetDefaultScene(string defaultScene);

//服务端场景加载完毕事件,当服务端场景加载完毕后触发。
//使用NetworkManager.Singleton.SceneManager.OnServerSceneLoadComplete += OnServerSceneLoadComplete;
//来添加事件触发函数。
OnServerSceneLoadComplete(string scname)

第一步 准备开发环境

准备好unity编辑器,版本号为Unity 2022.3.53f1c1。在unity hub里选择添加模块Windows Dedicated Server Build Surpport,这个模块在导出服务端的时候要用到。

第二步 下载工程文件和依赖包

下载 源代码 文件,解压,然后在unityhub里 从磁盘添加项目,把fwhas目录添加为工程项目。然后双击该项目启动unity编辑器打开工程文件。

下载 自定义netcode包 ,打开unity编辑器里的包管理器,使用 从磁盘添加tarball来添加下载到的名为com.unity.netcode.gameobjects-1.12.2.tgz 包,忽略无效证书的提示。

在unity编辑器里的包管理器,选择unity Registry,搜索Localization,搜到后点击安装。

第三步 选择导出配置

在Assets/Config目录下有一个名为Init的配置文件,点中这个文件,在检查器里可以切换StartType为Client和Server。当你想导出客户端文件的时候,在导出前选择Client。如果想导出服务端文件,在导出前选择Server,然后切换导出平台为Dedicated Server。

到这里应该可以导出服务端包和客户端包了。

第四步 运行服务端和客户端

鼠标双击运行服务端包里的fwhas.exe,这是一个命令行的程序。等他启动后消息不再滚动,然后再启动客户端包里的fwhas.exe。客户端可以多开几个测试一下联网运行的效果。

这个模版文件能够在互联网上提供游戏大厅功能,提供用户注册、用户登录、新建房间、加入房间、准备完毕、开始游戏6个功能模块。

该模版使用Unity 2022.3.53f1c1 开发,引用了NetCode For GameObjects 1.12.2包和Localization包,并且对NetCode For GameObjects 1.12.2包里的场景管理器进行了替换,使之能够轻松支持在互联网上开房间的网络联机游戏。

游戏模版文件导出的Demo Windows平台的exe包文件: 客户端 服务端

游戏模版文件的源代码工程文件: 源代码

自定义场景管理器的NetCode For GameObjects 1.12.2包文件: 包文件
包文件下载后,打开包管理器使用从磁盘添加tarball包来安装。

Localization包,使用包管理器里的unity registry来搜索安装。