[Unity] 로봇 좌우 반전
요약
스킬, 몬스터, 플레이어와 같은 오브젝트는 동적으로 움직이므로 반전을 해야 하는 경우가 있다. 그래서 반전시키는 방법으로 Sprite Renderer Flip 속성을 수정하는 방법이 있지만 Collider 문제로 Transform Scale 속성을 수정하였다. 다만 Transform Scale 속성은 행렬 연산에서 문제가 발생하므로 Scale이 음수이면 -180도를 주는 것으로 해결하였다.
좌우 반전 방법
Sprite Renderer Flip 속성
해당 속성을 클릭하면 이미지를 좌우, 상하로 반전을 할 수 있다. 다만 아쉬운 점은 Collider은 좌우가 반전이 안 되어 다음과 같은 상황이 발생한다.
Flip으로 좌우 반전 시 Collider의 범위가 벗어나게 된다. 이러한 사소한 점이 마음에 안 들어 다른 방법을 사용했다.
Transform Scale 속성
해당 속성에 음수를 주게 되면 반전하는 효과를 얻을 수 있다.
이를 통해 좌우 반전을 하게 되면 새로운 문제가 발생한다.
Transform Scale 좌우 반전 각도 문제점
해당 문제점은 총 스킬을 실행해야 하였더니 원하는 각도의 180도가 벗어난 상태로 총이 회전하는 것을 확인할 때였다. 추측이지만 컴퓨터 그래픽스 이론을 배웠다면 오브젝트를 국소 공간에서 세계 공간으로 위치시킬 때 연산 순서를 스자이공부(스케일, 자전,이동,공전,부모)로 한다는 것을 알 것이다. 이때 스케일을 먼저 연산하므로 현재 만약 회전상태가 90도여도 -90인 상태가 되는 것이 아닐지 생각한다. 이를 해결하는 방법으로 180도를 돌렸다.
PlayerMovement.cs
public class PlayerMovement : AStar
{
... 생략 ...
public void LookMonsterAnimation(float target)
{
float direction = target - transform.position.x;
if (direction == 0) return;
if (xAxis == Mathf.Sign(direction)) return;
xAxis = Mathf.Sign(direction);
if (Mathf.Sign(direction) < 0)
{
// 왼쪽 방향
transform.localScale = new Vector3(-Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z);
}
else
{
// 오른쪽 방향
transform.localScale = new Vector3(Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z);
}
}
좌우 반전을 통해 만들어진 애니메이션 함수로 스킬 사용시 몬스터 방향에 맞춰 반전이 된다.
public void RunAnimation(bool run, float direction = 0)
{
animator.SetBool("run", run);
if (direction == 0) return;
if (xAxis == Mathf.Sign(direction)) return;
xAxis = Mathf.Sign(direction);
if (Mathf.Sign(direction) < 0)
{
// 왼쪽 방향
transform.localScale = new Vector3(-Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z);
}
else
{
// 오른쪽 방향
transform.localScale = new Vector3(Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z);
}
}
... 생략 ...
}
걸어가는 방향을 바라보기 위해 좌우 반전을 한다.