gpt4 book ai didi

c# - Photon中如何为玩家初始化相机

转载 作者:行者123 更新时间:2023-11-30 17:26:35 24 4
gpt4 key购买 nike

我制作 2D 游戏时,问题是当第一个玩家创建并出现在房间中时,他的摄像头正常工作,但是当新玩家进入房间时,第一个玩家通过第二个玩家的摄像头看到一切。此外,如果第三个玩家连接,第一个和第二个玩家可以通过第三个玩家的摄像头看到一切,依此类推。

Player prefab在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
}

简单的相机 Controller

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 找到了解决方案

我将相机 Controller 的脚本移到了玩家的相机上,在玩家的实例中我搜索了这个相机,打开它并将玩家的变换传输给它。

不确定这种方法,但它至少有效。

这是怪物

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

和相机 Controller

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

更多信息:Player Networking - Photon PUN

关于c# - Photon中如何为玩家初始化相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56235834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com