[Go-Unity 3D] 14. Navigation Mesh 연습1 ⭐⭐⭐
카테고리: Go Unity
Navigation Mesh Physics.Raycast, RayCast , RayCastHit, Ray
고박사의 유니티 기초를 정리.
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
오브젝트에 부딪혀 멈추게 되면 부딪힌 오브젝트의 정보를 반환한다.
유니티 Physics.Raycast
유니티 RaycastHIT
유니티 Ray
3. 정리
- Navigation으로 최단루트로 길찾는 방법에 대해서
- 카메라를 Player 오브젝트에 상속시키면 보통게임의 카메라처럼
- RayCast에 대해서 좀더 공부해야 될 것 같다.
댓글남기기