向量的值未被功能修改

时间:2019-04-12 21:20:56

标签: visual-studio unity3d

我刚刚开始学习团结,我在一个相当愚蠢的问题上挣扎,但是我似乎无法解决。

我有一个简单的函数,用于查看向量的分量,如果它们超过某个阈值,则将其调整为允许的最大值。

不幸的是,它似乎没有用,我也不知道为什么。

代码如下:

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限制,而是似乎任意升高/降低。

有人可以启发我我做错了什么吗? 谢谢

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,它发送内存位置而不只是值,因此您不仅可以读取,还可以对其进行修改。