캐릭터 스프라이트를 좌우로 뒤집어주기 위해 Transform 컴포넌트의 Scale을 변경할 수 있다.
Scale의 Default value는 1인데 -1로 변경하면 캐릭터 스프라이트가 좌우 반전되므로, 이를 조정해주는 함수를 작성하면 된다.
Mathf.Sign(float) 함수는 float 값이 양수인 경우 1, 음수인 경우 -1을 반환해주므로 해당 함수를 이용하면 편리하게 코드를 짤 수 있다.
공식 문서: https://docs.unity3d.com/ScriptReference/Mathf.Sign.html
void FlipSprite()
{
transform.localScale = new Vector2(Mathf.Sign(myRigidbody.velocity.x), 1f);
}
하지만 이렇게만 작성할 경우 버그가 발생하는데, 왼쪽으로 이동하다가 키보드 왼쪽 키에서 손을 때면 캐릭터 스프라이트가 오른쪽을 바라보게 된다.

유니티에서 Mathf.Sign(float) 함수를 사용할 경우, float 값이 0.0f일 때 함수가 0이 아닌 1을 리턴해주기 때문에 해당 버그가 발생하게 된다.
즉, 키보드에서 손을 때 myRigidbody.velocity.x가 0이 되었을 때 scale 값이 1로 리턴되므로 캐릭터 스프라이트가 오른쪽을 바라보게 된다.
대체 방안으로 C# 라이브러리인 Math의 Math.Sign(float) 함수를 사용하면 float가 0인 경우 1이 아닌 0을 리턴해준다.
따라서 Math.Sign(float) 함수와 if문을 이용해 float가 0일 때 기존의 scale을 유지하도록 코드를 짜도 되지만, 오늘은 다른 방법을 사용해보려고 한다.
공식 문서: https://docs.unity3d.com/ScriptReference/Mathf.Epsilon.html
Mathf.Epsilon은 0에 가장 가까운, 아주 작은 실수값을 리턴해준다. 이를 이용하면 현재 캐릭터가 조금이라도 움직이고 있는지, 아니면 정지해 있는지 확인할 수 있다.
Mathf.Abs(float) 함수를 이용하면 myRigidbody.velocity.x의 절댓값을 구할 수 있고, 절댓값을 Mathf.Epsilon과 비교해주면 캐릭터가 조금이라도 움직이고 있는지, 정지했는지를 확인할 수 있다.
따라서 FlipSprite() 함수에 새로운 bool 변수와 if문을 추가해주면 위에서 봤던 버그를 해결할 수 있다.
void FlipSprite()
{
bool playerHasHorizontalSpeed = Mathf.Abs(myRigidbody.velocity.x) > Mathf.Epsilon;
if (playerHasHorizontalSpeed)
{
transform.localScale = new Vector2(Mathf.Sign(myRigidbody.velocity.x), 1f);
}
}
코드를 실행해보면 캐릭터 스프라이트가 정상적으로 작동하는 것을 확인할 수 있다.

참고로 지금은 캐릭터의 좌우 이동 여부만 조정하는 단계이기 때문에, Vector2의 y 컴포넌트는 1로 리턴하고 있다.