Я работаю над многопользовательской игрой, и у меня возникает проблема, когда 2 игрока загружают один и тот же уровень с помощью PhotonNetwork.LoadLevel ().
Когда я запускаю игру один, я могу управлять своим плеером, и все в порядке. Но когда нас двое, игрок А контролирует игрока Б, и наоборот.
Я проверял множество ссылок в Интернете за последние несколько дней, и я изучил концепцию PhotonNetwork.IsMine, которая, как я думал, решит все мои проблемы, но, похоже, не работает со мной. Кроме того, я использую новую систему ввода Unity, но не думаю, что проблема здесь.
В основном, что я делаю:
- Создайте экземпляр игрока (это произошло дважды, так как у меня 2 игрока), у которого есть PlayerManager
- Player Manager Получить экземпляр локального плеера и синхронизировать камеру с локальным плеером, только если isMine = true
- CameraManager создает диспетчер ввода, если сценарий связан с локальным проигрывателем с помощью isMine.
- Свяжите основную камеру с этим скриптом, когда геймменеджер запросит это.
- Обновлять поворот камеры, только когда isMine истинно (вторая защита)
Вот фрагмент моего кода:
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 (удерживается игроком, поэтому изначально не создается со сценой)
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;
}
Я постарался быть достаточно ясным, скажите мне, если что-то не так объяснили. Я продолжу свое исследование на своей стороне и буду держать вас в курсе, если что-то найду. Заранее спасибо за помощь!
Адриан