VR播放器控制器未显示给角色控制器
问题描述:
我正在开发多人游戏,其中正常角色控制器用户和VR用户可以参与。所以有两种模式的游戏通过用户可以加入,Normal和VR Mode。VR播放器控制器未显示给角色控制器
I am able to manage these modes and user can participate with any mode但问题是正常播放器(charcter控制器)无法查看VR控制器(HTC vive控制器),因为这些对象在字符控制器的一侧变得关闭。那么如何在正常播放器端显示VR播放器所在的VR控制器。
(我试过的)我制作了一个对象,试图模仿VR控制器的位置和旋转,但它不起作用,因为模拟源(VR控制器)关闭(在普通播放器端但在VR模式下工作),他们的位置不变。我如何向其他用户显示vr控制器
答
我已经设法解决了这个问题,经过三天四天的努力后使用了这些步骤。这些步骤在下面给出这样以后用户不会陷入这个问题,有没有其他可用的全面指导:
制作一个游戏对象为头(简单的立方体)与Network Identity和network transform
制作一个游戏对象为(右)控制器(简单的立方体)与网络身份和网络改造
让一个Gameo (左)其他控制器(简单立方体)与网络身份和网络变换
预制所有上述gameobjects。
添加三个组合屋为Network Manager(注册Spawnable预制件列表)
从现场
-
添加下面的脚本都是删除3个预制(详见注释)我的VR播放器,并分配相应的预制件和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; } }
恭喜你已经完成了!
嗨,我也有这个问题。这有点棘手。我所做的是在Awake上销毁SteamVR_TrackedObject,然后将控制器GameObject设置为活动状态。你在使用什么网络系统?我没有把它作为答案发布,因为我需要更多的信息。但我使用HTC vive制作多人游戏 – luizcarlosfx
@luizcarlosfx我正在使用Unity自己的unet网络系统 –
使用NetworkTransform来同步位置。销毁客户端上的SteamVR_TrackedObject,并确保您的控制器的游戏对象处于活动状态。我在开始时将它设置为活动。 – luizcarlosfx