【问题标题】:Checking if RigidBody is grounded?检查刚体是否接地?
【发布时间】:2021-05-14 03:41:23
【问题描述】:

我有一个带有刚体、网格碰撞器、蒙皮网格渲染器和以下脚本的游戏对象。

我正在尝试检查它是否已接地,但控制台不断吐出“未接地!”当它是时,很明显这里有问题。有人可以帮忙吗?

public class GroundCheck : MonoBehaviour
{
    public float Height;
    bool IsGrounded;
    Ray ray;
    MeshRenderer renda;

    private void Start()
    {
        Height = renda.bounds.size.y;
    }

    void Update()
    {
        if (Physics.Raycast(transform.position, Vector3.down, Height))
        {
            IsGrounded = true;
            Debug.Log("Grounded");
        }
        else
        {
            IsGrounded = false;
            Debug.Log("Not Grounded!");
        }
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    检查rigidBody 是否接地的另一个选项是使用OnTriggerStay 函数。

    void OnTriggerStay(Collider other)
        {
            if (other.Transform.Tag == "Ground")
            {
                IsGrounded = true;
                Debug.Log("Grounded");
            }
            else
            {
                IsGrounded = false;
                Debug.Log("Not Grounded!");
            }
        }
    

    【讨论】:

    • 谢谢,这种方法奏效了。我仍然很困惑为什么即使使用 LocalBounds 技术我也无法获得另一种工作方式,但就目前而言,我很高兴有一些可以工作的东西。 . . !
    • 无论如何,这种方法在大多数情况下更适合检测碰撞和触摸
    • 好收获!但是我很好奇,为什么这将与该触发器一起使用而在更新时无效?这是因为对撞机“接触得非常快”它是另一个对撞机?
    • 触发器检查是否有触摸并且光线投射使用不同的方法,使用光线投射更复杂,但如果使用正确,应该可以在更新功能中工作。
    【解决方案2】:

    我已经用一个带有平面和立方体的简单场景检查了你的代码,它可以工作。

    只有当它明显是“浮动”环绕或物体的一半身体在平面之外时才会生成 NotGrounded。

    检查那些东西drawing Ray,这应该会为您提供有关您的网格出了什么问题的更多信息。

    此外,如果问题在于游戏如何感知蒙皮​​网格的高度,您还可以使用返回对象 AABB 的 SkinnedMeshRenderer.localBounds

    【讨论】:

    • 很高兴知道这一点。我注意到当我点击播放时,“高度”保持为 0,所以即使我的 SkinnedMeshRenderer 有一个网格,由于某种原因它根本没有抓住网格高度。正在调查...
    • 我已经更新了我的答案,也许第二个链接可以帮助测试更多的方法^^
    【解决方案3】:

    有比碰撞检查和射线更好的方法来检查你的刚体是否接地。但首先,为什么碰撞检查不是一个好主意:如果您的关卡是单个模型,那么墙壁也将被标记为“Ground”标签,并且撞到墙壁将返回 true,这是您不想要的。可以使用光线,但你不需要浪费时间来做太多的数学运算。

    不要使用新的对象和方法,只需检查位置是否在变化:

    private float lastYposition;
    private bool grounded;
    
    void Start() {
        lastYposition = transform.position.y;
    }
    
    void Update() {
        grounded = (lastYposition == transform.position.y); // Checks if Y has changed since last frame
        lastYposition = transform.position.y;
    }
    

    从这里开始,您要添加什么逻辑由您决定。

    【讨论】:

      【解决方案4】:
      private void Jump()
      {
          if (Input.GetKeyDown(KeyCode.Space))
          {
              if (transform.position.y == 0f)
              {
                  rb.AddRelativeForce(Vector3.up * jumpForce);
              }
          }
      }
      

      我用这种方法只在y的位置为0时才使用刚体的addrelativeforce跳跃。

      【讨论】:

      • 这不适用于平台或斜坡。
      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多