C# Unity Photon проблема спавна

Когда игрок входит на сервер работает следуйшый код, когда входит первый игрок все нормально, когда входит второй спавнится* 3 player(Clone);

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;
using System.IO;

public class gameManag : MonoBehaviourPunCallbacks
{
    // public Text chat;
    public GameObject PlayerPf;
    public GameObject CameraPf;
    public Managmant NAME;
    private PhotonView play;
    private Vector3[] spawn = new []{new Vector3(0f,19f,65f),new Vector3(80f,19f,65f),new Vector3(80f,-24f,65f),new Vector3(0f,-24f,65f)};
    private void Start()
    {
        PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs","player"),spawn[UnityEngine.Random.Range(0,3)],Quaternion.identity);
        // GameObject.Find("player(Clone)").name = PhotonNetwork.NickName;
        // PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs","Cam"),new Vector3(GameObject.Find(PhotonNetwork.NickName).transform.position.x,GameObject.Find(PhotonNetwork.NickName).transform.position.y,-30f),Quaternion.identity);
        // GameObject.Find("Cam(Clone)").name = PhotonNetwork.NickName+"cam";
    }
    public override void OnPlayerEnteredRoom(Player newPl)
    {
        // PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs","player"),spawn[Random.Range(0,3)],Quaternion.identity);
        // GameObject.Find("player(Clone)").name = PhotonNetwork.NickName;
        // PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs","Cam"),new Vector3(GameObject.Find(PhotonNetwork.NickName).transform.position.x,GameObject.Find(PhotonNetwork.NickName).transform.position.y,-30f),Quaternion.identity);
        // GameObject.Find("Cam(Clone)").name = PhotonNetwork.NickName+"cam";
    }
}

Ответы (1 шт):

Автор решения: ssa112112

Ваш скрипт gameManag выполняется на всех инстансах игры. В момент когда заходит 2-ой игрок выполняются OnPlayerEnteredRoom у первого игрока; Start и OnPlayerEnteredRoom у второго игрока. Что бы с этим справится есть несколько вариантов

  1. Удалить OnPlayerEnteredRoom и писать класс gameManag с расчетом что он будет выполняться у всех игроков

или, предпочтительнее

  1. Делать проверку в классе gameManag IsMasterClient, например
   private void Start()
   {
       Spawn();
   }

    private override void OnPlayerEnteredRoom(Player newPl)
    {
       Spawn();
    }

    private void Spawn()
    {
       if (!PhotonNetwork.IsMasterClient) return;

       PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs","player"), spawn[UnityEngine.Random.Range(0,3)], Quaternion.identity);
    }
  1. В принципе, ещё можно использовать обычный Instantiate, а не Pthoton

PS: обратите также внимание, что в вашем случаи игроки могут заспауниться в одном и том же месте.

PPS: вот чертовки классный русскоязычный туториал по Photon https://www.youtube.com/watch?v=aqxzrk-pl-8

→ Ссылка