VR游戏开发501开发一款联网的VR社交游戏(上)

VR游戏开发501 开发一款联网的VR社交游戏(上)

自从Facebook收购了Oculus之后,VR的潜力开始在网络虚拟社交领域开始展现。虚拟现实作为科技前沿大火的同时,作为VR应用开发者的我们又如何去忽视VR社交呢?
相对于传统的VR游戏而言,VR社交由于涉及网络编程,因此门槛稍微高一些。但在Unity5版本之后,Unity将以往繁琐的Network封装成了High Level API,这样极度的方便了Unity的网络游戏的开发,同时Unity也保留了Network Transport API来提供更灵活的网络工具。
那么,今天我们来使用Unity的Network Manager,也就是第一类工具来开发Unity的VR网络社交游戏。

搭建场景

作为第一章,我们仅需简单的一个平面来模拟地面就好,在开始动工之前,我们需要导入Unity的Standard Assets 中的Character包。
将Character中的FPSController拖入场景中,调整位置到合适,再给其添加一个Capsule和Cube的子物体,并调整为如图所示。最后更改Cube的位置和缩放到FPSController的前面位置,当做主角的眼睛(在测试时可以看清角色的旋转)。最终效果如下图。


VR游戏开发501开发一款联网的VR社交游戏(上)_第1张图片
场景的搭建和角色的设置

场景的阶层如下图:


VR游戏开发501开发一款联网的VR社交游戏(上)_第2张图片
场景的阶层设置

添加网络模块

当场景搭建完毕之后,在FPSController上添加Network Identity和Network Transform脚本,选中Network Identity中的Local Player Authority,将Network Transform中的Transform Sync Mode修改为Sunc Transform,并将已经做好的FPSController拖入Prefab文件夹(需自己新建)下面并修改名称为Player以保存。
在阶层视图中,添加一个空对象,并重命名为Network Manager,为其添加NetworkManager和NetworkManagerHUD脚本。


VR游戏开发501开发一款联网的VR社交游戏(上)_第3张图片
添加Network组件

以上两个脚本是Unity内建的脚本,在检视面板中,直接电脑Add Component并搜索Network即可添加。
此时,保存场景为Main Scene(场景名),删除场景中的FPSController物体(确保已经保存为Player的Prefab),将Player从Prefab文件夹中拖入Network Manager下面的Spawn Info中的Player Prefab中。
将当前场景添加到Build Scene中,并Build(Ctrl+B为快捷键)。


VR游戏开发501开发一款联网的VR社交游戏(上)_第4张图片
添加场景到Build Setting中

先在Unity中点击Play按钮,并LanHost作为主机,在Build的程序中,点击LAN Client以连接主机。
VR游戏开发501开发一款联网的VR社交游戏(上)_第5张图片
测试连接

当客户端连接完毕并移动的时候,你会发现屏幕在闪,并且操作Host的时候,Client的控制器也在移动。此时回到Unity中,观察会发现场景中拥有2个摄像机,那么问题就明了了。

解决上面的问题
很明显,解决上面问题的方案就是将主机和客户端做差别化处理。对于每个客户端而言,只能操控当前客户端的Player而不能操纵其他客户端的Player,并且其他客户端的Player应该不具有Camera这个组件。因此我们需要编写一个Player_NetworkSetup.cs的脚本。脚本内容如下。

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Player_NetworkSetup : NetworkBehaviour {
    [SerializeField] Camera fpsCharacterCamera;
    [SerializeField] AudioListener audioListener;
    [SerializeField] GameObject body;

    void Start () {
        if (isLocalPlayer)
        {
            GameObject.FindWithTag("MainCamera").SetActive(false);
            GetComponent().enabled = true;
            GetComponent().enabled = true;
            fpsCharacterCamera.enabled = true;
            audioListener.enabled = true;
            body.SetActive(false);
        }
    }
}

在上述脚本中,我们将Cube和Capsule放入一个叫body的空物体中,以便初始化。将上述脚本拖放到Player的Prefab中,取消Player的Prefab中的First Person Controller、Character Controller和其子物体firstPersonCharacter中的Camera的组件和Audio Listener的选中状态,并拖动Camera、Audio Listener和Body进入相应的位置并点击Apply按钮实施更改。
再次Build并测试场景,发现2个角色成功地可以在场景中移动了。

总结

至此,初次接触Unity网络编程的同学可以去Unity官网查看一下API的文档,或是参考一些图书以更加深入地了解网络编程。
在后面的几章,我们会更深入地探讨如何制作一款VR社交游戏。

你可能感兴趣的:(VR游戏开发501开发一款联网的VR社交游戏(上))