4방향의 애니메이션이 모두 필요하다
나는 왼쪽아래방향(DL)과 왼쪽위방향(UL)방향의 애니메이션만 만든 뒤
이를 좌우대칭하여 사용한다
다행히도 공격의 경우
검 공격과 활 공격의 애니메이션이 모두 있었다
이것또한 DL과 UL버전으로 2개씩 만들고 좌우대칭하여 사용하기로 하였다
이제 이동과 공격로직을 구현하여 확인해보자
문제가 있다
이동로직에서 isometric은 마름모의 대각선이 2:1이라서 30도 방향으로 이동해야하는데
현재는 직교좌표의 합인 45도로 이동하는 문제가 있었다
(왼쪽 아래를 아래 화살표가 되게 하였을 때)
이소메트릭 좌표계에서 기본적인 방향 매핑
- 위(↑) → ↗ (우상)
- 아래(↓) → ↙ (좌하)
- 왼쪽(←) → ↖ (좌상)
- 오른쪽(→) → ↘ (우하)
이에 맞추어 이동하게하니
horizontal은 오른쪽이 +
vertical은 위쪽이 +
// isometric 처리
Vector2 isometricMovementDirection = new Vector2(
(horizontal + vertical), // x축 변환 (좌표계 회전 적용)
(vertical - horizontal) / 2 // y축 변환 (높이는 1/2로 반영)
).normalized;
으로 이동하니 방향은 맞았다
예를 들어 아래를 입력하면 horizontal이 0, vertical이 -1이므로 1, -1/2 이므로 좌하으로 이동
이렇게 되는 것이다
(격자 까지는 너무한 것 같으니 시간 관계상 격자는 구현하지 않았다... 내일 제출이라..)
그러나 플레이어의 위치 기준으로 현재 마우스의 위치에 따라 4방향을 바라보게하는데
걷는 모션이 나오지 않고 마치 문워크하듯이 뒤로 가는 문제가 있다
이는 스프라이트를 저장하지 않았기 때문이다
/// 좌상, 좌하 방향을 보는 스프라이트는 따로 저장해두어야한다
[SerializeField] private Sprite defaultSprite; // 기본 스프라이트 (좌하)
[SerializeField] private Sprite upSprite; // 위쪽을 볼 때 사용할 스프라이트 (좌상)
가장 기본값인 좌하 방향의 스프라이트를 저장하는 defaultSprite와
좌상 방향의 스프라이트를 저장하는 upSprite에
이를 저장한 뒤
플레이어를 기준으로 하여 atan2 계산하여 각도에 따라 보여주는 스프라이트를 다르게한다
그런데 문제가 생겼다...
마우스를 위로 플레이어보다 위로 가져가도 스프라이트가 안바뀐다
// [SerializeField]를 통해 private도 인스펙터에 공개할 수 있다
[SerializeField] private SpriteRenderer characterRenderer;
[SerializeField] private Transform weaponPivot;
/// 좌상, 좌하 방향을 보는 스프라이트는 따로 저장해두어야한다
[SerializeField] private Sprite defaultSprite; // 기본 스프라이트 (좌하)
[SerializeField] private Sprite upSprite; // 위쪽을 볼 때 사용할 스프라이트 (좌상)
...
private void Rotate(Vector2 direction)
{
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
bool isLookingUp = (rotZ > 0) && (rotZ < 180); // 위쪽(1,2사분면)이면 true
Debug.Log($"rotZ: {rotZ}, isUp: {isLookingUp}");
bool isLookingRight = Mathf.Abs(rotZ) < 90f; // 1,3사분면이면 true (오른쪽)
// 위쪽을 바라보면 upSprite 사용, 아래쪽이면 기본 스프라이트 사용
characterRenderer.sprite = isLookingUp ? upSprite : defaultSprite;
characterRenderer.flipX = isLookingRight; // 좌우 반전
if (weaponPivot != null)
{
weaponPivot.rotation = Quaternion.Euler(0, 0, rotZ);
}
}
튜터님께 질문한 결과
스프라이트는 정상적으로 바뀌는데, 애니메이션이 바뀌지 않아서 생긴 문제라는걸 알게 되었다
애니메이션도 같이 바꾸어야한다
이때 방향을 바꾸는 문제가 생겼다
bool값으로 IsUp, IsRight로 했더니 너무 복잡했다
int값으로 좌하부터 반시계로 0~3 정하고 나니까 로직이 단순해졌다
이동로직에 문제가 생겼다
입력중에 방향이 안바뀐다
방향을 바꾸기 위해서는 idle 상태로 만들어야 하는 문제가 있다
아무래도 이렇게 하는게 아닌거같은데
이건 과제 제출후에 질문하자
우선 나머지 기능을 구현한다
아... Idle을 기본에 놓고 Walk를 밖에다 놓았는데
반대로 해야한다
Walk를 기본에 놓고 Idle을 밖에다 놓았어야한다
그래야 Walk 중에 바로 방향이 바뀌는데
잘못 생각했었다
'유니티 부트캠프 8기 > Ch04. Unity 게임 개발 입문' 카테고리의 다른 글
isometric 카메라 제한 구역 설정, mathf.clamp (0) | 2025.02.20 |
---|---|
미니게임 추가, 이벤트 트리거를 통한 미니게임 실행, 게임 관련 UI, GameObject.Find와 transform.Find, Resources.FindObjectsOfTypeAll<T> 메서드 차이, LoadScene 다음에 호출되는것, DontDestroyOnLoad 한 뒤에 매니저의 자식으로 된 것을 다시 연결하는 방법 (0) | 2025.02.19 |
2D Tilemap isometric (0) | 2025.02.18 |
2D 탑다운 슈팅 만들기 (0) | 2025.02.18 |
2D 게임을 만들어보자(Flappy Bird 모작) (0) | 2025.02.17 |