Поэтому я пытаюсь сделать клон Super Mario Bros для практики. Я создавал Мир 1-1. Все работало отлично: я мог двигаться, враги могли двигаться и быть убитыми, а с блоками можно было взаимодействовать, как и ожидалось. Но в то время я использовал коллайдеры, и они вызывали некоторые проблемы здесь и там, также я не мог найти способ заставить врагов двигаться в противоположном направлении, когда они сталкиваются с коллайдером. Поэтому я посмотрел на некоторых других людей и увидел, что они используют raycasting. Потом решил попробовать сам. С вражеским скриптом проблем не было.
Вражеский сценарий
private void RayCast()
{
// Getting the max distance by using the size of the collider and creating the ray itself
float rayMaxDistance = GetComponent<BoxCollider2D>().bounds.size.x/2;
Ray2D ray = new Ray2D(transform.position, Vector2.right);
// This way ray will be casted in the direction the enemy goes.
if (rb.velocity.x > 0)
{
RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, rayMaxDistance);
if (hit.collider != null)
{
if (hit.collider.gameObject.tag != "Player")
{
// Moving in the opposite direction
rb.velocity = Vector2.zero;
rb.AddForce(-movementVector, ForceMode2D.Impulse);
}
}
//Debug.DrawRay(ray.origin, ray.direction, Color.red);
}
// This way ray will be casted in the direction the enemy goes.
else if (rb.velocity.x < 0)
{
ray.direction = Vector3.left;
RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, rayMaxDistance);
if (hit.collider != null)
{
if (hit.collider.gameObject.tag != "Player")
{
// Moving in the opposite direction
rb.velocity = Vector2.zero;
rb.AddForce(movementVector, ForceMode2D.Impulse);
}
}
//Debug.DrawRay(ray.origin, ray.direction, Color.red);
Это работало как задумано, но когда я попытался использовать его на Марио, это как-то не сработало.
Часть в сценарии персонажа. (Это не завершено, потому что сейчас даже не работает)
private void ActivateLuckyBlock()
{
float maxRayDistance = GetComponent<BoxCollider2D>().bounds.size.y/2;
Ray2D ray = new Ray2D(transform.position, Vector2.up);
RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, maxRayDistance);
if (hit.collider != null)
{
Debug.Log("There is something");
}
}
- Этот код выводит «Что-то есть», даже если над игроком ничего нет. Так что он никогда не возвращает null, это должно означать, что он каждый раз что-то нажимает, верно?
- Я подумал, что, возможно, это как-то столкновение с коллайдером игрока, но этого не происходит с противником, хотя они одинаковые.
- Я проверил несколько расстояний, включая бесконечность.
- Также проверил, есть ли в сцене что-то, чего я не видел изначально, но не смог найти.
- Я пробовал вызывать метод как для Update, так и для FixedUpdate; ни один из них не работал должным образом.
- Происхождение и направление луча также работает при тестировании с помощью Debug.DrawRay().
Я искал в Интернете какой-либо ответ, но ничего не мог найти по этому поводу. Я не знаю, что я делаю неправильно. Это даже не полная реализация, просто хотелось протестировать. Тем не менее, это не работает. Пожалуйста, помогите мне, прежде чем я сойду с ума.