2

我正在开发基于 2D 平铺地图的新 3d 游戏。在开发了最基本的功能(程序地图生成和玩家移动)之后,我想让它在多人游戏中工作。

我已经阅读了整个 HLAPI 文档,并且已经完成了两次 HLAPI 教程,但是我当前的架构似乎与上述教程中显示的架构大不相同。

这是游戏在没有多人游戏的情况下的运作方式:

赛前场景对象:

  • 一个带有名为“GlobalController”的脚本的空对象,它将在所有场景中保持活跃,负责场景管理并作为全局数据存储。
  • 另一个空的脚本名为“PregameUIController”,这将负责用户与游戏前场景的交互。
  • 一个 Canvas 一个其他不相关的对象。

赛前场景主流程:

  • 全局控制器从文件中加载游戏定义(图块类型、生物群落类型、实体类型)
  • 玩家选择星球的大小和种子,然后点击播放
  • 全局控制器创建一个新的planet(c#类,不是monobehaviour,只用于数据存储)准备创建
  • 全局控制器将场景更改为行星创建场景

行星创建场景对象: - 行星创建控制器,负责行星创建并向用户显示行星创建的当前状态。

行星创建主流程: - 行星创建控制器(从现在开始的 PCC)从全局控制器获取对行星的引用 - PCC 创建行星地形和实体,同时将过程状态告诉玩家 - PCC 设置起始位置基于复杂算法的行星 - PCC 告诉全局控制器开始播放行星 - 全局控制器创建一个新的 Player(c# 类,不是 monobehaviour,仅用于数据存储)作为 activePlayer,其中将包含播放器的起始位置 - 全局控制器将场景更改为正在播放的场景 - 画布和其他不相关的对象。

播放场景对象:

  • 渲染控制器,负责播放器屏幕上显示的内容
  • InputController,处理玩家输入
  • PlayerController,照顾玩家预制件和他的不同行为
  • 一个 Canvas 一个其他不相关的对象。

播放场景主流程:

  • 渲染控制器和玩家控制器从全局控制器获取行星和玩家参考
  • 渲染控制器将最近的块渲染给玩家
  • 播放器控制器实例化播放器预制件
  • 输入控制器管理输入要求 playerController 移动播放器
    • 移动播放器包括:
    • 播放器控制器验证目的地是一个有效的目的地
    • playercontroller 要求 playerObject(连接到 playerPrefab 的单一行为)移动
    • 当移动结束时,playerObject 修改玩家位置

这就是我试图实现的目标

赛前场景:

  • 用户决定是否作为主机或客户端播放
    • 如果客户去行星创建场景
    • 如果主机设置种子,大小等参数,然后去行星创建

星球创造场景:

  • 如果宿主,则正常进行(让我们在通知玩家的同时创建星球,然后创建玩家,最后进入主场景)
  • 如果客户:
    • 从服务器获取行星数据
    • 全局控制器创建一个新的 Player 作为 activePlayer,它将包含播放器的起始位置。(和之前一样)

演奏场景:

  • 两个玩家都可以移动并在同一张地图中看到其他移动(目前尚未修改)
  • 玩家控制器可以验证玩家是否可以移动到下一个图块(本地验证)
  • 当 PlayerPrefab 开始移动时,服务器会收到通知,如果是非法移动,服务器会返回通知并中止 movemet。

问题:

  • 使行星只在服务器上生成(复杂的 perlin 算法)。
  • 连接时与客户端共享行星信息(包含更多自定义类的自定义类)?
  • 使控制器(全局控制器,网络控制器,...)从 NetworkBehaviour 扩展并为其分配一个 NetworkIdentity 然后,如文档中所述,它们将被停用,直到场景被加载,防止将控制器的数据从服务器同步到客户。
  • 在我仍然不需要生成它的信息时避免生成 playerPrefab(即使我不在游戏场景中)。

问题:

  • 我是否需要重构整个游戏来改变事物之间的交流方式?如果你认为我可以坚持这个架构,你能给我一些指导来完成这项工作吗?
4

0 回答 0