Некорректно работает код

Общие вопросы о Unity3D

Некорректно работает код

Сообщение EIvanov 09 апр 2023, 21:25

Обычно спрайт игрока поворачивают таким способом
Синтаксис:
Используется csharp
horizontalInput = Input.GetAxis("Horizontal");
if (horizontalInput < 0) sr.flipX = true;
if (horizontalInput > 0) sr.flipX = false;
 

и это работает.

Но я решил пойти дальше. Зачем мне привязываться к управлению, подумал я, когда я могу привязаться к состоянию игрока. Говоря проще - следить за игроком и в зависимости от его состояния выполнять действия в коде.
Игрок пошел влево? Ок - флип спрайт. Направо? - флип. Прыгает? Меняем спрайт на спрайт прыжка. Идею вы поняли.
Текущий x=предыдущему x, а текущий y > предыдущего y? Значит игрок сейчас прыгает вверх.
И я написал такой код
Смысл - исходя из текущей координаты игрока transform и предыдущей по оси х и у делать вывод о состоянии игрока.

Скрытый текст:
public class PlayerController : MonoBehaviour
{

// Перечисление текущего состояния игрока
enum PlayerCurrentState {MoveLeft, MoveRight, StandStill};
private PlayerCurrentState playerCurrentState;
float positionX;
float positionY;
float positionXLast;
float positionYLast;

SpriteRenderer sr;

// Получаем информацию о текущем состоянии игрока.
private void GetPlayerCurrentState()
{
positionX = rb.transform.position.x;
positionY = rb.transform.position.y;

if (positionX==positionXLast && positionY==positionYLast) playerCurrentState = PlayerCurrentState.StandStill;
if (positionX>positionXLast && positionY==positionYLast) playerCurrentState = PlayerCurrentState.MoveRight;
if (positionX<positionXLast && positionY==positionYLast) playerCurrentState = PlayerCurrentState.MoveLeft;
if (positionX==positionXLast && positionY>positionYLast) playerCurrentState = PlayerCurrentState.JumpUp;

positionXLast = positionX;
positionYLast = positionY;
}



// Фиксированный вызов кода - по умолчанию 0.02 (50 раз в секунду).
void FixedUpdate()
{
// Получаем информацию о текущем состоянии игрока.
GetPlayerCurrentState(); // Движение.
// Поворачиваем спрайт.
if (playerCurrentState == PlayerCurrentState.MoveRight) {sr.flipX = false;} else if (playerCurrentState == PlayerCurrentState.MoveLeft) {sr.flipX = true;}
}
}


В результате:
поворот игрока при обычном движении работает, но с небольшой задержкой.
поворот игрока после прыжка работает с задержкой 1.5 сек (идет спиной 1.5 сек, после прыжка)

В чем моя ошибка или это вообще плохая идея и так не делается?
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Некорректно работает код

Сообщение Saltant 10 апр 2023, 02:00

ппц у тебя были две строчки кода, но ты решил переделать их в десяток, вот это рефакторинг достойный уважения ^:)^

тут ваще по идеи можно было 1 строчку сделать:
Синтаксис:
Используется csharp
sr.flipX = Input.GetAxis("Horizontal") < 0;
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Некорректно работает код

Сообщение 1max1 10 апр 2023, 02:37

Не понял, а потому MoveRight должен быть привязан к Y? Если игрок побежит в горку или с нее, то условие не сработает, тоже самое и про джамп, у тебя игрок прыгает тупо на одном месте? Если уж так делать, то должно быть еще MoveRightYStill, MoveRightYDown, MoveRightYUp, JumpUpXStill, JumpUpLeft, JumpUpRight и тд.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Некорректно работает код

Сообщение EIvanov 10 апр 2023, 06:44

Saltant, 1max1
Вот такой код. Это идея, так что тут не про рефракторинг, а на будущее - ведь потом понадобится отслеживать состояние игрока и что то делать, исходя из его состояния.
Прыгает? Меняем спрайт, например.

Не понял, а потому MoveRight

Хорошее замечание. По идее, в игре у меня нет горок - только плоскость, но если завтра я решу сделать горку... Есть над чем подумать.
Пока отказался от своей идеи сделать определение состояния героя - т.к. код глючит.

Saltant
тут ваще по идеи можно было 1 строчку сделать

sr.flipX = Input.GetAxis("Horizontal") < 0;
Нее. Налево пойдешь - ось повернешь, направо пойдешь...а назад не повернешься.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8