开启左侧

[教程] VR多人联机坦克开发系列进阶九(完)

本帖最后由 安弟 于 2017-12-19 14:55 编辑
本系列实作, 是以 Unity 官方常见的 Tanks 范例(同台计算机双打游戏), 改成使用 Photon Cloud + PUN 型式的在线多人同时对战游戏(max 4人), 让桌机玩家可以用俯视 45度的视角来观看以及键盘来操作, 而手机玩家则应用 Google Cardboard 提供的 VR模式来观看场景以及蓝芽游戏杆来操作游戏.

前篇系列(8)为 Google Cardboard VR 的初始建立、重生系统修改、Input System 组件的设定、代表玩家的联机组件建立等等, 参考连结如下:
VR多人联机坦克开发系列进阶八

本篇为系列(9), 也是此系列的最后一篇, 重点多为细部的程序设计, 如:
       Camera 切换 — 在不同的游戏环境(手机、桌机)时的设定
程序修改 — 游戏核心与回合的进行流程
程序修改 — 代表联机玩家的组件程序设计
程序修改 — 炮弹射击与碰撞的程序设计
Tips: 以手机连结蓝芽游戏杆时, 可能会遇到的问题与解法
(以 Sony Xperia + DualShock 4 为例)

开始
早前, 在本系列的第(2)篇中, 已经可以用简易的 PhotonManager.cs 来直接加载可联机的游戏场景, 接下来则要专注在联机的游戏场景中, 看看其中的联机组件、对象、Camera 以及输入操控之间的程序运作啰~

Camera 切换
先打开本系列(3)所完成的 CompleteGame-PUN 游戏场景, 以这个场景对象安排的初始化流程来说, 会先建立 MainCamera, 再来才是 GameManager, 所以我们可在其中抓到主摄影机, 并将 Camera 改成以桌机为主或是手机为主的显示(也就是桌机以 45度角显示, 或是手机以 VR Mode显示). 程序如下:
1.png
GameManager.SetupGVRMode(), 可设定 Camera 以及 GoogleVR 是否要为 VR Mode.

当正在游戏时, 若我们也想让使用者的画面, 可以在 VR 或是 45度视角做切换, 那我们可以加一段程序代码在 TankMovement.cs 的 Update() 里头, 以 Input System 读取 ButtonDown 的动作( 像是以 ReWired Input 设定个 SwitchView 的按键, 再用 ReWired player 来取值), 这样很方便在桌机随时可以切换, 或是对正在进行的游戏做 debug. 程序如下:
2.png
TankMovement.Update(), 可在其中读取 Button 做切换 UI视角的功能

游戏流程 Game Loop
而同样的, 在 GameManager.cs 中, 因为是整个游戏场景的流程核心, 所以我们在 Start() 里面, 会做一些像是确认是否已连上 Photon Cloud 并且进入 Photon Room、初始玩家 Tank、设定 Tank 对象主体、设定 VR显示, 并且确认是否为建立 Photon Room 的玩家 (MasterClient), 然后再进入游戏回合 (GameLoop) ~
3.png
GameManager.cs , Start() 中设定的起始流程

再来, 针对本机的使用者 — 也就是已连上 Photon Cloud 的 Client, 我们初始化(网络化)一台 Tank 来代表本机玩家, 并且让所有同在房间内的玩家, 可以在画面上看到其它玩家的数据与变化. 所以我们必须使用有 PUN 组件在其内的 Tank 做为 Prefab 的参考体. 如下所示:
4.png
Tanks Prefab 是代表玩家的坦克, 注意这次我们用的是有 PUN 组件的坦克唷!

并且, 在 Game回合开始前, 本机玩家要先做的初始动作如下:
5.png
GameManager.cs , EnterGameLoop() 片段

Tank Movement
在 Tank 的移动操控中, 这里注意一件事, 在初始化(Awake)时, 我们须要取得 玩家 Input System 的按键设定, 以 ReWired Input 为例, 因为它可以对应多人多游戏杆设定, 所以我们只先取第一个设定即可, 而且, 确定是为本机玩家时, 才须要设定这个值, 若是这个 Tank 代表的是网络上其它玩家, 那我们就不须取得操控了. 参考如下:
6.png
TankMovement.cs 中 PhotonView.isMine 以及 ReWired Input 的设定
Tank Shooting
在 Tank 的炮弹射击操控, 同样的也须要在初始化(Awake)时, 取得玩家 Input System 的按键设定, 而且, 必须确定是为本机玩家时, 才须要设定这个值, 若是这个 Tank 代表的是网络上其它玩家, 那也就不须取得操控了. 参考如下:
7.png
TankShooting.cs 中, PhotonView.isMine 以及 ReWired Input 的设定

[PunRPC] 远程呼叫
在 Tank 的炮弹射击操控中, 除了可以用网络同步对象的方式建立炮弹, 另外也可以试试 PUN 提供的 RPC 来发射炮弹. 用这种方式在本机建立个炮弹对象, 不用跟远程玩家同步, 让这个炮弹的碰撞与移动, 直接发生在本机就好.

好处是执行的速度很快, 不必透过网络同步所有发射出去的炮弹位移.

使用方式是直接用 photonView.RPC() 呼叫即可, 而且可以设定一些参数传递出去, 程序写法可以参考如下:
8.png
TankShooting.cs, FireB() 为利用 PUN 提供的远程程序叫用(RPC)的方式产生炮弹

而被呼叫的 function, 只要在其宣告的前面加上 [PunRPC] 的tag, 就表示这个它可以被远程叫用. 底下以 FireOther() 为例:
9.png
[PunRPC] 是 PUN 中提供的 RPC 用的 tag. (TankShooting.cs)

