这一篇不是原创,属于翻译和改编,e文好的话建议直接看原文。
原文链接:CONVRGE - Communities in virtual spaces. Supports the Oculus Rift.
内容如下:
这个教程拖得太久了。事实上一直有人在问,我们是如何在Convrge中让不同玩家通过网络连接在一起的。我们自己也尝试了一些不同的技术,这里希望将一些心得分享给虚拟现实的开发者,从而让大家可以在自己的游戏里面也支持网络。
实际上我们创办Convrge的目的就是为了解决一个问题,那就是让更多的人可以体验到炫酷的多人在线虚拟现实,而不是自娱自乐。
希望这篇文章可以帮大家解决在虚拟现实游戏中添加网络支持的问题。
我们将用到的开发工具有:
1.Unity 游戏引擎(Unity - Game Engine)
2.Photon Cloud(Exit Games推出的云服务 https://www.exitgames.com/en/PUN/Download )
3.Oculus Unity Integration(https://developer.oculus.com )
需要强调的一点是,不少多人在线的Oculus项目也在使用相同的工具。
当大家聊起在VR项目中如何支持网络时,最后的答案毫无悬念,那就是Photon。Photon的使用方法和Unity内置的标准网络工具非常相似,因此用起来很方便。与此同时,它又具备很多优秀的特性和灵活性。目前我们使用的是PUN+版本,这样可以在游戏中同时支持100个人。而价格只是区区95美金,相当划算。
好吧,接下来就是具体的教程。
视频连接如下:
如何使用Unity开发多人在线虚拟现实游戏(技术相关不喜勿入)
当我开始写作这个教程的时候,很快意识到用视频的形式会更方便。因此我会把一些重点写下来,同时用视频的方式记录每一步的操作。
以下是操作的重点:
1.首先在你的项目中导入Photon和Oculus Unity integration
2.把Oculus Player Controller prefab拖到游戏场景中中
3.创建一个C#脚本文件,用于处理网络连接以及初始化玩家角色的任务,然后将其关联到一个空的GameObject上(下面有完整的脚本内容)。
4.创建一个C#脚本文件,用于处理玩家的同步(下面有完整的脚本内容)。
5.创建一个空的GameObject,用于玩家的同步,向这个GameObject上面添加一个photon view,然后将下面的脚本component和它关联起来。
6.把刚才的GameObject拖到Resources文件夹,从而将其转化成一个prefab。这一点还是很有必要的,因为我们将会用这个prefab配合Photon的初始调用。
7.一旦玩家的prefab被初始化,我们需要把自己的玩家关联到Oculus Player Controller的CenterEyeAnchor上。然后我们需要使用Player controller的position/rotation信息来获取代表玩家角色的全局位置,使用CenterEyeAnchor的position/rotation来获取玩家角色的本地位置。
8.搞定收功,开始游戏吧。
下面是Step3中提到的脚本内容(NetworkedPlayer.cs):
using UnityEngine;
using System.Collections;
public class NetworkedPlayer : Photon.MonoBehaviour
{
public GameObject avatar;
public Transform playerGlobal;
public Transform playerLocal;
void Start ()
{
Debug.Log("i'm instantiated");
if (photonView.isMine)
{
Debug.Log("player is mine");
playerGlobal = GameObject.Find("OVRPlayerController").transform;
playerLocal = playerGlobal.Find("OVRCameraRig/TrackingSpace/CenterEyeAnchor");
this.transform.SetParent(playerLocal);
this.transform.localPosition = Vector3.zero;
// avatar.SetActive(false);
}
}
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
stream.SendNext(playerGlobal.position);
stream.SendNext(playerGlobal.rotation);
stream.SendNext(playerLocal.localPosition);
stream.SendNext(playerLocal.localRotation);
}
else
{
this.transform.position = (Vector3)stream.ReceiveNext();
this.transform.rotation = (Quaternion)stream.ReceiveNext();
avatar.transform.localPosition = (Vector3)stream.ReceiveNext();
avatar.transform.localRotation = (Quaternion)stream.ReceiveNext();
}
}
}
然后是step4中提到的脚本(NetworkController.cs):
using UnityEngine;
using System.Collections;
public class NetworkController : MonoBehaviour
{
string _room = "Tutorial_Convrge";
void Start()
{
PhotonNetwork.ConnectUsingSettings("0.1");
}
void OnJoinedLobby()
{
Debug.Log("joined lobby");
RoomOptions roomOptions = new RoomOptions() { };
PhotonNetwork.JoinOrCreateRoom(_room, roomOptions, TypedLobby.Default);
}
void OnJoinedRoom()
{
PhotonNetwork.Instantiate("NetworkedPlayer", Vector3.zero, Quaternion.identity, 0);
}
}
后续会有更多VR开发相关的教程,当然目前放的这些是需要有一点点基础的。我也会找时间写个从零开始的系列。
最后马上就是WWDC 2015了,让我们共同期待iOS9的最新消息。
加入我的知识星球,获取更多虚拟现实相关的开发知识(独家课程),行业现状分析(产品、公司和技术)和相关的工作机会。