Mirror 快速入门项目(Mirror Quick Start Project)

由 JesusLuvsYooh / StephenAllenGames.co.uk 撰写,由 James Frowen 编辑

本指南目前向您展示:

最好先制作一个迷你练习游戏,然后再转换您的单人游戏,或创建您理想的全新多人游戏。

预制的 Mirror 示例非常适合用作参考,建议在连接设置方面使用它们,包括端口和防火墙。这可能是一个涉及个人之间巨大变化的主题,在本指南中未涵盖,这里我们将使用本地主机 (同一台 PC 上的多个游戏)。 最终结果:

Part 1

空白项目,从 Asset Store 导入 Mirror。

Part 2

  • 创建新场景,保存并将其添加到构建设置中

  • 在场景中创建一个新的 GameObject,命名为 NetworkManager,并添加以下 3 个组件

    • NetworkManager

    • KCPTransport (TelepathyTransport 已过时,您不需要 KCP 和 Telepathy)

    • NetworkManagerHUD

  • 在 NetworkManager 组件上,将您的离线和在线场景拖放到插槽中,目前我们只有一个场景,所以将您的场景放在两个插槽中

    • 在将场景拖放到字段之前,该场景必须在构建设置中

注意: KCP Transport 已在较新版本中取代了 Telepathy

Part 3

设置场景

  • 添加一个简单的平面地板,具有:

    • 位置 (0, -1, 0)

    • 缩放 (2, 2, 2)

  • (可选) 为此添加一个材质,我添加了一个名为 dirt 的材质,这是 Mirror 示例中使用的一个

  • 接下来我们添加一个 GameObject,名称无关紧要

  • 为此 GameObject 添加 NetworkStartPosition 组件

  • 复制 GameObject 几次,并在场景地板周围散布,以便您有多个生成点。我做了 4 个,一个靠近每个角落

Part 4(Part 4)

创建玩家

  • 使用菜单创建一个胶囊体,如图所示

  • 附加一个 NetworkTransform 组件,这将自动添加一个 Network Identity

  • 在 NetworkTransform 上勾选 Client Authority(客户端权限)

(注意:更新的 Mirror 版本使用 "Sync Direction",将其设置为 "Client To Server"。)

  • 将该对象重命名为 Player

  • 添加一个空的 PlayerScript(玩家脚本)

  • 将其拖入项目中以创建一个预制体

  • 然后从场景中删除 Player

  • 将玩家预制体拖入 Network Manager 中,

  • 将生成方法设置为 Round Robin(轮询方式)。

Part 5(Part 5)

将以下内容添加到你的 PlayerScript 中。

Part 6(Part 6)

在 Unity 编辑器中按下播放按钮,然后在游戏窗口中点击 Host(服务器 + 客户端)按钮。你应该能够使用第一人称视角的胶囊体四处移动。

Part 7(Part 7)

构建并运行你的场景,打开它,在一个上托管,然后在另一个上点击客户端按钮。恭喜你,你制作了一个迷你多人游戏!

Part 8(Part 8)

在头顶显示玩家名称

  • 在你的玩家预制体中,创建一个空的 GameObject

  • 将其命名为类似 FloatingInfo 的内容

    • 将 Y 位置设置为 1.5

    • 将 X 缩放设置为 -1

  • FloatingInfo 中,使用 Unity 菜单创建一个 3D 文本(GameObject - 3D Object - 3D Text),

  • 根据下面的图片设置它

Part 9(Part 9)

使用以下内容更新你的 PlayerScript.cs:

Part 10(Part 10)

PlayerNameTextFloatingInfo 对象添加到玩家预制体上的脚本中,如下所示。

现在,如果你构建并运行,在一个上托管,在另一个上加入,你将看到玩家名称和颜色在网络中同步!

Part 11 (Part 11)

一个场景网络对象,所有人都可以访问和调整。

在场景中创建一个 SceneScript.cs,将其添加到名为 SceneScript 的空 GameObject 上。

