alex4answ
@alex4answ

Передвижение объекта по шахматке, как останавливать при достижении края поля?

Добрый день, есть грубо говоря шахматная доска, нужно передвигать объект с одного края до другого (если по пути встречается препятствие - тормозим объект).

И так, вроде задача простая, двигаем:
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д, картинка:
5d280443cc1bc285823362.png
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
Griboks
@Griboks Куратор тега Unity
Убийца авточес шашек? Ваша проблема в том, что вы смешивается логику с анимацией. Шахматы - это строгая дискретная однозначная матрица объектов с полной информацией.
1. Создаёте матрицу MyGameObject[,] =new MyGameObject[4,5]
2. Заполняем матрицу фигурами
3. При перемещении тупо вычисляется новое место по клеткам
4. Запускаем анимацию "переместить из пункта А в пункт Б за время Т"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы