TIL(2024,09,05)무한맵 만들기

김보근·2024년 9월 5일

Unity

목록 보기
78/113

TIL: Unity에서 OnTriggerExit2D를 사용하여 무한 맵 구현

오늘은 Unity에서 OnTriggerExit2D 메서드를 활용하여 무한 맵을 만드는 방법을 배웠습니다. 기본적으로 플레이어가 맵의 특정 영역을 벗어났을 때 맵의 오브젝트를 다시 재배치하는 방식입니다.

핵심 개념:

무한 맵 구현: 플레이어가 특정 구역을 벗어났을 때, 맵의 일부분이 플레이어 앞쪽으로 이동하여 무한히 맵을 탐험하는 것처럼 보이게 만듭니다.
충돌 감지: Unity의 2D 충돌 감지 시스템을 사용하여, 플레이어가 맵의 경계를 벗어날 때 트리거 이벤트(OnTriggerExit2D)가 발생하게 설정.
맵 재배치: 플레이어와 오브젝트의 상대적인 위치를 계산하여, 맵 오브젝트가 플레이어의 진행 방향으로 일정 거리만큼 이동합니다.

코드 설명:
충돌 감지: OnTriggerExit2D 메서드는 2D Collider가 오브젝트에서 나갈 때 호출됩니다. 여기서는 충돌한 Collider가 "Area" 태그를 가지고 있는지 확인한 후 동작을 수행합니다.

플레이어 위치와 방향 계산:

GameManager.Instance.player.transform.position을 통해 플레이어의 위치를 얻고, 현재 오브젝트의 위치와 비교하여 X축 및 Y축 좌표 차이를 계산합니다.
또한, 플레이어의 진행 방향 벡터를 확인하여, 그에 맞게 오브젝트가 이동할 방향을 설정합니다.

맵 오브젝트 재배치:

오브젝트가 "Ground" 태그를 가지고 있다면, 플레이어의 X 또는 Y 좌표 차이에 따라 오브젝트를 X축 또는 Y축으로 40 유닛만큼 이동시킵니다.
이로 인해 플레이어가 맵의 경계를 벗어나면, 오브젝트는 다시 앞쪽으로 이동하여 무한히 맵이 이어지는 것처럼 보이게 됩니다.

배운 점:
OnTriggerExit2D를 활용하면 간단하게 플레이어의 충돌 영역을 감지하고, 그에 맞춰 오브젝트를 재배치하여 무한히 이동할 수 있는 맵을 만들 수 있음을 배웠습니다.
플레이어의 위치와 방향을 계산하여, 맵의 일부를 동적으로 이동시킴으로써 게임 성능을 최적화할 수 있다는 점이 인상적이었습니다.

개선할 점:
현재는 "Ground" 태그의 오브젝트만 이동 처리를 하고 있지만, 이후에 "Enemy" 등의 오브젝트도 이동 처리 로직을 추가하여 더 복잡한 무한 맵을 구현할 수 있습니다.

스크립트

using UnityEngine;

public class Reposition : MonoBehaviour
{
    // 2D Collider가 이 오브젝트에서 나갈 때 호출되는 메서드
    private void OnTriggerExit2D(Collider2D collision)
    {
        // Collider의 태그가 "Area"가 아닐 경우 아무 작업도 하지 않고 리턴
        if (!collision.CompareTag("Area"))
            return;

        // GameManager에서 플레이어의 현재 위치를 가져옴
        Vector3 playerPos = GameManager.Instance.player.transform.position;
        // 현재 오브젝트(자신)의 위치를 가져옴
        Vector3 myPos = transform.position;
        // 플레이어와 오브젝트 간의 X, Y 좌표 차이 계산
        float diffX = Mathf.Abs(playerPos.x - myPos.x);
        float diffY = Mathf.Abs(playerPos.y - myPos.y);

        // GameManager에서 플레이어가 이동 중인 방향 벡터를 가져옴
        Vector3 playerDir = GameManager.Instance.player.playerVector;
        // 플레이어의 이동 방향에 따라 X와 Y의 방향을 결정 (-1 또는 1)
        float dirX = playerDir.x < 0 ? -1 : 1;
        float dirY = playerDir.y < 0 ? -1 : 1;

        // 오브젝트의 태그에 따라 다른 행동을 수행
        switch (transform.tag)
        {
            case "Ground":
                // X 좌표의 차이가 Y 좌표의 차이보다 클 경우 X축으로 이동
                if (diffX > diffY)
                {
                    transform.Translate(Vector3.right * dirX * 40); // X축으로 40 유닛 이동
                }
                // Y 좌표의 차이가 X 좌표의 차이보다 클 경우 Y축으로 이동
                else if (diffX < diffY)
                {
                    transform.Translate(Vector3.up * dirY * 40); // Y축으로 40 유닛 이동
                }
                break;
                
            case "Enemy":
                // "Enemy" 태그의 경우는 아직 구현되지 않음
                break;
        }

    }

}

이번 프로젝트를 통해 무한 맵 구현의 기본적인 원리를 이해할 수 있었고, 향후 게임 개발에 유용하게 적용할 수 있을 것 같습니다!

profile
게임개발자꿈나무

0개의 댓글