然后创建一个 Canvas,包含文本和按钮,类似于下面的示例。

将 sceneScript 变量、Awake 函数和 CmdSendPlayerMessage 添加到 PlayerScript.cs 中,还要将新的 playerName joined 行添加到 CmdSetupPlayer() 中;

将以下代码添加到 SceneScript.cs 中:

  • 将 ButtonSendMessage 函数附加到 Canvas 按钮上。

  • 将 Canvas Scene Text 附加到 SceneScript 变量上。

    • 忽略 SceneScript 的 playerScript 变量,它会自动设置!

  • 如果尚未自动执行,请将 NetworkIdentity 组件附加到 SceneScript GameObject 上。

现在,如果构建并运行,主机和加入,您可以发送消息,并且有一个用于操作的文本日志!

哇哦!

尝试并调整,玩得开心!

Part 12 (Part 12)

武器切换!代码片段。

将以下内容添加到 PlayerScript.cs 中:

在更新中添加武器切换按钮。只有本地玩家才能切换自己的武器,因此它应该放在 !isLocalPlayer 检查之下。

Part 13 (Part 13)

武器模型

首先添加基本的立方体武器,稍后再更改这些。

  • 双击您的玩家预制件以进入其中

  • 添加一个名为 "WeaponsHolder" 的空 GameObject,位置和旋转均为 0,0,0。

  • 在该 GameObject 内部,从 Unity 菜单创建一个立方体(GameObject, 3D object, cube)- 移除盒碰撞器。

  • 将其重命名为 Weapon1,更改位置和比例以匹配下面的图片。

复制武器1以创建武器2,并更改其比例和位置,现在你应该有两种外观不同的“武器”!

Part 14(Part 14)

武器切换的最后部分。

  • 将这两个 GameObject 添加到你的PlayerScript.cs(玩家脚本)武器数组中。

  • 禁用武器2,这样只有武器1在生成时显示。

构建并运行!

你应该看到每个玩家都在切换武器,无论你的玩家装备了什么,都会自动显示在新加入的玩家身上(同步变量和钩子魔法!)

Part 15(Part 15)

在这里,我们将进行一些小调整,因为使用 GameObject.Find() 可能无法保证找到网络标识场景对象。在下面的图片中,你可以看到我们的 NetworkIdentity 场景对象被禁用,因为它们在玩家处于“准备就绪”状态之前是被禁用的(通常在玩家生成时设置准备就绪状态)。

所以我们选择的解决方法是让我们的 GameObject.Find() 获取非网络化的场景对象,这些场景对象将具有那些 Network Identity 场景对象作为预设变量。

创建一个名为 SceneReference.cs 的新脚本,并添加这个变量。

打开 SceneScript.cs 并添加以下变量。

现在在你的 Unity 场景中创建一个游戏对象,命名为 SceneReference,并添加新脚本。在两个 Scene 游戏对象上,将引用设置为彼此。这样 SceneReference 就可以与 SceneScript 交流,SceneScript 也可以与 SceneReference 交流。

打开 PlayerScript.cs 并将 Awake 函数覆盖为以下内容:

Part 16(Part 16)

菜单和场景切换,这里我们将从一个离线菜单,带有一个播放按钮,切换到一个游戏列表,带有一个返回按钮和主机/加入 HUD,再到你的在线地图,然后是主机切换到的第二个地图。

打开 SceneScript.cs 并添加以下函数。

复制之前的 Canvas 按钮,重命名并重新定位,然后设置 OnClick() 指向 SceneScript.ButtonChangeScene,就像图片中一样。

然后将你的 NetworkManager 拖放到项目中,将其制作成 Prefab,这样稍后我们所做的任何更改都会应用到它们所有。如果还没有的话,你可以将项目整理到文件夹中,一个用于脚本、预制体、场景、纹理等等。 :)

