Unity New Input Manager 和 Photon 问题
Unity New Input Manager and Photon issue
我正在开发一款多人游戏,当 2 名玩家使用 PhotonNetwork.LoadLevel() 加载同一关卡时我遇到了问题。
当我一个人开始游戏的时候,我可以控制我的播放器,一切都很好。但是当我们是2个玩家时,玩家A控制着玩家B,反之亦然。
这几天我在互联网上查看了很多链接,我学到了 PhotonNetwork.IsMine 的概念,我认为它可以解决我所有的问题,但它似乎不适合我。另外,我正在使用 Unity 的新输入系统,但我不认为问题出在此处。
基本上,我正在做的是:
- 实例化一个拥有 PlayerManager
的玩家(这发生了两次,因为我有 2 个玩家)
- 播放器管理器获取本地播放器的实例,仅当 isMine = true 时才与本地播放器同步相机
- 如果使用 isMine
将脚本链接到本地播放器,CameraManager 会创建输入管理器
- Link 当游戏管理员请求时主摄像头到此脚本
- 仅当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;
}
我尽量说得够清楚,告诉我是否有解释不当的地方。我会继续我的研究,如果我发现了什么,我会与你保持联系。
预先感谢您的帮助!
阿德里安
我终于找到了解决办法。看来我已经读过它,但在尝试解决它时失败了。
所以,像很多人一样,这是相机问题。
我所做的是:
- 创建一个持有相机的游戏对象并将其作为玩家游戏对象的子对象
- 停用拿着相机的游戏对象
- 实例化播放器时,检查播放器是否为本地播放器,使用PhotonNetwork.IsMine。如果是,通过脚本激活持有相机的游戏对象
有问题可以给我留言!
阿德里安
我正在开发一款多人游戏,当 2 名玩家使用 PhotonNetwork.LoadLevel() 加载同一关卡时我遇到了问题。
当我一个人开始游戏的时候,我可以控制我的播放器,一切都很好。但是当我们是2个玩家时,玩家A控制着玩家B,反之亦然。
这几天我在互联网上查看了很多链接,我学到了 PhotonNetwork.IsMine 的概念,我认为它可以解决我所有的问题,但它似乎不适合我。另外,我正在使用 Unity 的新输入系统,但我不认为问题出在此处。
基本上,我正在做的是:
- 实例化一个拥有 PlayerManager 的玩家(这发生了两次,因为我有 2 个玩家)
- 播放器管理器获取本地播放器的实例,仅当 isMine = true 时才与本地播放器同步相机
- 如果使用 isMine 将脚本链接到本地播放器,CameraManager 会创建输入管理器
- Link 当游戏管理员请求时主摄像头到此脚本
- 仅当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;
}
我尽量说得够清楚,告诉我是否有解释不当的地方。我会继续我的研究,如果我发现了什么,我会与你保持联系。 预先感谢您的帮助!
阿德里安
我终于找到了解决办法。看来我已经读过它,但在尝试解决它时失败了。 所以,像很多人一样,这是相机问题。 我所做的是:
- 创建一个持有相机的游戏对象并将其作为玩家游戏对象的子对象
- 停用拿着相机的游戏对象
- 实例化播放器时,检查播放器是否为本地播放器,使用PhotonNetwork.IsMine。如果是,通过脚本激活持有相机的游戏对象
有问题可以给我留言!
阿德里安