Photon中如何为玩家初始化相机
How to initialize the camera for players in Photon
我在做2D游戏,问题是当第一个玩家创建并出现在房间里时他的摄像头正常工作,但是当一个新玩家进入房间时,第一个玩家通过第二个玩家的摄像头看到一切播放器。此外,如果第三个玩家连接,第一个和第二个玩家通过第三个玩家的相机看到一切,依此类推。
Player prefab 在 GameManager class 中实例化,仅在游戏场景中
public class GameManager : MonoBehaviourPunCallbacks
{
public GameObject playerPrefab;
public Transform spawnPoint;
public void Start()
{
GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
player.GetComponent<FireFighterHeroController>().enabled = true;
player.GetComponent<CameraControler>().enabled = true;
player.GetComponent<CameraControler>().SetTarget(player.transform);
}
#region PUN Callbacks
public override void OnLeftRoom()
{
SceneManager.LoadScene(1);
}
#endregion
#region Custom Methods
public void OnClickLeaveRoom_Btn()
{
PhotonNetwork.LeaveRoom();
}
#endregion
}
简单的相机控制器
public class CameraControler : MonoBehaviour
{
private Transform target;
public GameObject camera;
public Vector3 offset;
public void SetTarget(Transform target)
{
this.target = target;
}
public void LateUpdate()
{
camera.transform.position = target.position + offset;
}
}
UPD 找到解决方案
我把camera controller的脚本移到了player的camera上,在player的instance中搜索这个camera,打开它,将player的transform传给它。
不确定这个方法,但它至少有效。
这是那个怪物
public class GameManager : MonoBehaviourPunCallbacks
{
public Transform spawnPoint;
public void Start()
{
GameObject player = PhotonNetwork.Instantiate("Player", spawnPoint.position, Quaternion.identity);
if (!player.GetPhotonView().IsMine)
return;
player.GetComponent<FireFighterHeroController>().enabled = true;
player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().enabled = true;
player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().SetTarget(player.transform);
player.transform.Find("Camera").gameObject.SetActive(true);
}
}
和相机控制器
public class CameraControler : MonoBehaviour
{
private Transform target;
public Vector3 offset;
public void SetTarget(Transform target)
{
this.target = target;
}
public void LateUpdate()
{
gameObject.transform.position = target.position + offset;
}
}
更新 - 在您发表评论后
您正在向所有玩家发送命令。
在发送命令之前,您应该检查接收命令的玩家是否是新玩家的所有者。
基本上你就是这样做的。
=> 创建播放器
=> 分配相机
什么时候应该这样做。
=> 创建播放器
=> 检查这是否是您的客户 => 分配相机
要实现这一点,您需要添加此检查:
if (photonView.IsMine) AssignCamera();
我看到您在管理器中发送命令。所以你有这些解决方案:
- 在管理器中添加一种方法来检查这是否是玩家
- (更好)将代码移到播放器脚本中。
在播放器脚本中添加代码
public class YourPlayer : Photon.MonoBehaviour
{
public void Start()
{
//stop assigning controls if this is not the player related to this peer
if(!photonView.IsMine) return;
player.GetComponent<FireFighterHeroController>().enabled = true;
player.GetComponent<CameraControler>().enabled = true;
player.GetComponent<CameraControler>().SetTarget(player.transform);
}
}
在管理器中添加支票
我不确定您代码的所有逻辑。有些代码应该适用于所有玩家,有些代码应该只适用于 Peer Related 玩家。
我认为您应该像这样更改 Start 方法:
public void Start()
{
GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
//stop assigning controls if this is not the player related to this peer
if(!player.GetPhotonView().IsMine) return;
player.GetComponent<FireFighterHeroController>().enabled = true;
player.GetComponent<CameraControler>().enabled = true;
player.GetComponent<CameraControler>().SetTarget(player.transform);
}
我在做2D游戏,问题是当第一个玩家创建并出现在房间里时他的摄像头正常工作,但是当一个新玩家进入房间时,第一个玩家通过第二个玩家的摄像头看到一切播放器。此外,如果第三个玩家连接,第一个和第二个玩家通过第三个玩家的相机看到一切,依此类推。
Player prefab 在 GameManager class 中实例化,仅在游戏场景中
public class GameManager : MonoBehaviourPunCallbacks
{
public GameObject playerPrefab;
public Transform spawnPoint;
public void Start()
{
GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
player.GetComponent<FireFighterHeroController>().enabled = true;
player.GetComponent<CameraControler>().enabled = true;
player.GetComponent<CameraControler>().SetTarget(player.transform);
}
#region PUN Callbacks
public override void OnLeftRoom()
{
SceneManager.LoadScene(1);
}
#endregion
#region Custom Methods
public void OnClickLeaveRoom_Btn()
{
PhotonNetwork.LeaveRoom();
}
#endregion
}
简单的相机控制器
public class CameraControler : MonoBehaviour
{
private Transform target;
public GameObject camera;
public Vector3 offset;
public void SetTarget(Transform target)
{
this.target = target;
}
public void LateUpdate()
{
camera.transform.position = target.position + offset;
}
}
UPD 找到解决方案
我把camera controller的脚本移到了player的camera上,在player的instance中搜索这个camera,打开它,将player的transform传给它。
不确定这个方法,但它至少有效。
这是那个怪物
public class GameManager : MonoBehaviourPunCallbacks
{
public Transform spawnPoint;
public void Start()
{
GameObject player = PhotonNetwork.Instantiate("Player", spawnPoint.position, Quaternion.identity);
if (!player.GetPhotonView().IsMine)
return;
player.GetComponent<FireFighterHeroController>().enabled = true;
player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().enabled = true;
player.transform.Find("Camera").gameObject.GetComponent<CameraControler>().SetTarget(player.transform);
player.transform.Find("Camera").gameObject.SetActive(true);
}
}
和相机控制器
public class CameraControler : MonoBehaviour
{
private Transform target;
public Vector3 offset;
public void SetTarget(Transform target)
{
this.target = target;
}
public void LateUpdate()
{
gameObject.transform.position = target.position + offset;
}
}
更新 - 在您发表评论后
您正在向所有玩家发送命令。
在发送命令之前,您应该检查接收命令的玩家是否是新玩家的所有者。
基本上你就是这样做的。
=> 创建播放器
=> 分配相机
什么时候应该这样做。
=> 创建播放器
=> 检查这是否是您的客户 => 分配相机
要实现这一点,您需要添加此检查:
if (photonView.IsMine) AssignCamera();
我看到您在管理器中发送命令。所以你有这些解决方案:
- 在管理器中添加一种方法来检查这是否是玩家
- (更好)将代码移到播放器脚本中。
在播放器脚本中添加代码
public class YourPlayer : Photon.MonoBehaviour
{
public void Start()
{
//stop assigning controls if this is not the player related to this peer
if(!photonView.IsMine) return;
player.GetComponent<FireFighterHeroController>().enabled = true;
player.GetComponent<CameraControler>().enabled = true;
player.GetComponent<CameraControler>().SetTarget(player.transform);
}
}
在管理器中添加支票
我不确定您代码的所有逻辑。有些代码应该适用于所有玩家,有些代码应该只适用于 Peer Related 玩家。
我认为您应该像这样更改 Start 方法:
public void Start()
{
GameObject player = PhotonNetwork.Instantiate(this.playerPrefab.name, spawnPoint.position, Quaternion.identity);
//stop assigning controls if this is not the player related to this peer
if(!player.GetPhotonView().IsMine) return;
player.GetComponent<FireFighterHeroController>().enabled = true;
player.GetComponent<CameraControler>().enabled = true;
player.GetComponent<CameraControler>().SetTarget(player.transform);
}