오늘은 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;
}
}
}
이번 프로젝트를 통해 무한 맵 구현의 기본적인 원리를 이해할 수 있었고, 향후 게임 개발에 유용하게 적용할 수 있을 것 같습니다!
