7

我正在开发一个普通角色控制器用户VR 用户可以参与的多人游戏。所以有两种模式的游戏通过用户可以加入,

  1. 普通模式(字符控制器)
  2. VR 模式(HTC VR 耳机)

我能够管理这些模式,用户可以参与任何模式,但问题是普通玩家(角色控制器)无法查看 VR 控制器(HTC Vive 控制器),因为这些对象在角色控制器一侧关闭。 那么我如何向普通玩家展示 VR 玩家当前正在做什么的 VR 控制器

(我已经尝试过)我制作了一个对象并尝试模仿其相对于 VR 控制器的位置和旋转,但它无法正常工作,因为模仿源(VR 控制器)对象已关闭(在正常玩家端但在 VR 模式下工作)他们的立场没有改变。如何在 unity3d 中向其他用户展示 VR 控制器?

4

1 回答 1

5

经过三四天的努力,我已经设法使用这些步骤解决了这个问题。下面给出了这些步骤,以便未来的用户不会陷入这个问题,因为没有其他全面的指南可用:

  1. 使用网络身份网络转换为头部(简单立方体)制作一个游戏对象

  2. 使用网络身份和网络转换为(右)控制器(简单立方体)制作一个游戏对象

  3. 使用网络身份和网络转换为(左)其他控制器(简单立方体)制作一个游戏对象

  4. 制作上述所有游戏对象的预制件。

  5. 将所有三个预制件添加到网络管理器(已注册的 Spawnable 预制件列表)

  6. 从场景中删除三个预制件

  7. 在我的 vr 播放器中添加了以下脚本(有关详细信息,请参阅评论)并分配相应的预制件和游戏对象

    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;
    }
    
    }
    

恭喜你完成了!

于 2016-11-07T07:43:44.580 回答