#c# #unity3d
Вопрос:
Мой персонаж может перемещаться в другие объекты только тогда, когда он движется в обоих направлениях. Я оставил здесь свой код персонажа и фотографию своего вопроса. Я был бы рад, если бы вы помогли.и я также играл со всеми коллайдерами и фильтрами моего персонажа и полом, на котором находится мой персонаж, но все еще не решен
float moveSpeed = 6f;
float rotationSpeed = 6f;
Vector3 moveDirection;
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
Move();
}
void Move()
{
float hAxis = Input.GetAxis("Horizontal");
float vAxis = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(hAxis, 0f, vAxis);
rb.position = movement * moveSpeed * Time.deltaTime;
}
Ответ №1:
Rigidbody.position
телепортирует жесткое тело в заданное положение. Это все равно вызовет события столкновения, но не позволит вашему твердому телу фактически остановиться перед другими коллайдерами.
Скорее использовать Rigidbody.MovePosition
Жесткое Тело.Перемещение перемещает жесткое тело и соответствует настройкам интерполяции. Когда интерполяция твердого тела включена, Жесткое тело.Перемещение создает плавный переход между кадрами.
Который теперь должен учитывать столкновения и останавливаться за пределами других коллайдеров.
rb.MovePosition(rb.position movement * moveSpeed * Time.deltaTime);
или я думаю, что прямое использование также rb.velocity
должно это сделать
var velocity = movement * moveSpeed;
// For keeping the Y (gravity) velocity
velocity.y = rb.velocity.y;
rb.velocity = velocity;
Если вы хотите/должны быть полностью уверены, вы также можете использовать Physics.ComputePenetration
в сочетании с a Rigidbody.Sweeptest
, которое позволяет вам проверить, ударит ли твердое тело по чему-либо на своем пути, и если да, переместите его достаточно далеко, чтобы он не попал в коллайдер.
Просто общая подсказка, вы захотите избежать ускорения при перемещении по диагонали с помощью
Vector3 movement = Vector3.ClampMagnitude(new Vector3(hAxis, 0f, vAxis), 1f);
что позволит убедиться, что вектор нормализован до величины 1
в случае, если оба входа вместе приведут к вектору с более высокой величиной.
Комментарии:
1. да, это сработало, но в любом слиянии коллайдеров персонаж остается там, где он есть. Как я могу заставить его двигаться в сторону пустого пространства, когда я нажимаю на него по диагонали?
Ответ №2:
Добавьте коллайдер как к персонажу, так и к объектам. Убедитесь, что персонаж правильно размещен в сцене. Также убедитесь, что у персонажа жесткое тело.