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