Unity/Pun2:2个玩家互相控制

Posted

技术标签:

【中文标题】Unity/Pun2:2个玩家互相控制【英文标题】:Unity/Pun2: 2 players control each other 【发布时间】:2022-01-07 00:31:21 【问题描述】:

我在一个团队中移动 2 人或更多人时遇到问题。在一个团队中它应该运行,每个人都控制自己,但在另一个团队中,如果超过 1 个玩家加入,那么 1 控制另一个。

我有 4 种球员类型(一支球队 2 支,另一支球队 2 支),所以我需要 4 个预制件,当我需要它们时,我会在开始房间时调用它们。

void CreateController()

.
.
.
    if (attackTeam == true && deffTeam == false && attAR_ == true)
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Att_player_AR"), spawnpointA.position, spawnpointA.rotation, 0, new object[]  PV.ViewID );

    if (attackTeam == true && deffTeam == false && attSniper_ == true)
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Att_player_Sniper"), spawnpointC.position, spawnpointC.rotation, 0, new object[]  PV.ViewID );

    if (deffTeam == true && attackTeam == false && defAR_ == true)
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Def_player_AR"), spawnpointD.position, spawnpointD.rotation, 0, new object[]  PV.ViewID );

    if (deffTeam == true && attackTeam == false && defSniper_ == true)
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Def_player_Sniper"), spawnpointB.position, spawnpointB.rotation, 0, new object[]  PV.ViewID );
.
.
.

而且任何地方都应该检查 photonView 是否是我的

PhotonView PV;
.
.
.

void Awake()

    PV = GetComponent<PhotonView>();


void Start()

    if (PV.IsMine)
    
        CreateController();
    

在这 4 个预制件中,我有所有的 PhotonView,在脚本中我检查 photonView 是否也是我的

protected virtual void Update()

    if (!PV.IsMine)
    
        return;
    

    if (isDead == false && timerOut == false)
    
        if (m_characterController && gamePaused == false)
        
            // Check if Grounded,Wall etc
            CheckIfGrounded();
            CheckIfWall();

            // Apply Smoothing
            SmoothInput();
            SmoothSpeed();
            SmoothDir();

            if (experimental)
                SmoothInputMagnitude();

            // Calculate Movement
            CalculateMovementDirection();
            CalculateSpeed();
            CalculateFinalMovement();

            // Handle Player Movement, Gravity, Jump, Crouch etc.
            HandleCrouch();
            HandleHeadBob();
            HandleRunFOV();
            HandleCameraSway();
            HandleLanding();

            ApplyMovement();
.
.
.       
    

一切都应该是正确的,所有的预制脚本在运动方面应该完全一样,但我真的不知道错误在哪里。我已经检查了大约一百万次,但没有找到任何东西。

虽然我不知道是否有人会弄清楚,至少从我所展示的内容来看,但任何 cmets 和建议将不胜感激。

【问题讨论】:

【参考方案1】:

我解决了问题,问题是我没有破坏别人的相机

        if (PV.IsMine)
        
            EquipItem(0);
        
        else
        
            Destroy(GetComponentInChildren<Camera>().gameObject);
            Destroy(rb);
        

【讨论】:

【参考方案2】:

确保正确设置所有变量attackTeamdeffTeamattAR_ 等(您不会显示分配它们的位置)。我还建议在CreateController() 中使用更清晰的语法。

假设当您将 bool attackTeam 设置为 true 时,无需检查 deffTeam 是否为 false。我会这样写:

if (attackTeam) 

    if (attAR_)
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Att_player_AR"), spawnpointA.position, spawnpointA.rotation, 0, new object[]  PV.ViewID );
    else
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Att_player_Sniper"), spawnpointC.position, spawnpointC.rotation, 0, new object[]  PV.ViewID );

else

    if (defAR_)
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Def_player_AR"), spawnpointD.position, spawnpointD.rotation, 0, new object[]  PV.ViewID );
    else
        controller = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "Def_player_Sniper"), spawnpointB.position, spawnpointB.rotation, 0, new object[]  PV.ViewID );

【讨论】:

我认为不会有错误。如果只是因为所有预制件似乎都能很好地“产生”我。这里有 2 个视频,您可以在其中看到我描述的问题。 youtube.com/watch?v=mK9j675bRyM youtu.be/Ddjeoj6rFpg 感谢您提出更简洁的代码:D

以上是关于Unity/Pun2:2个玩家互相控制的主要内容,如果未能解决你的问题,请参考以下文章

名将(Captain Commando)按键控制

java小项目之:泡泡堂炸弹人,来互相伤害呀!

UE4 回合游戏项目 15- 生成玩家控制玩家

H5坦克大战之玩家控制坦克移动2

Unity3DTank大战

Kinect SDK 播放器检测