单机游戏开发注意事项
阅读本文预计 10 分钟
本文概述了在编辑器中,想要开发单机游戏需要注意哪些流程以及代码规范注意事项
单机游戏特性
为方便单机游戏开发与多人联网游戏开发的转换,编辑器的单机模式引入了局域网的概念
可简单的理解为编辑器的单机模式终端,即是客户端也是服务端
运行环境判断区别
如上图所示
- 原多人联网游戏逻辑中,所有使用【if(isServer){...}else{...}】、【if(isClient){...}else{...}】的逻辑将都只会执行第一个 if
- 【Client1&Host】端 isServer 永远为 true
ts
//此处永远为true,只执行if
if(SystemUtil.isServer())
{
//...
}
else{//永远不会执行
//...
}
//---------------------------------------------------
//此处永远为true,只执行if
if(SystemUtil.isClient())
{
//...
}
else{//永远不会执行
//...
}
//此处永远为true,只执行if
if(SystemUtil.isServer())
{
//...
}
else{//永远不会执行
//...
}
//---------------------------------------------------
//此处永远为true,只执行if
if(SystemUtil.isClient())
{
//...
}
else{//永远不会执行
//...
}
以上逻辑可以改成如下格式
ts
if(SystemUtil.isServer()){
//...
}
if(SystemUtil.isClient()){
//...
}
if(SystemUtil.isServer()){
//...
}
if(SystemUtil.isClient()){
//...
}
单机游戏模式对 RPC 的影响
在单机游戏模式中,以【Client1&Host】端为例
主控端既是客户端又是服务端,故可以在客户端写服务端的代码
例如:
ts
if(Gameplay.isClient())
{
Events.addClientListener("xxx",(player:Gameplay.Player)=>{ });
}
if(Gameplay.isServer())
{
Events.addServerListener("xxx",(player:Gameplay.Player)=>{ });
}
if(Gameplay.isClient())
{
Events.addClientListener("xxx",(player:Gameplay.Player)=>{ });
}
if(Gameplay.isServer())
{
Events.addServerListener("xxx",(player:Gameplay.Player)=>{ });
}
若逻辑需要过滤自己发送给自己的信息:
- dispatchToServer 指令,用 addClientListener 接的时候,是有 Player 参数的,这个指令在 LS 中没有改变,所以可通过 Player 来判断是否是自己发给自己,用来过滤信息
- dispatchToClient、dispatchToAllClient 这两个指令原本不携带 Player 参数,则需要开发者手动在事件参数中做标识,用来过滤信息
单机游戏转多人联网游戏的注意事项
- 运行环境判断的改变【SystemUtil.isServer()】【SystemUtil.isClient()】
- 单机游戏的客户端可以 addClientListener,多人联网游戏中的客户端是不可以的
- 单机游戏主控端过滤消息时可以使用 Player 来判断,在多人联网游戏的服务端是无法 getCurrentPlayer 的
单机游戏数据存储的注意事项
详情可参考数据存储 产品手册