7

通常のキャラクターコントローラーユーザーVRユーザーが参加できるマルチプレイヤーゲームを開発しています。ユーザーが参加できるゲームには2つのモードがあります。

  1. ノーマルモード(キャラクターコントローラー)
  2. VR モード (HTC VR ヘッドセット)

私はこれらのモードを管理でき、ユーザーは任意のモードに参加できますが、問題は、これらのオブジェクトがキャラクター コントローラーの側でオフになるため、ノーマル プレーヤー (キャラクター コントローラー) が VR コントローラー (HTC Vive コントローラー) を表示できないことです。 では、VR プレイヤーが現在何をしているのかを VR コントローラーにノーマル プレイヤー側に示すにはどうすればよいでしょうか

(私が試したこと)オブジェクトを作成し、VR コントローラーに対してその位置と回転を模倣しようとしましたが、模倣ソース (VR コントローラー) オブジェクトがオフになっているため機能しません (通常のプレーヤー側では、VR モードで動作しています)そして彼らの立場は変わりません。unity3d で VR コントローラーを他のユーザーに見せるにはどうすればよいですか??

4

1 に答える 1

5

3 4 日間懸命に努力した後、これらの手順を使用してこの問題を解決することができました。これらの手順は、他に利用可能な包括的なガイドがないため、将来のユーザーがこの問題に巻き込まれないように、以下に記載されています。

  1. Network Identityネットワーク トランスフォームを使用して、Head (単純な立方体)の Gameobjectを 1 つ作成します。

  2. ネットワーク ID とネットワーク変換を使用して、(右の) コントローラー (単純な立方体) 用に1 つのゲームオブジェクトを作成します。

  3. ネットワーク ID とネットワーク変換を使用して、(左) 他のコントローラー (単純な立方体)用に1 つのGameobject を作成します。

  4. 上記のすべてのゲームオブジェクトのプレハブを作成します。

  5. 3 つすべてのプレハブをNetwork Managerに追加します(登録済みのスポーン可能なプレハブ リスト)

  6. シーンから 3 つのプレハブを削除する

  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 に答える