VR播放器控制器未显示到角色控制器。

7
我正在开发一个多人游戏,普通角色控制器用户和VR用户可以参与。因此,有两种游戏模式,用户可以加入:
  1. 普通模式(角色控制器)
  2. VR模式(HTC VR头戴设备)
我能够管理这些模式,并且用户可以使用任何模式参与,但问题是普通玩家(角色控制器)无法查看VR控制器(HTC Vive控制器),因为这些对象在角色控制器一侧变为关闭状态。所以,我该如何向普通玩家展示VR玩家当前的操作呢?
(我尝试过的方法)我制作了一个对象,并尝试模拟它相对于VR控制器的位置和旋转,但由于模仿源(VR控制器)对象已关闭(在普通玩家一侧),其位置不会改变。那么,我该如何在Unity3D中向其他用户显示VR控制器呢?

嗨,我也遇到了这个问题。这有点棘手。我的做法是在 Awake 中销毁 SteamVR_TrackedObject,然后将控制器 GameObject 设置为活动状态。你使用的是什么网络系统?我没有将其发布为答案,因为我需要更多的信息。但是我使用 HTC Vive 制作了多人游戏。 - luizcarlosfx
@luizcarlosfx 我正在使用Unity自带的UNET网络系统。 - Muhammad Faizan Khan
使用NetworkTransform同步位置。在客户端上销毁SteamVR_TrackedObject,并确保您的控制器游戏对象处于活动状态。我在启动时将其设置为活动状态。 - luizcarlosfx
1个回答

5

经过三四天的努力尝试,我已经成功解决了这个问题。以下是我的解决步骤,以便未来的用户不会陷入困境,因为没有其他详细的指南可用:

  1. Make one Gameobject for Head (simple cube) with Network Identity and network transform

  2. Make one Gameobject for(right) Controller (simple cube) with Network Identity and network transform

  3. Make one Gameobject for(left) other Controller (simple cube) with network Identity and network transform

  4. Make prefab of all above gameobjects.

  5. Add all three prefabs into Network Manager (registered Spawnable prefabs list)

  6. delete three prefab from scene

  7. Added below script(See comments for details) into my vr player and assign respective prefabs and gameobjects

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

恭喜你完成了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接