标题17 (# Part 17)

保存,然后复制你的 MyScene,重命名为 Menu、GamesList 和 MyOtherScene,然后将它们添加到构建设置中,其中 Menu 放在第一位。

打开 Menu 场景,移除生成点、SceneScript、SceneReference、Network Manager 和 Plane,使其看起来像下面这样。调整画布按钮以显示 Play,并将其居中。在这里你可以添加得分场景、联系部分、新闻等等。

创建一个 Menu.cs 脚本,将其添加到 Menu gameObject 上。

将代码添加到 Menu.cs 中,然后在按钮中,将 Menu gameObject 拖放到 On Click() 中,并设置为 Menu.LoadScene,就像图片中一样。

标题18 (# Part 18)

打开 GamesList 场景,类似于 Menu,但保留 NetworkManager 预制体。

创建一个 GamesList.cs,添加代码,并将其添加到场景中的 GamesList gameObject 上。调整画布按钮以显示 Menu(这是我们的返回按钮)。它应该看起来像下面的图片。

  • 游戏列表是你可以添加服务器内容列表、匹配器,或者只是主机和加入按钮,类似于默认的 NetworkManagerHud,暂时保留这些。 :)

标题19 (# Part 19)

打开 MyOtherScene,这是我们的第二个地图。更改相机背景颜色和地板材质(或任何内容,只要你能看到这两个场景是不同的即可。总结一下,MyScene 是地图 1,MyOtherScene 是地图 2。

在你的 NetworkManager 预制体中的项目中(而不是场景中的那个),添加 Menu 到 Offline(离线),并将 MyScene 添加到 Online(在线)变量。这将更改所有 NetworkManager 预制体的这些设置。

构建并运行,点击 Menu 进入 GamesList,然后点击 Host(玩家1)。对于玩家2,点击 Menu 进入,然后在 GamesList 上进行客户端连接。

现在主机可以在地图1和地图2之间切换场景,如果有人断开连接或停止游戏,Menu 场景将加载以重新开始。整个过程可以整理一下,但应该为你的 Mirror 游戏提供一个良好的场景切换模板 :)

在这里,我们将添加基本的武器射击,使用刚体预制体。通常最好使用射线投射来表示发射的对象,并将物理对象保留给像手榴弹和炮弹之类的东西。为了保持指南简单,本节也将缺乏许多安全性和防作弊技术,但无论如何,让我们开始吧!

双击 Player Prefab 打开它,创建空的游戏对象并将它们与武器的末端对齐,将它们添加为每个武器的子对象。一些武器可能是短手枪,其他的可能是长步枪,因此对象生成的位置将不同。

创建一个 Weapon.cs 脚本,将其添加到 Player Prefab 中的 Weapon1 和 Weapon 2 游戏对象中。

现在回到你的场景,我们将制作两种子弹,在 Unity 菜单中,转到 GameObject,3D Object,Sphere。给这个球体添加刚体,将比例设置为 0.2, 0.2, 0.2,然后将其保存为项目中的 Prefab。
用一个立方体做同样的操作,这样你就有两种外观不同的子弹。

再次选择玩家预制体,在武器上设置武器脚本的变量。

第22部分 (#part-22)

在SceneScript.cs中,添加以下变量和函数。

进入MyScene(地图1)。复制Canvas StatusText,重命名为Ammo,然后将该Ammo文本UI拖动到SceneScript游戏对象中,canvasAmmoText变量。在MyScene(地图1)和MyOtherScene(地图2)上都执行此操作,因为我们尚未将我们的画布和场景脚本链接或预制,以便在每个地图上自动更新更改。

打开PlayerScript.cs,添加以下两个变量:

在‘OnWeaponChanged’函数中,使用新行更新它,应该如下所示。

在Awake()中,在最后添加以下内容:

在Update()中,在最后添加以下内容:

在Update() {}函数结束后添加以下两个函数。

构建并运行,您应该可以在所有玩家上以不同的速度和冷却时间进行射击 :)

最后更新于

这有帮助吗?