Unity新输入管理器和光子问题



我正在开发一款多人游戏,当两名玩家使用PhotonNetwork.LoadLevel((加载同一级别时,我遇到了一个问题。

当我独自开始比赛时,我可以控制我的球员,一切都很好。但当我们是两个球员时,球员A控制着球员B,反之亦然

在过去的几天里,我在互联网上查看了很多链接,我学到了PhotonNetwork.IsMine的概念,我认为它可以解决我的所有问题,但似乎对我不起作用。此外,我正在使用Unity的新输入系统,但我不认为问题来自这里。

基本上,我正在做的是:

  • 实例化一个有PlayerManager的玩家(因为我有两个玩家,所以这种情况发生了两次(
  • 玩家管理器获取本地玩家的实例,并仅当isMine=true时将相机与本地玩家同步
  • 如果脚本通过使用isMine链接到本地播放器,CameraManager将创建输入管理器
  • 当游戏管理员请求时,将主摄像头链接到此脚本
  • 仅当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(由玩家持有,因此最初没有与场景一起实例化(

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;
}

我试着说得足够清楚,如果有什么不好的解释,告诉我。我会继续我的研究,如果我发现什么,我会和你保持联系。提前感谢您的帮助!

Adrien

我终于找到了解决方案。看起来我已经读过了,但我在试图解决它时失败了。所以,和很多人一样,这是一个摄像头问题。我所做的是:

  • 创建一个拿着相机的游戏对象,并将其作为玩家游戏对象的子对象
  • 停用手持相机的游戏对象
  • 实例化玩家时,使用PhotonNetwork.IsMine检查玩家是否为本地玩家。如果是,则通过脚本激活持有相机的游戏对象

如果您有问题,请给我发消息!

Adrien

最新更新