我刚刚开始学习团结,我在一个相当愚蠢的问题上挣扎,但是我似乎无法解决。
我有一个简单的函数,用于查看向量的分量,如果它们超过某个阈值,则将其调整为允许的最大值。
不幸的是,它似乎没有用,我也不知道为什么。
代码如下:
public class HumanController : MonoBehaviour
{
Rigidbody rBody;
Vector3 currSpeed;
Vector3 currAcceleration;
Vector3 dt = new Vector3(0.03333f, 0.03333f, 0.03333f);
public const float MAX_COMPONENT_ACCELERATION = 1;
public const float MAX_COMPONENT_SPEED = 5;
Logger logger = new Logger(new MyLogHandler());
void EnsureVectorLimit(Vector3 vector, float limit)
{
if (vector.x > limit)
vector.x = limit;
else if (vector.x < -limit)
vector.x = -limit;
if (vector.y > limit)
vector.y = limit;
else if (vector.y < -limit)
vector.y = -limit;
if (vector.z > limit)
vector.z = limit;
else if (vector.z < -limit)
vector.z = -limit;
}
// Start is called before the first frame update
void Start()
{
rBody = GetComponent<Rigidbody>();
}
// Update is called once per frame
void FixedUpdate()
{
var horz = Input.GetAxis("Horizontal");
var vert = Input.GetAxis("Vertical");
// Rescale
currAcceleration += Vector3.Scale(new Vector3(horz, 0, vert), dt);
EnsureVectorLimit(currAcceleration, MAX_COMPONENT_ACCELERATION);
logger.Log($"Current acceleration: {currAcceleration.ToString()}");
currSpeed += Vector3.Scale(currAcceleration, dt);
EnsureVectorLimit(currSpeed, MAX_COMPONENT_SPEED);
rBody.transform.Translate(currSpeed);
}
}
但是,“当前加速度”日志中的值并不受预期的限制1限制,而是似乎任意升高/降低。
有人可以启发我我做错了什么吗? 谢谢
答案 0 :(得分:2)
如果将结构(如Vector3)传递给函数,则原始结构不会被修改。您应该使用ref
关键字,它允许您通过引用来代替:
替换
void EnsureVectorLimit(Vector3 vector, float limit)
使用
void EnsureVectorLimit(ref Vector3 vector, float limit)
和
EnsureVectorLimit(currAcceleration, MAX_COMPONENT_ACCELERATION);
使用
EnsureVectorLimit(ref currAcceleration, MAX_COMPONENT_ACCELERATION);
这可以确保您修改的Vector3与您传递给函数的Vector3相同
ref
的工作方式类似于pointer
,它发送内存位置而不只是值,因此您不仅可以读取,还可以对其进行修改。