我正在制作2台多人AR-VR Ping Pong手机游戏,使用 Hipivot Daydream Controller, 并且其文档编写得不好,并且绝对没有关于此控制器或其输入的资源或帖子 .

我真的不知道如何使用它的输入系统,所以我做的是基于它的 LeftHandAnchor 游戏对象位置,当我使用控制器时移动 .

我正在制作玩家(它是一个球体) . 它工作正常,但问题是,因为它的控制器如果我用光子网络实例化它不起作用 . 此控制器仅在事先在游戏场景上工作,因此它是服务器的一部分 .

所以,我正在做的是产生 playerSphere 而不是因为玩家后来试图通过 LeftHandAnchor 来控制它,并且场景中有两个 leftHandAnchorsOne for player1 and the other for player2 ) . 然而,它只适用于控制它的移动设备,并且在其他服务器中不显示任何移动 . 这是 LeftHandAnchor gameObject's script ,附在其上:

public class HowToReference: Photon.MonoBehaviour
{
    public GameObject myFirstObjectReference;
    float xPos = 94;
    public bool canMove;
    PhotonView pView;
    Vector3 selfPos;
    bool isVrModeOn;
    void Start()
    {
        myFirstObjectReference = GameObject.FindGameObjectWithTag("Player2");
        pView = myFirstObjectReference.GetComponent<PhotonView>();
        if (PlayerPrefs.GetInt("isVRModeOn") == 1) isVrModeOn = true;
        else isVrModeOn = false;
    }

    void Update()
    {
        if (pView.isMine)
        {
            CheckInput();
        }
        else
            SmoothNetMovement();
    }

    private void CheckInput()
    {
        if (!isVrModeOn)
        {
            myFirstObjectReference.transform.Translate(0, Input.acceleration.x * 10f, 0);
            if (myFirstObjectReference.transform.position.y > 31f)
            {
                myFirstObjectReference.transform.position = new Vector3(transform.position.x, 31, transform.position.z);
            }
            if (myFirstObjectReference.transform.position.y < -39f)
            {
                myFirstObjectReference.transform.position = new Vector3(transform.position.x, -39, transform.position.z);
            }
            return;
        }
        myFirstObjectReference.transform.position = new Vector3(xPos, (transform.position.x * -500) - 242, -86);
        if (myFirstObjectReference.transform.position.y > 32f)
        {
            myFirstObjectReference.transform.position = new Vector3(xPos, 32, -86);
        }
        if (myFirstObjectReference.transform.position.y < -35f)
        {
            myFirstObjectReference.transform.position = new Vector3(xPos, -35f, -86);
        }
    }

    private void SmoothNetMovement()
    {
        myFirstObjectReference.transform.position = Vector3.Lerp(myFirstObjectReference.transform.position, selfPos, Time.deltaTime * 10);
    }

    private void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        //if it the local player that is moving
        if (stream.isWriting)
        {
            stream.SendNext(myFirstObjectReference.transform.position);
        }
        //if not
        else
        {
            selfPos = (Vector3)stream.ReceiveNext();
        }
    }
}

我确实尝试了 [PunRPC] 功能,但是使用控制器的玩家看到其他玩家在控制自己的玩家时飞来飞去,而在其他设备上我看到0次移动因此它没有同步任何东西 . 这也是PhotonNetwork的instatiation功能:

private void OnSceneFinishedLoading(Scene scene, LoadSceneMode mode){
    if(scene.name == "Game"){
        SpawnPlayer ();
    }
}

private void SpawnPlayer(){
        GameObject[] spawnPoints = GameObject.FindGameObjectsWithTag("SpawnPoint");
        if(PhotonNetwork.room.PlayerCount == 1){
            GameObject playerClient = PhotonNetwork.Instantiate (mainPlayer.name, spawnPoints[0].transform.position, mainPlayer.transform.rotation,0) as GameObject;
            playerClient.GetComponent<PhotonView>().owner.NickName = "Player1";
            GameObject Controller = GameObject.FindGameObjectWithTag("ControllerOne");
            Controller.GetComponent<HowToReference>().enabled = true;
            playerClient.GetComponent<Player>().isControllerOne = true;
            playerClient.GetComponent<Player>().playerName.text = "Player1";
        }

        if(PhotonNetwork.room.PlayerCount == 2){
            GameObject playerClient = PhotonNetwork.Instantiate (mainPlayer2.name, spawnPoints[1].transform.position, mainPlayer2.transform.rotation,0)as GameObject;
            playerClient.GetComponent<Player> ().owner.NickName = "Player2";
            GameObject Controller = GameObject.FindGameObjectWithTag("ControllerTwo");
            Controller.GetComponent<HowToReference>().enabled = true;
            playerClient.GetComponent<Player> ().isControllerOne = false;
            playerClient.GetComponent<Player> ().playerName.text = "Player2";

        }
}

并且,在“播放器”脚本中,我不是移动播放器,只是设置初始位置 .

如何在服务器中同步PlayerMovement,以便其他玩家看到玩家移动并防止玩家在他的设备上使用控制器时飞来飞去?我知道控制游戏时一团糟 .