VR 播放器控制器未显示给角色控制器
VR Player controller is not showing to character controller
我正在开发一个 普通角色控制器用户 和 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 控制器)对象关闭(在正常播放器端但在 VR 模式下工作)并且它们的位置没有改变。如何在unity3d中向其他用户展示VR控制器?
经过三四天的努力,我已经成功地使用这些步骤解决了这个问题。下面给出了这些步骤,这样未来的用户就不会陷入这个问题,因为没有其他全面的指南可用:
制作一个头部游戏对象(简单立方体)
为(右)控制器制作一个 游戏对象(简单立方体),具有网络身份和网络转换
为(左)其他控制器制作一个游戏对象(简单立方体),具有网络身份和网络转换
对以上所有游戏对象进行预制。
将所有三个预制件添加到 Network Manager(已注册的 Spawnable 预制件列表)
从场景中删除三个预制件
将以下脚本(详见评论)添加到我的虚拟现实播放器中并分配相应的预制件和游戏对象
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 用户 可以参与的多人游戏。所以有两种游戏模式通过用户可以加入,
- 普通模式(角色控制器)
- VR 模式(HTC VR 耳机)
I am able to manage these modes and user can participate with any mode 但问题是 普通玩家(角色控制器)无法查看 VR 控制器(HTC Vive 控制器),因为这些对象在角色控制器一侧关闭。 那么我如何向普通玩家端显示 VR 控制器,了解 VR 玩家当前正在做什么。
(我试过的)我制作了一个物体并试图模仿它相对于 VR 控制器的位置和旋转,但它不能作为模仿源(VR 控制器)对象关闭(在正常播放器端但在 VR 模式下工作)并且它们的位置没有改变。如何在unity3d中向其他用户展示VR控制器?
经过三四天的努力,我已经成功地使用这些步骤解决了这个问题。下面给出了这些步骤,这样未来的用户就不会陷入这个问题,因为没有其他全面的指南可用:
- 制作一个头部游戏对象(简单立方体)
为(右)控制器制作一个 游戏对象(简单立方体),具有网络身份和网络转换
为(左)其他控制器制作一个游戏对象(简单立方体),具有网络身份和网络转换
对以上所有游戏对象进行预制。
将所有三个预制件添加到 Network Manager(已注册的 Spawnable 预制件列表)
从场景中删除三个预制件
将以下脚本(详见评论)添加到我的虚拟现实播放器中并分配相应的预制件和游戏对象
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; } }
恭喜你完成了!