我正在制作2D游戏,问题是当第一个玩家创建并出现在房间中时,他的相机正常工作,但是当新玩家进入房间时,第一个玩家会通过第二个玩家的相机看到一切。此外,如果有第三位玩家连接,则第一位和第二位玩家都可以通过第三位玩家的相机看到所有内容,依此类推。
仅在游戏场景中的GameManager类中实例化的玩家预制
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找到了解决方案
我将摄像头控制器的脚本移到了播放器的摄像头上,在播放器的实例中,我搜索了该摄像头,将其打开并将播放器的变换传输到该摄像头。
不确定这种方法,但至少可以奏效。
这是那个怪物
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;
}
}
答案 0 :(得分:1)
更新-评论后
您正在将命令发送给所有玩家。
在发送命令之前,您应该检查接收命令的播放器是否是新播放器的所有者。
基本上,您正在这样做。
=>创建玩家
=> ASSIGN CAMERA
何时应该这样做。
=>创建玩家
=>检查您的客户=>分配摄像机
要实现这一点,您需要添加此检查:
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);
}
}
我不确定您代码的所有逻辑。某些代码应适用于所有播放器,其他一些代码应仅适用于与对等相关的播放器。
我认为您应该像这样更改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);
}