Unity3D多人游戏中摄像机的奇怪行为

Unity3D多人游戏中摄像机的奇怪行为,unity3d,camera,multiplayer,photon,Unity3d,Camera,Multiplayer,Photon,我是unity的新手,我正在努力对付我相机的奇怪行为。 我正在用光子插件编程一个在线多人游戏 奇怪的行为: Player1登录 -->一切都好 Player2登录 -->Player1的摄像头切换到Player2角色 -->Player2的摄像头切换到Player1角色​ Player3登录 -->播放器1和播放器2的摄像头切换到播放器3角色 -->Player3的摄像头切换到Player2角色。​ (但移动控制器对每个玩家都正常工作) 我得到了一个角色的预制件,它在inspector里连了

我是unity的新手,我正在努力对付我相机的奇怪行为。 我正在用光子插件编程一个在线多人游戏

奇怪的行为:

  • Player1登录

    -->一切都好

  • Player2登录

    -->Player1的摄像头切换到Player2角色

    -->Player2的摄像头切换到Player1角色​

  • Player3登录

    -->播放器1和播放器2的摄像头切换到播放器3角色

    -->Player3的摄像头切换到Player2角色。​

(但移动控制器对每个玩家都正常工作)

我得到了一个角色的预制件,它在inspector里连了一个摄像头

这是我的初始化代码:

公共类NetworkPlayer:Photon.Pun.monobhaviouspun,Photon.Pun.ipUnobserveable
{
公共动画;
私人矢量3;
私人四元数修正;
公共游戏对象myCam;
//在第一帧更新之前调用Start
void Start()
{
if(photonView.IsMine)
{
Log(“PhotonView.IsMine==true”);
//卡梅拉和斯特隆·阿基维耶伦
myCam=GameObject.Find(“摄影机”);
myCam.SetActive(true);
GetComponent().enabled=true;
Log(“Steuerung和Cam aktiviert…”);
}
}
//每帧调用一次更新
无效更新()
{
如果(!photonView.IsMine)
{
transform.position=Vector3.Lerp(transform.position,this.correctPlayerPos,Time.deltaTime*5);
transform.rotation=Quaternion.Lerp(transform.rotation,this.correctPlayerRot,Time.deltaTime*5);
}
}
//交换位置数据
在PhotonSerializeView(PhotonStream流、PhotonMessageInfo信息)上公开作废{
if(stream.IsWriting)
{
//向其他人发送数据
stream.SendNext(transform.position);
stream.SendNext(transform.rotation);
stream.SendNext(anim.GetBool(“Run”);
} 
其他的
{
//从他人处接收数据
this.correctPlayerPos=(Vector3)stream.ReceiveNext();
this.correctPlayerRot=(四元数)stream.ReceiveNext();
SetBool(“Run”,(bool)stream.ReceiveNext());
}
}
}
我还尝试通过inspector连接相机,而不是像上面的代码示例那样搜索它。 希望任何人都能在这方面帮助我:(


谢谢您的时间!

我的猜测是您在播放器上设置了
设置(true)
,但是从您的图片来看,相机默认情况下处于活动状态!因此每个新相机都添加到层次结构中先前相机的下方,使其成为顶部渲染的相机

您只需在播放器预置中禁用
摄像头

无论如何,你也应该主动禁用脚本中其他玩家的相机,这样你就不会忘记/不必依赖于将预设设置为特定状态

公共类NetworkPlayer:Photon.Pun.monobhaviouspun,Photon.Pun.ipUnobserveable
{
公共动画;
//您正在通过检查员为预制件提交此文件
//我也会使用合适的类型作为安全保护
//这样一来,除了相机之外,你就不能偶然引用其他东西了
公共摄像机;
//您也应该已经通过检查员进行检查
公众游戏者运动游戏者运动;
私人矢量3;
私人四元数修正;
//使用“唤醒”收集组件和引用作为回退
//如果他们没有通过检查员引用
私人空间
{
获取组件();
} 
//仅当组件未通过检查器引用时才获取组件
//这就节省了不必要的GetComponent调用,这些调用非常昂贵
//
//+personal pro提示:通过使用上下文菜单,您现在也可以在Inspector中单击FetchComponents
//这样你
//a)不必手动搜索和拖动它们
//b)已经可以看到它是否在以后的运行时也可以工作
[上下文菜单(获取组件的名称))]
私有组件()
{
如果(!playerMovement)playerMovement=GetComponent();
如果(!anim)anim=GetComponent();
//使用GetComponentInChildren检索您自己的组件
//或者你的孩子!
//通过true,也可以禁用或停用
如果(!myCam)myCam=getComponentChildren(true);
}       
//现在,不仅要为玩家做你的事情,还要主动禁用这些东西
//在所有其他玩家身上
私有void Start()
{
var isMine=photonView.isMine;
Log($“PhotonView.IsMine=={IsMine}”);
//为您启用cam,为其他人禁用cam!
myCam.gameObject.SetActive(isMine);
//为您启用控件,为其他人禁用它们
playerMovement.enabled=isMine;
Log($“Steuerung und Cam{isMine?”:“de”}aktiviert…”);
}
...
}

GameObject.Find将在当前运行的场景中搜索与给定字符串匹配的名称。如果有多个游戏对象具有相同的名称,那么这不是找到特定游戏对象的可靠方法。你可能想看看这是否是问题所在,在这种情况下,用另一种方式找到你的相机。嘿,西蒙,谢谢你的快速回答!我还尝试将相机直接分配到Inspector中。但这并没有解决问题。你是说如何在inspector中分配它?我将变量GameObject myCam声明为public,并将相机(连接到玩家预置)拉到脚本中(也连接到预置)。我还删除了start方法中的GameObject.find命令!这解决了我的问题!我忘了禁用