自定义场景管理器的NetCode包的使用说明
问题的提出:由于原先的场景管理器是需要同步服务端所有的场景到客户端,这适合于端对端的游戏模式,在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)