проблема с прохождением символов через объекты / Unity3d

#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:

Добавьте коллайдер как к персонажу, так и к объектам. Убедитесь, что персонаж правильно размещен в сцене. Также убедитесь, что у персонажа жесткое тело.