基于Unity的多人在线VR游戏构建

2017年03月30日 16:20 0 点赞 0 评论 更新于 2025-11-21 21:18
基于Unity的多人在线VR游戏构建

随着VR玩家群体的不断扩大,开发者们愈发关注VR环境中的互联与社交功能。本文将详细探讨如何构建一个基于Unity的多人在线VR游戏基础架构。在本文中,我们使用的Unity版本为Pro 5.5.1,硬件以Oculus Rift CV1为例,不过该方法同样适用于其他PC端VR设备。

关键点一:玩家互联

在Unity中开发多人在线VR游戏,首要任务是实现玩家之间的互联。我们将采用Photon Unity Networking(简称PUN)来达成这一目标。对于有联网游戏开发经验的Unity3D开发者而言,Photon并不陌生。它是一款实时多人游戏开发框架,相较于Unity内置的网络工具开发包,PUN功能更为成熟、强大且灵活,在全球拥有数十万开发者。PUN可直接从Unity Asset Store免费下载,其免费版支持20人同时在线。

下载并将PUN导入Unity后,我们要创建一个新场景,并在场景中创建一个空白物体,将其命名为“ConnectionObject”。这个物体将承担玩家联网、创建玩家Avatar、连接联网玩家与VR虚拟相机等一系列联网相关的功能。

加载脚本

  1. Connect And Join Random脚本:在“Connection Object”上加载PUN自带的“Connect And Join Random”脚本。我们可以把Photon的联网架构类比为一个旅馆,玩家进入游戏时会先进入大厅(Lobby),随后PUN会将玩家分配到不同的房间(Room),只有处于同一房间的玩家才能相互交流。“Connect And Join Random”脚本就如同旅馆前台,它能让玩家进入大厅,检查是否有空位房间,随机分配房间给玩家,若没有空位房间则会新开一个房间。
  2. Show Status When Connecting脚本:为了更清晰地检查网络连接状态,我们可以加载PUN自带的“Show Status When Connecting”脚本,这样在游戏运行时就能直观地看到是否已连接。

编写PlayerMovement脚本

最后,编写“PlayerMovement”脚本并添加到“Connection Object”上,该脚本用于生成玩家Avatar,并定义跟随的虚拟摄像机。此代码将在后续详细介绍。

关键点二:创建玩家Avatar

与第一人称VR游戏不同,多人联网VR游戏需要玩家之间进行互动,因此玩家需要看到彼此的虚拟形象(Avatar)。这里我们使用一个带有连接跑动动画的全身虚拟形象。

加载组件

除了在玩家Avatar上加载“Character Controller”以实现游戏控制、加载“Animator”以实现Avatar运动动画等常规操作外,我们还需要进行以下操作:

  1. PhotonView组件:加载PUN自带的“PhotonView”组件,为玩家分配编号,从而在房间中的众多联网玩家中确定当前本地玩家。
  2. PhotonTransform View组件:加载“PhotonTransform View”组件,并将其拖入“Photon View”的“Observed Componets”中。

编写控制脚本

编写“NetworkPlayerMove”脚本,用于控制玩家的移动、速度、动画切换等。在该脚本的“Update”函数中,我们需要确定所操控的是当前玩家,关键代码如下:

public class NetworkPlayerMove : MonoBehaviour {
void Update() {
if (m_PhotonView.isMine == true) { // 确定只操控当前玩家
UpdateMovement();
MoveCharacterController();
ApplySynchronizedValues();
}
UpdateAnimation();
}
}

在“UpdateMovement()”功能函数中,我们可以定义操控玩家Avatar前后左右移动的方式,例如使用Oculus Rift配备的Oculus Remote的上下左右按键、Xbox Controller、Oculus Touch或者鼠标键盘等。需要注意的是,该功能仅控制玩家的移动,玩家的旋转将通过头戴HMD的旋转来控制。

转换为Prefab

玩家Avatar需要以Prefab的形式在玩家进入游戏房间时自动生成。因此,我们要将准备好的玩家Avatar转换为Prefab文件,并创建一个“Resources”文件夹来存储该Prefab。这是因为后续用于生成玩家Avatar的“PhotonNetwork.Instantiate”功能仅能从“Resources”文件夹中查找Prefab文件。

关键点三:虚拟摄像机跟随

在多人在线VR游戏中,只有一个主摄像机(即HMD对应的虚拟摄像机)。当玩家进入游戏房间时,主摄像机应始终跟随当前玩家,并位于当前玩家Avatar的眼睛部位。

配置Player Settings

首先,确保在“Player Settings”中勾选“Virtual Reality Supported”选项。

创建摄像机父元素

为了更方便地控制摄像机,我们创建一个空白物体“Camera”作为主摄像机的父元素,并调整摄像机父元素和主摄像机的位置,确保当摄像机父元素的位置与玩家Avatar位置一致时,主摄像机位于玩家Avatar的眼睛部位。

编写MultiplayerCamera脚本

在摄像机父元素“Camera”上添加“MultiplayerCamera”脚本,该脚本用于将主摄像机固定在当前玩家Avatar的眼睛位置,并利用HMD的旋转来控制玩家Avatar的旋转。完整脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MultiplayerCamera : MonoBehaviour {
public Transform Target; // 当前玩家Avatar
void LateUpdate() {
if (Target == null) {
return;
}
transform.position = Target.transform.position; // 主摄像机位置与当前玩家Avatar位置一致
float temp = transform.Find("Main Camera").gameObject.transform.eulerAngles.y;
Target.transform.eulerAngles = new Vector3(0, temp, 0); // 当前玩家Avatar随着HMD旋转而旋转
}
}

完成基本构架

综上所述,我们已经实现了玩家之间的连线,为每个玩家准备了可复制的Avatar,Avatar的移动、动画等仅能由玩家自己控制,玩家Avatar的旋转由HMD控制,并且游戏虚拟主摄像机始终跟随玩家Avatar的眼睛位置。

接下来,我们只需在玩家连线进入房间时为其生成Avatar,并告知主摄像机当前要跟随的对象。这正是我们之前赋予“Connection Object”的“PlayerMovement”脚本的功能,完整代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour {
public MultiplayerCamera Camera;  // 主相机的父元素
public string Player; // 已经定义并储存于Resources文件夹的Prefab,这里只要以string的形式写出Prefab的名字即可
void OnJoinedRoom() {
Vector3 position = new Vector3(0, 0, 0);
GameObject newPlayerObject = PhotonNetwork.Instantiate(Player, position, Quaternion.identity, 0); // 生成Prefab的玩家Avatar
Camera.Target = newPlayerObject.transform; // 确定主相机的跟随对象
}
}

至此,利用Oculus Rift在Unity中创建多人在线VR游戏的基本构架就搭建完成了。

作者信息

孟子菇凉

孟子菇凉

共发布了 3994 篇文章