Добрый день, есть грубо говоря шахматная доска, нужно передвигать объект с одного края до другого (если по пути встречается препятствие - тормозим объект).
И так, вроде задача простая, двигаем:
float speed = 30f;
bool isMove = false;
void Upload(){
if(isMove) // true когда мы нажали кнопку "вперед"
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
Все хорошо, двигается, но сама проблема в остановить объект, если препятствие или край карты.
Сделал так:
По краям карты сделал коллайдеры, дал им tag = obstacles(препятствие), с препятствиями собственно сделал точно так же, сделал их isTrigger, самому игровому объекту кстати физика не нужна, потому он isKinematic = true.
Останавливаем игрока:
void OnTriggerEnter(Collider collider)
{
if (collider.tag == "Obstacles")
{
Debug.Log("STOP");
isMove = false;
}
}
Но из-за высоко скорости передвижения (а она нужна) OnTriggerEnter срабатывает когда игровой объект уже вылетел с поля.
Доки юнити говорят что OnTriggerEnter не гарантирует коллизию, окей, делаем у игрока isKinematic = false, снимаем isTrigger у препятствий.
OnTriggerEnter меняем на OnCollisionEnter и чуть правим его, ВУАЛЯ, работает, но если все равно не так как нужно.
Проблемы:
1. Все так же иногда "проскакивает" и срабатывает не вначале коллизии, а когда объект уже наполовину прошел препятствие.
2. если поворачиваю объект, не могу начать движение тк коллайдеры соприкасаются (как вариант при остановке чуть-чуть сдвигать игрока назад, но - костыль)
Вопрос - Как правильно сделать тормозить игрока, чтобы он не застревал в текстурах и не баговал, чтобы ходил "ровно" по клеточкам ?
P.S Игра в 3d, камера сверху на эту "мини игру", дальше мои "шахматы" будут вращаться, в общем все в 3д, картинка: