Игрок Unity3D, проходящий сквозь и по камню

#c# #unity3d #collision-detection #mesh-collider

#c# #unity3d #обнаружение столкновений #сетчатый коллайдер

Вопрос:

Привет, ребята, мой Игрок идет по Камню и сквозь Камень. У игрока по имени Чемпион есть Коробочный коллайдер, а у Камня-Сетчатый коллайдер. Также у Игрока Жесткое тело. Я перепробовал все, что нашел, но ничто не помогло мне решить мою проблему.

Скрипт MovePlayer.cs

 using System.Collections; using System.Collections.Generic; using UnityEngine;  public class MovePlayer : MonoBehaviour {   Rigidbody rb;   public float speed = 10f;  private Vector3 moveDirection;  public float rotationSpeed = 0.05f;   void Start()  {  rb = GetComponentlt;Rigidbodygt;();  }   void Update()  {  moveDirection = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")).normalized;  }   void FixedUpdate()  {  rb.MovePosition(rb.position   transform.TransformDirection(moveDirection * speed * Time.deltaTime));  RotatePlayer();  }   void RotatePlayer()  {  if (moveDirection != Vector3.zero)  {  transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDirection.normalized), rotationSpeed);  }  transform.Translate(moveDirection * speed * Time.deltaTime, Space.World);  }  }  

Настройки плеера в Инспекторе

Настройки камня в инспекторе

Предварительный просмотр сцены

Спасибо вам за помощь, ребята! 🙂

Ответ №1:

Итак, ребята, я нашел решение с помощью ребят, опубликованных выше.

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

Поэтому моим первым шагом для решения проблемы было снизить скорость до 10, но я все равно хотел двигаться со скоростью 50f…

Решение этой проблемы заключалось в том, что в Unity 2020.3.24f1 и выше (возможно, ниже) вы можете перейти в раздел «Редактирование»gt; «Настройки проекта» gt;gt; «Физика» gt;gt; и установить «Максимальную скорость удаления по умолчанию» на скорость, с которой вы хотите, чтобы объекты останавливались и не проходили. В моем случае я хотел двигаться со скоростью = 50f, поэтому мне нужно было изменить максимальную скорость удаления по умолчанию на 50.

Я надеюсь, что смогу помочь кому-нибудь с этим ответом в будущем!

С наилучшими Пожеланиями, Макс Г.

Ответ №2:

Протестировал ваш код, и, похоже, коллизии с моей стороны работают нормально.

Протестировал его, добавив скрипт в игровой объект с коробочным коллайдером и создав небольшой уровень с использованием кубов. Также сделал стену, которую я модифицировал, чтобы использовать сетчатый коллайдер вместо коробчатого коллайдера. Игрок обычно сталкивался с объектами на сцене.

Вам следует дважды проверить матрицу столкновений слоев из проекта Settings gt; Physics , настроили ли вы столкновение игрока слоев и стены.

  1. Вы также можете попробовать добавить новый куб в сцену и установить его слой на стену, чтобы увидеть, столкнется ли с ним игрок. Если это так, то могут возникнуть проблемы с сеткой камня.
  2. Если нет, то я бы отключил аниматор и компоненты гравитационного тела от плеера, чтобы убедиться, что они не мешают столкновениям

Rigidbody.MovePosition в основном заставляет игрока телепортироваться, что может вызвать неожиданное поведение. Обычно рекомендуется использовать Rigidbody.AddForce вместо этого. Для точного перемещения ForceMode.VeloictyChange можно использовать.

 public float maxVelocityChange = 5.0f;  void moveUsingForces(){   Vector3 targetVelocity = moveDirection;  // Doesn't work with the given RotatePlayer implementation.  // targetVelocity = transform.TransformDirection(targetVelocity);  targetVelocity *= speed;   // Apply a force that attempts to reach our target velocity  Vector3 velocity = rb.velocity;  Vector3 velocityChange = (targetVelocity - velocity);  velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);  velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);  velocityChange.y = 0;  rb.AddForce(velocityChange, ForceMode.VelocityChange); }  

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

1. Привет, большое вам спасибо за то, что потрудились и нашли время воссоздать сцену почти так, как она есть у меня. Я постараюсь протестировать ваши решения и написать решение здесь, если выясню, почему оно не работает для меня. Приветствую и большое вам спасибо, Макс Г.

2. Я решил проблему, снизив скорость с инспекторов 50f до 10f, и теперь коллайдеры работают. В этом и заключалась проблема. Но если я хочу ехать со скоростью 50f, есть ли возможность сделать это и коллайдер нормально, не проходя сквозь стены?

3. Как Rigidbody.MovePosition работает, может привести к неожиданному поведению, Rigidbody.AddForce вместо этого обычно рекомендуется использовать. Изменил ответ с примером того, как использовать AddForce VelocityChange .