TIL

2024 10 28 TIL

noc777 2024. 10. 28. 11:58

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