집게사장의 꿈

[영혼들] 컬라이더로 맵에서 플레이어의 위치 찾기 본문

제작/영혼들

[영혼들] 컬라이더로 맵에서 플레이어의 위치 찾기

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("현재 플레이어의 위치를 찾을 수 없습니다.");
}

 

 

'제작 > 영혼들' 카테고리의 다른 글

[영혼들] 씬 불러오기  (0) 2024.08.02
[영혼들] 사운드 추격  (0) 2024.08.02
[영혼들] 아이템 상호작용  (0) 2024.08.02
[영혼들]아이템 - 오르골  (0) 2023.11.04
[영혼들] 몬스터 추격 최종 완성  (0) 2023.10.20