NavMesh.SamplePosition() 메서드의 정보
주어진 위치에 가장 가까운 Mesh 위치를 찾기 위해 사용되는 메서드
여기서 Mesh란 3D 컴퓨터 그래픽스에서 사용되는 용어로 객체의 표면을 구성하는 다각형 집합이라고 합니다.
NavMesh 에서는 게임 오브젝트들이 이동할 수 있는 경로와 영역을 정의하는데 사용되는 듯 합니다.
일단 이 메서드를 사용하여 설정한 경로위치를 탐색하고 탐색된 오브젝트에 접근할수 있다라고 생각하려합니다.
매개변수 설명
Vector3 SourcePosition : 샘플링 시작위치
out NavMeshHit hit : 샘플링 결과를 저장할 변수
float maxDistance : 샘플링할 최대 거리
int areaMask : 샘플링할 영역 설정 (NavMesh.AllAreas 를 사용시 모든 영역에서 샘플링 시도)
Random.onUnitSphere
반지름이 1인 구면의 표면에서 임의의 지점을 반환한다고 되어있습니다.
제가 이해한 바로는 Random.onUnitSphere로 유닛의 위치값에 반구모양의 범위만큼 넓히고 넓히고 거기에 반구의 반지름을 Random.Range(min,max)를 곱하여 이 범위중 임의의 좌표가 탐색지점이 되는 것 같습니다.
NavMeshHit hit;
NavMesh.SamplePosition(transform.position + (Random.onUnitSphere * Random.Range(minWanderDistance, maxWanderDistance)),out hit, maxWanderDistance, NavMesh.AllAreas);
directionToPlayer는 플레이어와 이 오브젝트의 거리로 방향을 구한 것으로 방향을 구하고자 한다면
(목표 대상의 위치 - 가는 대상의 위치) 를 해주어야합니다.
Vector3.Angle은 대상과 대상사이의 각도를 구하는 것입니다.
fieldOfView(시야각) 을 반으로 나눠준 이유는 위에서 각도를 구한 것이 오브젝트의 좌 우 중 어떤 방향인지 모르기에 120도를 반으로 나누어 좌 우를 표현한 것입니다.
private bool IsPlayerInfieldOfView()
{
Vector3 directionToPlayer = CharacterManager.Instance.Player.transform.position-transform.position;
float angle = Vector3.Angle(transform.forward, directionToPlayer);
return angle < fieldOfView * 0.5f;
}
Mathf.Approximately는 매개변수의 값들이 근사값인지를 구분합니다.
근사값이 아니라면 Math.MoveTowards는 ()안의 첫번 째 값에서 두번 째 값으로 점진적으로 변하는 것으로
여기서는 음악 볼륨이 0으로 설정되어 있다가 collider에 접촉시 소리가 점진적으로 커지고 나갈 때 점진적으로 작아지는
방식입니다.
void Update()
{
if (!Mathf.Approximately(audioSource.volume, targetVolum))
{
audioSource.volume = Mathf.MoveTowards(audioSource.volume, targetVolum, (maxVolume/fadeTime) * Time.deltaTime);
}
}
개인과제를 진행하면서 다시 한번 회고한 것 velocity 는 속도를 고정시키기 때문에 AddForce와 함께 쓸 때의 주의 점은
AddForce를 사용할 방향을 고정시키면 안된다는 것이다.
private void Move()
{
Vector3 moveDir = new Vector3(dir.x,0, dir.y);
_rigidbody.velocity = dir*speed;
}
===>
private void Move()
{
Vector3 moveDir = new Vector3(dir.x,0, dir.y)*speed;
_rigidbody.velocity = new Vector3(moveDir.x,_rigidbody.velocity.y,moveDir.z);
}
강의에서도 보았지만 강의 내용없이 스스로 해결하는 과정에서 첫번째 메서드 처럼 로직을 작성하였다가 점프를 할 수 없는 상황에 부딪혔다. 자연스럽게 점프를 하기 위해선 y축의 값의 고정을 풀어야하기에 오브젝트의 Rigidbody의 y좌표를 다시 가져와서 넣어주어 해결하였다.
'TIL' 카테고리의 다른 글
2024 10 30 TIL (0) | 2024.10.30 |
---|---|
2024 10 29 TIL (0) | 2024.10.29 |
2024 10 27 TIL (0) | 2024.10.27 |
2025 10 25 TIL (0) | 2024.10.25 |
2024 10 24 TIL (0) | 2024.10.24 |