[Go-Unity 3D] 14. Navigation Mesh 연습1 ⭐⭐⭐

업데이트:

카테고리:

태그: , ,


Navigation Mesh Physics.Raycast, RayCast , RayCastHit, Ray

고박사의 유니티 기초를 정리.

image

1. MovementNav.SC

AI로 자동으로 목표지점까지 이동.

MovementNav.cs

using System.Collections; 
using UnityEngine;
using UnityEngine.AI;

public class Movementnav : MonoBehaviour
{
    [SerializeField]
    private float moveSpeed = 5.0f;
    private NavMeshAgent navMeshAgent;

    private void Awake(){
        navMeshAgent = GetComponent<NavMeshAgent>();
    }
    
    public void MoveTo(Vector3 goalPosition){
        // 기존에 이동 행동을 하고 있었다면 코루틴 중지
        StopCoroutine ("OnMove");
        // 이동 속도 설정
        navMeshAgent.speed = moveSpeed;
        // 목표지점 설정 (목표까지의 경로 계산 후 알아서 움직인다)
        navMeshAgent.SetDestination (goalPosition);
        // 이동 행동에 대한 코루틴 시작
        StartCoroutine ("OnMove");
    }

    IEnumerator OnMove(){
        while (true)
        {
        // 목표 위치(navMeshAgent.destination)와 내 위치(transform.position)의 거리가 0.1미만일 때 
        // 즉, 목표 위치에 거의 도착했을 때
            if (Vector3.Distance (navMeshAgent.destination, transform.position) < 0.1f)
            {
                // 내 위치를 목표 위치로 설정
                transform.position = navMeshAgent.destination;
                // SetDestination()에 의해 설정된 경로를 초기화. 이동을 멈춘다.
                navMeshAgent.ResetPath();
                break;
            }
        yield return null;
        }
    }
}
  • 인공지능을 이용하기 위해서 UnityEngine.AI 가 필요하다.
  • OnMove의 Vector.Distance(A,B)는 A,B 사이의 거리 값(Vector3)을 구한다.
  • NavMeshAgent.destination : SetDestination으로 설정한 목표지정(Vector3) 정보가 저장되어 있다.
  • NavMeshAgent.ResetPath() : 현재 설정되어 있는 이동 경로를 초기화하여 이동을 멈춘다.





2. PlayerConNav.CS

Physics.Raycast 화면에 광선을 쏘고 오브젝트를 인식한다.

PlayerConNav.cs

using UnityEngine;
public class PlayerConNav : MonoBehaviour
{
    private MovementNav movementNav;

    private void Awake(){
    movementNav = GetComponent<MovementNav>();
    }

    private void Update(){
        // 마우스 왼쪽 버튼을 눌렀을 때
        if (Input.GetMouseButtonDown(0) ){
            RaycastHit hit;
            
            // 카메라로부터 마우스 좌표(Input.mousePosition) 위치를 관통하는 광선 생성 
            // Camera.main: 태그가 "Camera" 인 오브젝트 = "Main Camera"
            // ray.origin : 광선의 시작 위치
            // ray.direction : 광선의 진행방향
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);

            // Physics. Raycast(): 광선을 발사해서 부딪히는 오브젝트를 검출
            // (광선에 부딪히는 오브젝트가 있으면 true 반환)
            // ray.origin 위치로부터 ray.direction 방향으로 무한한 길이(Mathf.Infinity)의 광선 발사 
            // 광선에 부딪히는 오브젝트의 정보를 hit에 저장
            if (Physics.Raycast (ray, out hit, Mathf. Infinity) ){
                // hit.transform.position : 부딪힌 오브젝트의 위치
                // hit.point : 광선과 오브젝트가 부딪힌 세부 위치

                // hit.point를 목표위치로 이동!
                movementNav.MoveTo(hit.point);
            }
        }
    }
}
  • RaycastHit : 카메라 -> 화면의 마우스포인터 -> 물체 로 광선을 생성
  • Ray : 원점에서 어떤방향으로 가는 무한선을 생성
  • (카메라위치 부터 마우스 포인트까지의 선을 생성)

RayCast

오브젝트에 부딪혀 멈추게 되면 부딪힌 오브젝트의 정보를 반환한다. image
유니티 Physics.Raycast
유니티 RaycastHIT
유니티 Ray





3. 정리

  • Navigation으로 최단루트로 길찾는 방법에 대해서
  • 카메라를 Player 오브젝트에 상속시키면 보통게임의 카메라처럼
  • RayCast에 대해서 좀더 공부해야 될 것 같다.


참고 : 유니티 TOP


📔

댓글남기기