Transform.Translate учитывает направление, в котором смотрит ваша птица. Вы заставляете 2 движения работать друг против друга.
transform.Translate(Input.GetAxis("Horizontal") * 5f * Time.deltaTime, 0f, 0f);
Если значение оси опускается ниже отрицательного, вы говорите птице идти назад по x, но это локальный x птицы, а не глобальный x мира . В то же время вы говорите ему перевернуть, и он это делает, и его обратное направление становится тем, что раньше было его вперед.
Вы можете исправить это, используя абсолютное значение оси.
transform.Translate(Mathf.Abs(Input.GetAxis("Horizontal")) * 5f * Time.deltaTime, 0f, 0f);
Или попросить Translate использовать глобальные координаты,
transform.Translate(Input.GetAxis("Horizontal") * 5f * Time.deltaTime, 0f, 0f, Space.World);
При этом, теперь мне интересно, как вообще работает ваша функция переворота, когда все, что вы делаете, каждый раз присваиваете 180 по y. Это не сможет перевернуть вашего персонажа более одного раза. Вместо этого используйте transform.Rotate.
void flip()
{
reverse = !reverse;
transform.Rotate(0,180,0);
return;
}
Также, как скобки в вашем примере, flip - это вложенная функция обновления. Это предназначено?