제작/영혼들
[영혼들] 컬라이더로 맵에서 플레이어의 위치 찾기
Krapboss
2024. 8. 2. 00:48
플레이어 위치 판단
게임의 구역은 2가지로 나누어져 있습니다.
1. OutSide 바깥쪽 [저택 외부]
2. Inside 안쪽 [저택 내부]
플레이어의 위치에 따라 몬스터의 위치를 랜덤하게 지정 하는데,그렇기에 플레이어가 어느 "지역"에 있는지 알 수 있어야 됩니다.
컬라이더를 사용한 플레이어 지역 찾기
컬라이더의 Boundary를 이용해 플레이어의 위치를 계산합니다.
각 구역에 해당하는 BoxCollider가 위치한 위치값과 크기를 고려하여 Boundary값을 저장해 놓고 활용합니다.
public class Location
{
public string Name;
public Transform[] LocalLocation;
//플레이어의 위치값을 확인하기 위한 경계값
public BoxCollider[] Bounding;
Vector3[,] BoundaryLength;
public void Init()
{
//각 컬라이더에 해당하는 컬라이더의 월드상의 크기값을 저장합니다.
BoundaryLength = new Vector3[Bounding.Length,2];
for (int i = 0; i < Bounding.Length; i++)
{
Vector3 _center = Bounding[i].gameObject.transform.position + Bounding[i].center;
Vector3 _extents_half = Bounding[i].size * 0.5f;
BoundaryLength[i,0] = _center - _extents_half;
BoundaryLength[i,1] = _center + _extents_half;
Bounding[i].enabled = false;
//Debug.Log($"위치값 바운드를 지정했습니다. {BoundaryLength[i, 0]} ~ {BoundaryLength[i, 1]}");
}
}
실제 사용 시 플레이어 위치값을 파라미터로 받아서 현재 플레이어가 해당 구역에 존재하면 true를 반환하도록 만들었습니다.
//플레이어가 현재 지정된 컬라이더 안에 존재한다면? true를 반환한다.
public bool PlayerInBoundary(Vector3 playerPosition)
{
for (int i = 0; i < Bounding.Length; i++)
{
if (((BoundaryLength[i, 0].x <= playerPosition.x) && (playerPosition.x <= BoundaryLength[i, 1].x))
&& ((BoundaryLength[i, 0].y <= playerPosition.y) && (playerPosition.y <= BoundaryLength[i, 1].y))
&& ((BoundaryLength[i, 0].z <= playerPosition.z) && (playerPosition.z <= BoundaryLength[i, 1].z)))
{
//Debug.Log($"Player가 현재 {Name} 안에 존재합니다.");
return true;
}
}
return false;
}
실제 맵 매니저에서 Location 클래스를 변수로서 활용합니다.
실제 MapManager에서 플레이어 위치를 찾는 방법
//Updata() 에서 주기적으로 호출된다.
public void SearchPlayerLocation()
{
if (searchTimeOut > 0.0f) {
searchTimeOut -= Time.deltaTime;
return;
}
for (int i = 0; i < locations.Length; i++)
{
if (locations[i].PlayerInBoundary(PlayerEvent.instance.transform.position))
{
playerLocationName = locations[i].Name;
searchTimeOut = searchTime;
return;
}
}
searchTimeOut = searchTime;
//Debug.LogWarning("현재 플레이어의 위치를 찾을 수 없습니다.");
}