Персонаж не должен выходить за пределы коллайдера
В моей 2д игре персонаж имеет boxCollider 2d и перемещается через transform.translate. Также, грубо говоря, под ним находятся блоки, на которых стоит тоже boxCollider 2d. Чтобы персонаж не мог выходить за пределы этих коллайдеров, и, если я поставлю еще блок рядом, он мог заходить на него, я поступил следующим образом: я выпустил лучи из углов коллайдера персонажа и проверял каждый следующий шаг на то - имеется ли там коллайдер блока. И таким образом он не может выйти за пределы блоков. Но, как мне кажется, это не совсем правильно, и тяжело, так плюс еще и он иногда застревает, когда идет по краю коллайдера вбок, или может пройти сквозь коллайдер, если он меньше расстояния его коллайдера, либо не доходит до конца коллайдеров блока. Можно ли это как то более правильно сделать? Заранее нарисовать коллайдер для "острова" я не могу, поскольку персонаж может ломать и ставить эти блоки. Так плюс еще и остров из блоков генерируется сам собой.
Вот как показано на скрине, генерируется остров из блоков, и персонаж может ходить по ним, но не должен выходить за их пределы, плюс может сам ставить или разрушать блоки
Ответы (2 шт):
Пусть коллайдеры будут на воде (голубых "блоках"), которые будут препятствовать персонажу, как будто невидимые стены. Зачем усложнять себе жизнь лучами и другими штуками?
UPD: Советую сделать передвижение через физику, иначе персонаж будет плохо работать с коллайдерами (коллизией). Если Вам нужно движение без ускорения, то просто добавьте компонент RigidBody2D на своего персонажа, там поставьте гравитацию на 0, чтобы он не падал, и используйте такой код для перемещения персонажа (возможно мой код плохой, но зато (наверное) рабочий :Р):
void Update()
{
Move();
}
void Move()
{
if (!(Input.GetKey(KeyCode.W)) || !(Input.GetKey(KeyCode.A)) || !(Input.GetKey(KeyCode.S)) || !(Input.GetKey(KeyCode.D)))
player.velocity = Vector2.zero;
if (Input.GetKey(KeyCode.W))
player.velocity = Vector2.up * speed;
if (Input.GetKey(KeyCode.A))
player.velocity = Vector2.left * speed;
if (Input.GetKey(KeyCode.S))
player.velocity = Vector2.down * speed;
if (Input.GetKey(KeyCode.D))
player.velocity = Vector2.right * speed;
}
Изменение transform это телепортация, ни с чем объект не столкнется.
У персонажа должен быть коллайдер и тело, а у пропастей коллайдер.
[DisallowMultipleComponent]
[RequireComponent(typeof(Rigidbody2D))]
public class MoveController : MonoBehaviour
{
[SerializeField] private float _speed = 10f;
private Rigidbody2D _body;
private void Awake ()
{
_body = GetComponent<Rigidbody2D>();
}
private void Update ()
{
Vector2 InputAxis = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
_body.velocity = InputAxis*_speed;
}
}