【问题标题】:How to prevent upward rigidbody velocity?如何防止向上的刚体速度?
【发布时间】:2021-01-22 15:27:27
【问题描述】:

我有一组对象,我允许我的玩家在零重力的情况下在场景中抛来抛去。但是我想在一定高度之后创建一种不可见的边界。到目前为止,当对象达到某个上限时,我一直在我的 FixedUpdate 中执行此操作...

GetComponent<Rigidbody>().velocity = GetComponent<Rigidbody>().velocity - Vector3.Project(GetComponent<Rigidbody>().velocity, transform.up);

...这在某种意义上是有效的,但是因为它使用了 transform.up,它正在从向上和向下运动中消除速度,我需要将其限制为仅向上运动。这可能吗?

【问题讨论】:

    标签: unity3d velocity rigid-bodies


    【解决方案1】:

    也许您可以检查速度的 y 分量,如果它为正(向上),请将其设置为 0?如果它是负数(向下),请保留它。

    附言。我认为你应该得到一个引用刚体组件的变量来最小化 GetComponent 调用。

    Vector3 v = rb.velocity; //get the velocity
    v.y = v.y > 0 ? 0 : v.y; //set to 0 if positive
    rb.velocity = v; //apply the velocity
    

    【讨论】:

      【解决方案2】:

      您可以只检查位置是否达到阈值以及对象当前是否正在向上移动

      [SerializeField] private Rigidbody rb;
      [SerializeField] private float maxY;
      
      private void Awake()
      {
          if(!rb) rb = GetComponent<Rigidbody>();
      }
      
      private void FixedUpdate()
      {
          var velocity = rb.velocity; 
          if(rb.position.y >= maxY && velocity.y > 0) 
          { 
              velocity.y = 0; 
              rb.velocity = velocity; 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多