如何获得刚体速度的一个分量?

How can I get a component of a rigidbodies velocity?

我正在尝试检测刚体中的 y 速度以确定玩家是否可以跳跃。出于某种原因,我从 rb.velocity[2] 获得的组件与我在控制台中登录 rb.velocity 时看到的不匹配。一些帮助理解如何从刚体获得垂直速度分量将非常有帮助。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{
    public Rigidbody rb;
    public Vector3 xvector = new Vector3 (1, 0, 0);
    public Vector3 yvector = new Vector3 (0, 1, 0);
    public float strafeforce = 1f ;
    public float jumpforce = 15f;
    
    // Update is called once per frame
    void Update()
    {
        rb = GetComponent<Rigidbody>();
    }
    void FixedUpdate()
    {
        if (Input.GetKey("right") )
        {
            rb.AddForce(strafeforce, 0, 0, ForceMode.Impulse) ; 
        }
        if (Input.GetKey("left") )
        {
            rb.AddForce(-strafeforce, 0, 0, ForceMode.Impulse) ; 
        }
        if (Input.GetKey("up") )
        {
            rb = GetComponent<Rigidbody>();
            if (rb.velocity[2] == 0)
            {
                rb.AddForce(0, jumpforce, 0, ForceMode.Impulse) ;
            }
            Debug.Log(rb.velocity);
            Debug.Log(rb.velocity[2]);
        }
    }
}

所以问题是 rb.velocity 的第二个值由于某种原因与我从 rb.velocity[2] 获得的值不匹配。

由于 ToString 实施方式不同,差异仅存在于日志中。

Unity 对 Vector3.ToString 的默认格式使用 F1 将所有值四舍五入为一位小数

   public string ToString(string format, IFormatProvider formatProvider)
   {
       if (string.IsNullOrEmpty(format))
           format = "F1";
       return UnityString.Format("({0}, {1}, {2})", x.ToString(format, formatProvider), y.ToString(format, formatProvider), z.ToString(format, formatProvider));
   }

默认 float.ToString 不是这种情况。

您是否希望确保它们在日志中匹配使用例如

Debug.Log(rb.velocity.ToString("G9"));
Debug.Log(rb.velocity[2].ToString("G9"));

或者实际上只是

Debug.Log(rb.velocity.z.ToString("G9"));

在 C# 中,索引从 0 开始。这意味着索引 2 实际上是向量的第三个分量(即 z 速度)。如果你想要第二个组件,你应该实际使用 rb.velocity[1].

但是如果你想得到一个特定的分量,例如 y 速度,你可以改为使用 rb.velocity.xrb.velocity.yrb.velocity.z。这使代码更易于阅读,因为您可以一目了然地看到您正在尝试访问哪个轴。