Как инициализировать камеру для игроков в Фотоне - PullRequest
3 голосов
/ 21 мая 2019

Я делаю 2D-игру, проблема в том, что когда первый игрок создает и появляется в комнате, его камера работает нормально, но когда новый игрок входит в комнату, первый игрок видит все через камеру второго игрока.Кроме того, если подключается третий игрок, первый и второй игроки видят все через камеру третьего игрока и т. Д.

Префаб игрока, созданный в классе GameManager, который находится только на игровой сцене

public class GameManager : MonoBehaviourPunCallbacks
    {
        public GameObject playerPrefab;
        public Transform spawnPoint;

        public void Start()
        {
            GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
            player.GetComponent<FireFighterHeroController>().enabled = true;
            player.GetComponent<CameraControler>().enabled = true;
            player.GetComponent<CameraControler>().SetTarget(player.transform);
        }

        #region PUN Callbacks

        public override void OnLeftRoom()
        {
            SceneManager.LoadScene(1);
        }

        #endregion

        #region Custom Methods

        public void OnClickLeaveRoom_Btn()
        {
            PhotonNetwork.LeaveRoom();
        }

        #endregion
}

Простой контроллер камеры

public class CameraControler : MonoBehaviour
    {
        private Transform target;
        public GameObject camera;
        public Vector3 offset;

        public void SetTarget(Transform target)
        {
            this.target = target;
        }

        public void LateUpdate()
        {
            camera.transform.position = target.position + offset;
        }
    }

UPD Нашел решение

Я переместил скрипт контроллера камеры на камеру игрока, и в экземпляре игрока янайдите эту камеру, включите ее и перенесите в нее преобразование игрока.

Не уверен насчет этого метода, но он хотя бы работает.

Вот этот монстр

public class GameManager : MonoBehaviourPunCallbacks
    {
        public Transform spawnPoint;

        public void Start()
        {
            GameObject player = PhotonNetwork.Instantiate("Player", spawnPoint.position, Quaternion.identity);

            if (!player.GetPhotonView().IsMine)
                return;
            player.GetComponent<FireFighterHeroController>().enabled = true;
            player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().enabled = true;
            player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().SetTarget(player.transform);
            player.transform.Find("Camera").gameObject.SetActive(true);
        }
}

и контроллер камеры

public class CameraControler : MonoBehaviour
    {
        private Transform target;
        public Vector3 offset;

        public void SetTarget(Transform target)
        {
            this.target = target;
        }

        public void LateUpdate()
        {
            gameObject.transform.position = target.position + offset;
        }
    }

1 Ответ

1 голос
/ 21 мая 2019

ОБНОВЛЕНИЕ - ПОСЛЕ ВАШЕГО КОММЕНТАРИИ
Вы отправляете команды всем игрокам.

Перед отправкой команды вы должны проверить, является ли игрок, получающий команду, ВЛАДЕЛЕЦновый игрок.

В основном вы это делаете.

=> СОЗДАТЬ ИГРОКА
=> НАЗНАЧИТЬ КАМЕРУ

Когда вам нужно это.

=> CREATE PLAYER
=> ПРОВЕРЬТЕ, ЕСЛИ ЭТОТ ВАШ КЛИЕНТ => НАЗНАЧИТЕ КАМЕРУ

Для этого вам необходимо добавить эту проверку:

if (photonView.IsMine) AssignCamera();

Я вижу, что выотправив команду в менеджер.Итак, у вас есть следующие решения:

  • Добавьте в диспетчере способ проверить, является ли это игрок
  • (лучше) переместить код внутри скрипта игрока.

ДОБАВИТЬ КОД ВНУТРИ СКРИПТА ИГРОКА

public class YourPlayer : Photon.MonoBehaviour
{
    public void Start()
    {
        //stop assigning controls if this is not the player related to this peer
        if(!photonView.IsMine) return;
        player.GetComponent<FireFighterHeroController>().enabled = true;
        player.GetComponent<CameraControler>().enabled = true;
        player.GetComponent<CameraControler>().SetTarget(player.transform);
    }
}

ДОБАВИТЬ ПРОВЕРКУ В МЕНЕДЖЕР

Я не уверен во всей логике вашего кода.Какой-то код должен применяться ко всем игрокам, какой-то другой код должен применяться только к игроку, имеющему отношение к сверстникам.

Я думаю, вам следует просто изменить метод запуска следующим образом:

public void Start()
{
    GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);

    //stop assigning controls if this is not the player related to this peer
    if(!player.GetPhotonView().IsMine) return;
    player.GetComponent<FireFighterHeroController>().enabled = true;
    player.GetComponent<CameraControler>().enabled = true;
    player.GetComponent<CameraControler>().SetTarget(player.transform);
}

Дополнительная информация: Сеть игрока - Photon PUN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...