#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. В этом случае да