Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 유니티 브랜치 merge
- Unity
- 유니티 머지
- M590
- 유니티
- nav오브젝트사이거리
- githubdesktopmerge
- navigation
- 유니티 해상도 변경
- 유니티 합치기
- 오브젝트 깜빡임
- m585 수리
- networkobject.networkid
- networkbehaviourid
- unity merge
- 몬스터
- m590 수리
- stateauthority
- 깃허브 데스크탑 병합
- 유니티 해상도 설정
- unity 병합
- nav거리
- unity git
- 깃허브 데스크탑 합치기
- 유니티 해상도
- Github DeskTop Merge
- m585
- NavMesh
- networkobject
Archives
- Today
- Total
집게사장의 꿈
[영혼들] 컬라이더로 맵에서 플레이어의 위치 찾기 본문
플레이어 위치 판단
게임의 구역은 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 |