程序参考
游戏场景用的 CompleteGame-PUN 是从 Assets\_Complete-Game 复制过来的, 而其中所用到的程序代码也就直接修改或是覆盖 Assets → _Completed-Assets → Scripts 即可, 完整的程序修改, 请参考下面的连结:

Managers 管理控制请放置在 Scripts → Managers :
GameManager.cs , TankManager.cs
10.png
Managers 管理控制相关

Tank 相关控制请放置在 Scripts →Tank :
TankMovement.cs , TankShooting.cs, TankHealth.cs
11.png
Tans 控制相关

Run & Test !
在 Unity Build Settings 的面板中, 我们加入本系列项目 VRPhotonTanks 建立的 SceneStart 场景以及修改过的 CompleteGame-PUN 场景, 来测试整体的执行效果!
12.png
UnityBuild And Run 执行, 一开始 Client 会尝试与 Photon Cloud 建立联机, 正常顺利的联机后, 就可在画面看到 Join Game Room, 按下它之后, 就会建立并且载入 CompleteGame-PUN 场景, 此时目前这个 Client 在 Photon 的术语里, 它的角色即为 MasterClient, 而在游戏场景内, 则可以看到有一台 Tank (玩家) 已进入游戏中.

此时, 再用 Unity Play Mode 来执行, 即可以用另一个 Client 进入同样的 Photon Room 里, 在游戏场景里就会看到有第二台坦克玩家出现了!

如果在 Unity 的 Build Settings 里的平台是 iOS or Android, 那么就可以看到 Play Mode 里面的执行会显示 VR 的仿真画面( GVR 1.4.0 以前提供).

如果用的是新版本 GoogleVR SDK 1.5.0, 那么 VR 模拟画面就得要另外自己做了, 否则只会出现像是 FPS Mode 一样的画面, 而双眼模拟画面的部份因篇幅的关系, 目前不在讨论范围里, 以后有机会再开教学来研究研究.

当然如果有更多的玩家进来时, 例如三个玩家 (我们有设定一个游戏室最多四人), 那么就会像是下面的画面, 玩家各自可以切换像是 VR Mode (有左右眼)、FPS Mode、以及 45度视角的各种不同画面.
13.png
三个玩家一起玩的情况 (VR Mode、FPS Mode、以及 45度视角)

如果您的执行效果也是如此, 那么实在是太棒了!
我们已经完成此系列的目标啰~

实作 Tips!!
在使用不同的手机与各式的蓝芽游戏杆游戏时, 也许会遇到无法正常设定操作 Input System 的问题, 这时得想个办法来抓取 GamePad / JoyStick 的按键值, 才能够在程序中设定相对应的操作.

Question
这里以 Sony Xperia 与他们自家非常著名的游戏游戏杆 DualShock 4 为例, 一般连结正常时, 手机主画面可以用 D-Pad 来上下左右的操作; 但是到游戏中, 原本在其它游戏杆可以正常操作的设定, 似乎无法在其上有效运作了, 这时可以从何处解决呢?

Answer
我们在此系列用到的 Input 操作是用 ReWired Input 这个 Unity Asset. 虽然它须要付费买, 但是它在对应各种 Bluetooth Controller/Joystick/GamePad 实在是很方便.
只要在有需要有 Input 的程序中, 引用加上 using Rewired; 当要取得按键值时, 再叫用 ReWired 提供的 API 即可, 跟 Unity Input 用法一样的简单!
14.png
using Rewired; 之后即可在程序中取用 ReInput 提供的 API 来抓按键值

而它在 Assets → Rewired → Extras → ControlMapper 里面有个场景:
ControlMapperDemo_1PlayerSimple
这个场景提供我们可以抓取游戏中任何的按键对应值, 所以可以单独 Build 出一个执行档, 放到手机上执行, 操作时可以看到如下的画面:
15.png
ControlMapperDemo (1人版本) 执行画面
16.png
按键值已对应到一些 Keyboard 的情况

随便选择一个 Button 按下, 再 5秒内按下 DualShock 的 D-Pad 或是 Button, 即可在手机画面上看到抓到的键名, 这时先不用管它是对应到这个工具的什么 Actions, 只要知道手上的游戏杆按下去的键是什么就好.

回到 Unity 里面, 在我们游戏场景中的 Rewired Input Manager, 按下它的组件里面 Launch ReWired Editor, 即可设定此场面所要用的按键数据.
17.png
Rewired Input Manager 里的快捷键, 可以 Launch Rewired Editor

在 ReWired Editor 中点选 Joystick Maps, 就可以设定 Sony DualShock 4 的与相关的 Action 按键名称对应值了~
18.png
设定动作(Action)对应的按键名
总结
至此, 本系列VRPhotonTanks 的 Unity 项目已完成啰~ 如果之前设定过 PUN、也玩过 Google Cardboard VR, 甚至使用过各种的 Input System 套件, 那么对于本系列的实作与知识的整合, 应该也只是小菜一盘.
虽然这里只是整合了所有组件的设定, 但是游戏整体的运作却很吸睛, 因为 VR + 实时联机的游戏, 不仅是目前最夯的话题, 也势必是往后的发展路线, 更不用说还有 AR MR 技术之类的应用, 只要结合了 Photon 所提供的实时联机技术与服务, 都会是很厉害的产品呢 !
回复

发表于 2017-12-19 14:54:54 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

威望28

懵币5279

帖子80

发布主题
阅读排行

下载盗梦APP

关注盗梦极客
一起玩转VR

© 2015 盗梦极客 | VR虚拟现实达人社区 | VR资源及VR眼镜教程 黑ICP备15006149号 VR新手指引 联系我们