Значение вектора, не изменяемого функцией

#visual-studio #unity3d

#visual-studio #unity3d

Вопрос:

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

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

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

Вот код:

 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. Вы можете использовать Vector3.ClampMagnitude() , если это работает для вас.

Ответ №1:

Если вы передаете структуру (например, 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 , что отправляет местоположение в памяти вместо просто значения, поэтому вы можете не только читать, но и изменять его.

Комментарии:

1. О, спасибо! Я не понимал, что это struct .. так что, если бы это был класс, он бы работал без ссылки, верно?

2. В этом случае да