同步与机制问题
Lua脚本在单人试玩时有效,多人试玩时无效?
-
解答: 单人模式下游戏为 Standalone 状态(服务器和客户端均在本地运行),多人模式下需区分客户端(Client)和服务器(Server)逻辑。遇到多人试玩时无效的情况,请前往API文档,检查API的适用范围,并确保关键逻辑在服务端执行或正确同步。如果不清楚如何分离客户端与服务器代码,那么推荐先选择延伸阅读内容进行学习。
-
延伸阅读: 《客户端-服务器通信指南》文档、《客户端与服务器通信教程》游戏内教学视频。
角色移动同步,以客户端为准还是服务器为准?
- 解答: 游戏中默认服务器会对角色的移动进行校验,如果校验发现客户端设置的位置不合理,服务器会拉扯角色回到一个合理的位置。通过在服务器设置API设置角色移动同步(SetMoveReplicated)为false,可以关闭服务器进行的校验;此时服务器会无条件信任客户端提供的位置,并直接转发给其他所有客户端。
元件同步(SetReplicates)API如何使用?
- 解答: 游戏中默认开启元件的同步,开启后在服务端进行元件位移等操作时,会自动同步给客户端。通过在服务器设置API:元件同步(SetReplicates)为false,可以关闭元件的同步;此时可在客户端和服务器独立控制这个元件。
对象创建后立即操作无效?
-
解答: 创建对象后,部分内容需要异步进行初始化。可以试着添加 2帧左右延迟后,再执行操作。
-
涉及API: SpawnElement、SpawnCreature、SpawnCreatureBySceneID、Destroy、DestroyByTime
客户端与服务器的代码执行顺序?
-
解答: 从顺序上可以理解为:游戏首先进行地图加载,地图加载完成后加载脚本,在服务端和客户端都加载完毕之后,客户端会接入服务端,当所有客户端接入服务端之后,服务端才会通知客户端开始游戏。
-
案例: 在模板工程中,已经为创作者设置了初始化函数GameServer:Init()和GameClient:Init()。因此推荐在Init函数中注册事件,随后在GameServer:OnStart()和GameClient:OnStart()中触发事件,可以确保协议接收。