如何获得刚体速度的一个分量?
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.x
、rb.velocity.y
和 rb.velocity.z
。这使代码更易于阅读,因为您可以一目了然地看到您正在尝试访问哪个轴。
我正在尝试检测刚体中的 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.x
、rb.velocity.y
和 rb.velocity.z
。这使代码更易于阅读,因为您可以一目了然地看到您正在尝试访问哪个轴。