VR 播放器控制器未向角色控制器显示
Posted
技术标签:
【中文标题】VR 播放器控制器未向角色控制器显示【英文标题】:VR Player controller is not showing to character controller 【发布时间】:2017-03-11 05:34:28 【问题描述】:我正在开发普通角色控制器用户和VR用户可以参与的多人游戏。所以游戏有两种模式,用户可以加入,
-
普通模式(字符控制器)
VR 模式(HTC VR 耳机)
I am able to manage these modes and user can participate with any mode 但问题是普通玩家(角色控制器)无法查看 VR 控制器(HTC Vive 控制器),因为这些对象在角色控制器一侧关闭。 那么如何向普通玩家展示 VR 控制器当前正在做什么。
(我尝试过的) 我制作了一个对象并尝试模仿其相对于 VR 控制器的位置和旋转,但由于模仿源(VR 控制器)对象已关闭(在正常玩家方但在 VR 模式下工作)并且他们的位置没有改变。如何在 unity3d 中向其他用户展示 VR 控制器??
【问题讨论】:
嗨,我也遇到了这个问题。这有点棘手。我所做的是在 Awake 时销毁 SteamVR_TrackedObject,然后将控制器 GameObject 设置为活动状态。你用的是什么网络系统?我没有将其发布为答案,因为我需要您提供更多信息。但我使用 HTC vive 制作多人游戏 @luizcarlosfx 我正在使用统一自己的 unet 网络系统 使用 NetworkTransform 同步位置。销毁客户端上的 SteamVR_TrackedObject,并确保控制器的游戏对象处于活动状态。我在开始时将其设置为活动状态。 【参考方案1】:经过三四天的努力,我已经设法使用这些步骤解决了这个问题。下面给出了这些步骤,以便将来的用户不会因为没有其他全面的指南可用而陷入此问题:
用Network Identity 和network transform 制作一个头部游戏对象(简单立方体)
使用网络身份和网络转换为(右)控制器制作一个游戏对象(简单立方体)
使用网络身份和网络转换为(左)其他控制器制作一个游戏对象(简单立方体)
制作上述所有游戏对象的预制件。
将所有三个预制件添加到Network Manager(已注册的可生成预制件列表)
从场景中删除三个预制件
在我的虚拟现实播放器中添加了下面的脚本(详见 cmets)并分配相应的预制件和游戏对象
public class VRPlayerCtrl : NetworkTransform
//source gameobjects head, left and right controller object of htc vive prefab
public GameObject rightContSource;
public GameObject leftContSource;
public GameObject headObjSource;
//prefabs to assign head, left controller, and right controller
public GameObject vrHeadObjPrefab;
public GameObject vrLeftCtrlPrefab;
public GameObject vrRightCtrlPrefab;
GameObject vrHeadObj;
GameObject vrLeftCtrl;
GameObject vrRightCtrl;
void Start()
Debug.Log("Start of the vr player");
if (isLocalPlayer)
//instantiate prefabs
CmdInstantiteHeadAndController();
//disabled conroller meshes at VR player side so it cannont be view by him
vrLeftCtrl.GetComponent<MeshRenderer>().enabled = false;
vrRightCtrl.GetComponent<MeshRenderer>().enabled = false;
//Instantiate on start head and vr controller object so that it can be view by normal players
void CmdInstantiteHeadAndController()
Debug.Log("instantiateing the controller and head object");
vrHeadObj = (GameObject)Instantiate(vrHeadObjPrefab);
vrLeftCtrl = (GameObject)Instantiate(vrLeftCtrlPrefab);
vrRightCtrl = (GameObject)Instantiate(vrRightCtrlPrefab);
// spawn the bullet on the clients
NetworkServer.Spawn(vrHeadObj);
NetworkServer.Spawn(vrLeftCtrl);
NetworkServer.Spawn(vrRightCtrl);
void Update()
if (!isLocalPlayer)
return;
//sync pos on network
CmdControllerPositionSync();
//sync position on VR controller objects so that VR player movemnts/action can be viewd by normal user
[Command]
public void CmdControllerPositionSync()
vrHeadObj.transform.localRotation = headObjSource.transform.localRotation;
vrHeadObj.transform.position = headObjSource.transform.position;
vrLeftCtrl.transform.localRotation = leftContSource.transform.localRotation;
vrRightCtrl.transform.localRotation = rightContSource.transform.localRotation;
vrLeftCtrl.transform.localPosition = leftContSource.transform.position;
vrRightCtrl.transform.localPosition = rightContSource.transform.position;
恭喜你完成了!
【讨论】:
以上是关于VR 播放器控制器未向角色控制器显示的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Unity 中为桌面 VR 应用逐帧显示 360 度视频?
H265流媒体播放器EasyPlayerPro如何获取当前屏幕分辨率?