Я работаю над многопользовательской игрой и сталкиваюсь с проблемой, когда 2 игрока загружают один и тот же уровень с помощью PhotonNetwork.LoadLevel ().
Когда я запускаю игру один, я можете управлять моим плеером и все в порядке. Но когда мы 2 игрока, Игрок А контролирует Игрока Б и наоборот.
Я проверял много ссылок на inte rnet в последние несколько дней, и я изучил концепцию PhotonNetwork.IsMine, который, как я думал, решит все мои проблемы, но, похоже, не работает со мной. Кроме того, я использую новую систему ввода Unity, но я не думаю, что проблема возникла отсюда.
По сути, я делаю следующее:
- Создание экземпляра player (это произошло дважды, так как у меня есть 2 игрока), у которых есть PlayerManager
- Player Manager Получить экземпляр локального проигрывателя и синхронизировать камеру с локальным проигрывателем, только если isMine = true
- CameraManager создает ввод менеджер, если скрипт связан с локальным игроком с помощью isMine
- Привязать основную камеру к этому скрипту, когда менеджер игры запросит его
- Обновить поворот камеры только тогда, когда isMine имеет значение true (вторая защита)
Вот фрагмент моего кода:
GameManager.cs (удерживается объектом сцены, поэтому он изначально создается для каждого со сценой)
void Start()
{
if(PlayerManager.LocalPlayerInstance == null)
{
//Get player's team
string team = (string)PhotonNetwork.LocalPlayer.CustomProperties["Team"];
int indexPlayer = GetSpawnPosition();
//Spawn player depending on its team and its index in the players pool
if (team.Equals("Spy"))
{
PhotonNetwork.Instantiate(this.spyPrefab.name, SpySpawns[indexPlayer].position, SpySpawns[indexPlayer].rotation);
}
else if (team.Equals("Defender"))
{
PhotonNetwork.Instantiate(this.defenderPrefab.name, SpySpawns[indexPlayer].position, SpySpawns[indexPlayer].rotation);
}
}
}
PlayerManager.cs (удерживается игроком, поэтому изначально не создается для сцены)
void Awake()
{
//Keep track of the localPlayer to prevent instanciation when levels are synchronized
if (photonView.IsMine)
{
LocalPlayerInstance = gameObject;
}
//Don't destroy this gameobject so it can survives level synchronization
DontDestroyOnLoad(gameObject);
}
private void Start()
{
//Get Manager of the camera of the player and attach to the local player
CameraLookFPS cameraFPSManager = gameObject.GetComponent<CameraLookFPS>();
if (cameraFPSManager != null)
{
//Ensure that we the local player is controlling its own camera
if(photonView.IsMine == true)
{
cameraFPSManager.SynchronizeWithLocalPlayer();
}
}
else
Debug.Log("This player is missing the CameraLookFPS component");
}
CameraManager.cs (удерживается игроком, поэтому изначально не создается w Сцена)
private void Start()
{
//Synchronize camera with local player on start for debug
if(SynchronizeOnStart)
{
SynchronizeWithLocalPlayer();
}
//Bind input for controlling the camera
BindingInput();
}
private void BindingInput()
{
// Prevent control is connected to Photon and represent the localPlayer
if (photonView.IsMine == false && PhotonNetwork.IsConnected == true)
{
return;
}
else
{
//Get Components
Input_Master = new InputMaster();
//Enable
Input_Master.Enable();
//Input binding
Input_Master.Player.Look.performed += context => MoveCamera(context);
Input_Master.Player.Look.Enable();
}
}
public void SynchronizeWithLocalPlayer()
{
if (photonView.IsMine == false && PhotonNetwork.IsConnected == true)
{
return;
}
Player_Camera = Camera.main.transform;
isSynchronized = true;
}
Я пытался быть достаточно ясным, скажите мне, если что-то плохое объяснил. Я продолжу свои исследования со своей стороны и буду держать вас в курсе, если что-нибудь найду. Заранее спасибо за помощь!
Адриен