#unity3d #raycasting
Вопрос:
В основном моя проблема заключается в том, что мой объект соприкасается с землей, когда я использую 2D-трансляцию для проверки столкновения с землей, потому что скорость падения слишком велика. Я попытался устранить проблему, но не смог, следуя своему коду:
public class PlayerMove : MonoBehaviour
{
Transform _tr;
[SerializeField]
float speed = 4;
[SerializeField]
float gravity = 9.81f;
[SerializeField]
LayerMask mask;
float xAxe;
void Awake()
{
_tr = GetComponent<Transform>();
}
void Update()
{
xAxe = Input.GetAxis("Horizontal");
_tr.position = Vector3.right * xAxe * speed * Time.deltaTime;
}
void FixedUpdate()
{
RaycastHit2D hit = Physics2D.Raycast(_tr.position (Vector3.down / 2), Vector3.down, 0,mask);
if (hit.collider == null)
{
//Continue to fall
_tr.position = -Vector3.up * gravity * Time.fixedDeltaTime; //Gravity force
}
else
{
//STOP!
}
}
}
Следуя образу проблемы:
Спасибо всем!
Ответ №1:
Ваша проблема в том, что по мере увеличения скорости ваш объект переходит от пропущенного луча на одном физическом шаге к вашему объекту, пересекающемуся на следующем.
Вы могли бы исправить это, попытавшись реализовать собственное непрерывное обнаружение столкновений…
Но зачем заново изобретать колесо? Unity уже обеспечивает обнаружение столкновений с помощью коллайдеров, я бы рекомендовал добавить один из них к вашему объекту, установить непрерывный режим столкновения и, возможно, также использовать тело жесткости для управления физическим движением для вас.
Комментарии:
1. Хорошо, большое вам спасибо за ответ. Моей целью было реализовать систему столкновений без Rigidbody2D.
2. Вам не нужно использовать a
rigidbody
, чтобы использовать acollider
, столкновение объектов действительно сложно, и если вы не делаете что-то действительно обалденное, я бы не рекомендовал пытаться свернуть свой собственный