Значение вектора не изменяется функцией - PullRequest
1 голос
/ 13 апреля 2019

Я только начал изучать единство, и я борюсь с довольно глупой проблемой, но я не могу ее решить.

У меня есть простая функция, которая предназначена для просмотра компонентов вектора и изменения их размера до максимально допустимого, если они превышают определенный порог.

К сожалению, это, похоже, не работает, и я не могу понять, почему.

Вот код:

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 Ответ

2 голосов
/ 13 апреля 2019

Если вы передадите структуру (например, 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);

Это гарантирует, что изменяемый вами Вектор3 будет тем же Вектором, который вы передали в функцию

ref работает как pointer, он отправляет ячейку памяти вместо просто значения, поэтому вы можете не только читать, но и изменять ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...