这是官方镜像文件“镜像快速启动指南”的翻译。我的英语不好,所以这个文件是用机器翻译+手工校对+个人意见的方式处理的。请指出任何错误。
当我有时间的时候,我会用这本介绍性指南制作一系列视频。我希望它能帮助你。
正式原件:
Part 1
从Unity Asset Store导入Mirror
然后在Unity的Package Manager中导入到项目。这些是基操,不再细说了。
Part 2
- 创建新的场景,保存它,并添加到Building Setting
- 创建一个新的游戏对象,在场景中将其命名为NetworkManager,并添加这3个组件
- NetworkManager
- TelepathyTransport
- NetworkManagerHUD
- 在NetworkManager组件中,将你的离线和在线场景拖到Offline Scene和Online Scene中,我们现在只有一个场景,所以把你的场景都放在两个中
。场景必须先放在Building Setting中
Part 3
设置场景
- 加入一个平台Plane。Transform参数设为positions (0, -1, 0) scale (2, 2, 2)
- (这步操作不是必须的)添加一个材料material 到这个Plane
- 下一步,加入一个空游戏对象GameObject,随便起个名字
- 在这个空GameObject上加入组件NetworkStartPosition
(NetworkStartPosition组件的作用是使得Player在指定的位置生成)
- 复制这个空的GameObject,这里复制3个GameObject,分别将这4个GameObject放到Plane 的4个角落
Part 4
建立玩家Player
- 加入一个GameObject胶囊体capsule,位置设为Position(0,0,0)
- 在这个capsule上加入组件NetworkTransform,这样会自动加入另一个组件NetworkIdentity
- 在NetworkTransform组件中勾选Client Authority
- 将capsule改名为Player
- 建立一个脚本PlayerScript.cs,并加到Player上
- 将Player拖拽到Preject,这样会建立一个Player的Prefab
- 在场景中删除Player
- 将Project中的Player prefab拖入NetworkManager对象的NetworkManager组件的PlayerPrefab中
- 设置PlayerSpawnMethod为Round Robin.
(Player生成时将会在我们前面指定的4个位置循环生成)
Part 5
修改PlayerScript.cs脚本,加入如下代码
(这是控制Player移动的代码,注意这是继承于NetworkBehaviour,不是MonoBehaviour)
Part 6
点击Play按钮运行程序
将会看到左上角有3个按钮,点击“Host (server + client) ”
你将在第一人称视角中控制Player的移动
Part 7
你可以编译一个客户端程序
运行这个客户端程序,点击第二个按钮“Client” 。 点击按钮前请输入正确的IP地址,如果是本机,可以输入“127.0.0.1”或者“Localhost”。
这时候你将在场景中看到2个Player。恭喜,您制作了一个迷你多人游戏
Part 8
- 在Player的头顶放置Player的名字
(这是UI的使用,在Player的头顶放置一个UI,可以放置文本Text,也可以放置血条等等)
- 进入Player Prefab ,建立一个空的GameObject
- 这个空的GameObject改名为FloatingInfo。(当然也可以起其他名字)将Position设为1.5
- 在FloatingInfo下加入一个3D text(GameObject – 3D Object – 3D Text)
- 如下图所示进行设置
Part 9
将PlayerScript.cs的代码改为
Part 10
如下所示,将PlayerNameText和FloatingInfo对象添加到Player Prefab预制件上的脚本中
现在如果你Build并Run ,然后一个运行Host模式,另一个运行Client并加入网络,这时名字和颜色在网络中的同步
Part 11
建立一个空的GameObject,改名为SceneScript。
建立一个SceneScript.cs并加载给SceneScript这个GameObject
建立一个UI Canvas,加入一个Text和Button。类似于下面
在PlayerScript.cs中加入sceneScript 变量和Awake函数、CmdSendPlayerMessage函数。还要将新的playerName加入的行添加到CmdSetupPlayer()
将以下代码加入SceneScript.cs
- 将ButtonSendMessage函数附加Canvas的Button
- 将Canvas场景文本Text附加到SceneScript变量。忽略SceneScript的,playerScript变量,它会自动设置这个!
- 将NetworkIdentity组件附加到SceneScript游戏对象中
如果现在Build和Run,运行一个Host和Client,就可以发送消息message了,你可以在log中看到。
Part 12
武器切换
将下面的代码加入PlayerScript.cs
在Update中增加武器开关按钮。只有本地玩家( local player)才能切换自己的武器,因此需要做isLocalPlayer检查。
Part 13
武器模型
首先简单的添加Cube作为武器,然后再进行更改。
- 双击Player Prefab,进入Prefab编辑
- 加入一个空的GameObject,并改名为 “WeaponsHolder” 。
- 加入一个Cube,删除Cube的box colliders。
- 将这个Cube改名为Weapon1
复制Weapon1为Weapon2,并改变位置Position和Scale。这样就有了2个不同的武器模型。
Part 14
武器的切换
- 将这2个GameObjects添加到PlayerScript.cs武器数组Array中
- 禁用weapon 2,所以只有weapon 1在Player生成时显示。
Build 和run!
你应该看到每个玩家Player切换武器,无论你的玩家装备了什么,都会自动显示在新加入的玩家(同步var和Hook!)
Part 15
在这里,我们将做一些小的调整,因为使用GameObject.Find()可能无法保证找到网络标识的场景对象。在下图中,您可以看到我们的NetworkIdentity场景对象已被禁用,因为它们一直处于禁用状态,直到玩家处于“就绪”状态(通常在玩家Player生成时处于就绪状态)
因此,我们选择的解决方法是让我们的GameObject.Find()获取非联网的场景对象,该对象将这些Network Identity场景对象作为预设变量。
打开SceneScript.cs并添加以下变量。
现在在Unity场景中创建一个空的GameObject,将其命名为SceneReference,然后添加新脚本。在两个Scene游戏对象上,将reference 设置为彼此。因此,SceneReference可以与SceneScript对话,SceneScript也可以与SceneReference对话。
打开PlayerScript.cs并修改Awake函数:
Part 16
菜单和场景切换,
在这里我们将使用Play按钮进入离线菜单,使用back按钮进入 GameList和Host/JoinHUD,然后再到在线地图,再通过Host切换到到第二张地图 。(靠,这段翻译很绕)
打开SceneScript.cs并添加以下代码
复制前面的UI中Canvas下的Button,对其进行重命名(随便什么名字都可以)并改变位置,然后将OnClick()设置为指向SceneScript.ButtonChangeScene,如上图中所示
然后将您的NetworkManager这个GameObject拖到Project中,使其成为Prefab,这样我们以后进行的任何更改都将应用于它们。
Part 17
复制MyScene这个场景文件,复制3个,分别改名为Menu、GamesList和MyOtherScene。然后将这几个Scene文件拖入build settings中
打开“Menu ”场景,删除spawn points,SceneScript,SceneReference,Network Manager 和“Plane这几个GameObject,看起来像下面的图片。
调整Button按钮以并设置文本Text为Play,将其居中。
新建一个Menu.cs脚本文件。
然后在Button中,将Menu游戏对象拖到On Click()上,并将其设置为Menu.LoadScene,如下所示。
Part 18
打开GamesList场景,执行与Menu类似的操作,但保留NetworkManager这个Prefab。
建立一个GamesList.cs脚本文件,加入下面的代码。
在场景中加入一个空的GameObject,改名为GamesList。将场景中的Button的文本Text改为Menu
Part 19
打开MyOtherScene,这是我们的第二张地图,更改相机背景颜色和地板材质。
(这样您就可以看到两个场景都不同。总而言之,MyScene是地图1,MyOtherScene是地图2。)
在PROJECT的NetworkManager Prefab预制体中(不是场景中的一个),将Menu添加到脱机场景Offline Scene,并将MyScene添加到OnlineScene。这将会更改所有NetworkManager预制件以具有这些设置。
编译并运行(Build and Run)。点击Play按钮进入GameList。然后点击“Host (server + client) 生成第一个玩家Player 1。要生成第二个玩家Player 2,需要再运行一个程序实例,然后点击Play按钮,再点击client connect。
现在,主机可以在地图1和地图2之间更改场景,并且如果有人断开连接或停止游戏,则将加载菜单场景以重新开始。整个过程可以整理,但是应该为您的Mirror网络游戏提供一个不错的场景切换模板
Part 20
在这里,我们将使用具有刚体的预制件作为基本的武器射击系统。通常,被发射的物体带有射线投射会更好,并且将物理对象保留在类似手榴弹和炮弹等物体上。为了使指南更简单,本节还缺少一些安全性和反作弊技术,但是无论如何,让我们先把系统运行起来。
双击Player prefab打开,建立一个空的GameObject,并与武器的末端对齐,将它们作为子对象添加到每种武器中。有些武器可能是短手枪,有些则是长步枪,因此开火时子弹生成的地方会有所不同。
创建一个Weapon.cs脚本,并将其添加到玩家预制体内的Weapon1和Weapon 2游戏对象中。
Part 21
现在回到您的场景中,我们将制作2个子弹,在Unitys菜单中,转到GameObject—3D Object—Sphere,建立一个球体。在该球体中添加刚体,修改比例scale为0.2、0.2、0.2,然后将其保存为Project中的Prefab。我们按照同样的方法在建立一个正方体Cube,执行相同的操作。最后,您会看到两个不同的子弹。
再次在您的Player预制件内,选择一种武器,然后在武器脚本weapon .cs上设置变量。
Part 22
在SceneScript.cs中,添加如下变量和函数
进入MyScene(地图1)。复制Canvas StatusText,重命名为Ammo,然后将该Ammo文本UI拖动到SceneScript游戏对象canvasAmmoText变量中。在MyScene(地图1)和MyOtherScene(地图2)上都进行此操作,因为我们尚未链接或预制画布和场景脚本以自动更新每个地图上的更改。
打开PlayerScript.cs,添加这两个变量:
在“ OnWeaponChanged”函数中, 对其进行更新, 它应如下所示
在Awake()中,在末尾添加如下代码
在Update()中,在末尾添加
在Update(){}函数完成后,添加这两个函数。
编译和运行(Build and Run)。你将会能够使用不同的速度和冷却时间开火。
================================================================
官方的入门指南是浅显易懂的,至少官方是这么认为的,但对于很多初学者来说,由于基础水平与官方大佬根本不在一个层次上,很多东西不是一下就能理解的,我也是看了很多遍官方文档才慢慢理解学习的,后期我将做个系列视频讲解这个官方的入门指南。
我只是比大家多学习了几天的人而已,我喜欢将我学习到的东西分享给大家,感谢大家的关注。