触墙后如何阻止播放器旋转?

Posted

技术标签:

【中文标题】触墙后如何阻止播放器旋转?【英文标题】:How do I stop player from rotating after touching a wall? 【发布时间】:2021-12-23 01:02:48 【问题描述】:

我已经开始制作一个 3d 游戏,并且我已经设置了我的播放器、墙壁对象和地板。每当我的玩家对象接触到墙壁时,它就会像向后倒下一样旋转,并且永远继续旋转。

我已经尝试在播放器的刚体上启用 y 和 z 的冻结旋转(显然需要 x 旋转,这不是问题),并且尝试了几种不同的方法,或者使墙壁静止。将其更改为运动学等,我无法找到一种方法来阻止玩家在接触墙壁后旋转。

固定更新控制玩家移动,如图所示:

    
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        m_Movement.Set(horizontal, 0f, vertical);
        m_Movement.Normalize();

        bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f);
        bool hasVerticalInput = !Mathf.Approximately(vertical, 0f);
        bool isWalking = hasHorizontalInput || hasVerticalInput;
        bool isShiftKeyDown = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);

        if (hasHorizontalInput || hasVerticalInput)
        
            if (isShiftKeyDown)
            
                m_Animator.SetBool("IsRunning", true);
                m_Animator.SetBool("IsWalking", false);
                m_Animator.SetBool("IsIdle", false);
                m_Audiosource.clip = running;
               
             else
           
            
                m_Animator.SetBool("IsRunning", false);
                m_Animator.SetBool("IsWalking", true);
                m_Animator.SetBool("IsIdle", false);
                m_AudioSource.clip = walking;
                
            
         else
        
            m_Animator.SetBool("IsRunning", false);
            m_Animator.SetBool("IsWalking", false);
            m_Animator.SetBool("IsIdle", true);
        
          
       
        //m_Animator.SetBool("IsWalking", isWalking);

        Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
        m_Rotation = Quaternion.LookRotation(desiredForward);

        if (isWalking)
        
            if (!m_AudioSource.isPlaying)
            
                m_AudioSource.Play();
            
        
        else
        
            m_AudioSource.Stop();
        
    ```

【问题讨论】:

【参考方案1】:

尝试增加玩家刚体中的角阻力。

【讨论】:

我增加了角度阻力,但无济于事。我最终做的似乎已经解决了这个问题的事情是在fixedupdate中,在检测到输入时的所有处理程序(因此,当没有检测到输入或没有对输入进行任何操作时)将刚体速度更改为0.【参考方案2】:

我相信问题可能出在以下几行:

Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
m_Rotation = Quaternion.LookRotation(desiredForward);

在这里,您将transform.forwardm_Movement 旋转,但如果我了解您的代码如何正常工作,这将导致它永远旋转。尝试删除这些行,看看会发生什么。另外,它在哪个轴上旋转?

【讨论】:

这些代码行是将玩家角色移动到按下按钮的方向 - 即,向前,向后等 - 删除这些行会阻止角色移动。此旋转沿 Y 轴,问题轴沿 x 轴。 @Bluesombre 啊好吧,看来你还是找到了解决办法 :)【参考方案3】:

如果其他人有这个问题,我发现解决这个问题的方法是在 FixedUpdate 内部,在使用输入进行任何调用之前,将 Rigidbody.velocity 设置为 0。

【讨论】:

以上是关于触墙后如何阻止播放器旋转?的主要内容,如果未能解决你的问题,请参考以下文章

如果在播放歌曲之前按下音量滑块,如何阻止音乐播放器崩溃?

iPhone如何阻止MPMoviePlayerController最后关闭?

如何将图像(播放器)旋转到鼠标方向?

Chrome 更新阻止 flash 自动播放 - 如何避免它?

如何阻止 MPMoviePlayerController 显示“无法播放此电影。”?

UIWebView中电影播放器​​的旋转和外观