[유니티] 자판기 Vendingh Machine 만들기 때 잠시 했었는데 마우스의 정보를 레이저를 싸서 가져온다고 생각을 하면됨



카메라 컴포넌트는 월드를 캡처하여 플레이어에게 보여주는 장치이므로 카메라는 많은 정보를 가지고 있다.
역행렬을 해주면 실제 값을 알 수 있기 때문에 마우스가 클릭된 값을 자판기 만들기에서는
Vector3 mousePos = Input.mousePosition;
mousePos.z = cam.nearClipPlane;
Vector3 screenToWorld = cam.ScreenToWorldPoint(mousePos);
마우스의값 z를 절두체를 넣어주면서 스크린에서 월드로 보내주고있다.
RaycastHit hitInfor;
if (Physics.Raycast(screenToWorld, dir, out hitInfor))
{
if (hitInfor.transform.CompareTag("Player")) return;
moveDest = hitInfor.point;
LookAtdestination();
state = Estate.Move;
}
외부의 내용을 얕은 복사를 할려면 ref, out이 필요함 으로 out hitInfor를 해주고 있고
레이캐스트의 Physics.Raycast의 버전중 레이저가 시작되는 방향, 레이저가 뻗어나가는 방향, out hit, float maxdistance 등이 있고 필요한건 오버라이딩하면서 쓰면 됨 리턴값은 bool로 나옴
그래서 hitIfor가 있다면 안에 있는 코드들이 실행이 됨
쌤이 올려준 코드로 다시 한번 해석하면
NavMesh(네비메쉬) 위의 지점 유효한지 .. : 네이버블로그
using UnityEngine;
using UnityEngine.AI;
public class NavPlayer : MonoBehaviour
{
private NavMeshAgent agent = null; // 머신러닝 모델을 적용하여 게임 내 인공지능(AI)을 제어하는 데 사용되는 핵심 요소
//[유니티] NavMesh 편을 보면 이해가 됨
private bool isMoving = false; //상태값 제어
private void Awake()
{
agent = GetComponent<NavMeshAgent>();//agent가져오기
}
private void Update()
{
//마우스 좌클릭을 했을 때//
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//마우스의 위치값을 Ray로 보냄
RaycastHit hit; //RaycastHit타입 만들기
//마우스의 Ray값이 있는지 검사 //
if (Physics.Raycast(ray, out hit))//시작지점 마우스 Ray값과, hit 넣기
{
// 픽킹 포인트가 네비메쉬 위에 있는지 검사 //
NavMeshHit navHit;//NavMeshHit타입 만들기
//1//
//1// if (NavMesh.SamplePosition(hit.point, out navHit, 1f, NavMesh.AllAreas))
//만약 NaveMesh.SamplePosition True이면 레이저가 쏘아진곳인 hit.point에 1f ...
{
//2// agent.SetDestination(navHit.position); //?
isMoving = true;
}
}
}
// 경로 탐색이 끝났다면,
//3// if (isMoving && !agent.pathPending)
{
// 경로가 장애물로 막혀 있는지 검사
NavMeshHit obstaclesHit;
//4// bool noObstacles = NavMesh.Raycast(transform.position, agent.destination, out obstaclesHit, NavMesh.AllAreas);
// 장애물에 없다면 빨간색, 장애물에 가로막혔다면 파란색으로 표시
Debug.DrawLine(
//5// agent.destination,
agent.destination + (Vector3.up * 5f),
noObstacles ? Color.red : Color.blue);
if (agent.remainingDistance <= agent.stoppingDistance)
{
Debug.Log("Moving Done");
isMoving = false;
}
}
}
}
[출처] NavMesh(네비메쉬) 위의 지점 유효한지 검사하기|작성자 구름고래
해석하다가,, 망함 아래 1,2, 3, 4, 5을 유니티 공식 문서를 보면서 이해해야 할것 같음
Unity - Scripting API: AI.NavMesh.Raycast
Unity - Scripting API: AI.NavMesh.SamplePosition
NavMeshAgent에 목표로 이동 지시 - Unity 매뉴얼
AI.NavMeshAgent-SetDestination - Unity 스크립팅 API
1. if (NavMesh.SamplePosition(hit.point, out navHit, 1f, NavMesh.AllAreas))
2. agent.SetDestination(navHit.position);
3. agent.pathPending
4. bool noObstacles = NavMesh.Raycast(transform.position, agent.destination, out obstaclesHit, NavMesh.AllAreas);
5. agent.destination
[NavMesh.samplePosition] -1
public static bool SamplePosition(Vector3 sourcePosition, out AI.NavMeshHit hit, float maxDistance, int areaMask);
| Parameter | Description |
| sourcePosition | Vector3자료형의 샘플쿼리의 고유의 값 |
| hit | hit 결과 위치의 속성을 보유하게될 예정 hit 의 값은 계산되지 않음 항상 (0,0,0) |
| maxDistance | sourcePosition내에서 maxDistance까지를 샘플링 |
| areaMask filter |
가장 가까운 지점을 찾을 때 허용되는 NavMesh 영역을 지정하는 마스크 or 필터 |
bool SamplePosition 속성? 묘사?
지정된 범위 내에서 NavMesh를 기준으로 가장 가까운 지점을 찾기
[NavMesh.Raycast] - 4
public static bool Raycast(Vector3 sourcePosition, Vector3 targetPosition, 아웃 AI. NavMeshHit hit, int areaMask);
| sourcePosition | 광선의 원점 |
| targetPosition | 광선의 끝 |
| 치다 | 광선 투사 결과 위치의 속성을 보유 |
| 에어리어 마스크 | 광선을 추적할 때 전달할 수 있는 NavMesh 영역을 지정하는 비트 필드 마스크 |
[Agent 프로퍼티] - 2,3,5
| Property | Description |
| destination | 에이전트의 대상을 세계 공간 단위로 가져오거나 설정하려고 시도 <가져오기> • 상황 - 목적지가 설정되었지만 경로가 아직 처리되지 않았다면 반환되는 위치 - 이전에 설정한 위치에 가장 가까운 유효한 탐색 메시 위치 • 상황 - 에이전트에 경로가 없거나 요청된 경로가 있는 경우 - 반환되는 위치 - 내비게이션 메시에서 에이전트 위치 • 에이전트가 navmesh에 매핑되지 않은 경우(예: Scene에 navmesh가 없는 경우) - 무한대의 위치를 반환 <설정> 에이전트에게 요청된 대상에 가장 가까운 유효한 내비메시 위치로 이동하도록 • 몇 프레임이 지나야 경로 결과를 사용 • 경로가 계산되는 동안 pathPending은 true가 됨 • 상황 - 유효한 인근 navmesh 위치를 찾을 수 없는 경우 요청 - x |
| pathPending | NavMeshAgent의 계산이 완료 되었다는 프로퍼티 (읽기 전용) |
| SetDestination | Vector3자료형으로 대상설정, • 몇 프레임이 지나야 경로 결과를 사용 • 경로가 계산되는 동안 pathPending은 true가 됨 • 상황 - 명시적으로 처리해야 하는 경우 |
| remainingDistance | 에이전트의 위치와 현재 경로의 목적지 사이의 거리 남은 거리를 알 수 없는 경우 이 값은 무한대가 됨 |
| stoppingDistance |
다시 해석
using UnityEngine;
using UnityEngine.AI;
public class NavPlayer : MonoBehaviour
{
private NavMeshAgent agent = null; // 머신러닝 모델을 적용하여 게임 내 인공지능(AI)을 제어하는 데 사용되는 핵심 요소
//[유니티] NavMesh 편을 보면 이해가 됨
private bool isMoving = false; //상태값 제어
private void Awake()
{
agent = GetComponent<NavMeshAgent>();//agent가져오기
}
private void Update()
{
//마우스 좌클릭을 했을 때//
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//마우스의 위치값을 Ray로 보냄
RaycastHit hit; //RaycastHit타입 만들기
//마우스의 Ray값이 있는지 검사 //
if (Physics.Raycast(ray, out hit))//시작지점 마우스 Ray값과, hit 넣기
{
// 픽킹 포인트가 네비메쉬 위에 있는지 검사 //
NavMeshHit navHit;//NavMeshHit타입 만들기
//1// if (NavMesh.SamplePosition(hit.point, out navHit, 1f, NavMesh.AllAreas))
//SamplePosition에 레이저가 쏘아진곳인 hit.point,
//결과들어갈변수명 out navHit,
//hit.potint로 찾을 공간의 위로 최대거리 1f,
//hit.potint로 찾을 공간인데 NavMesh로 되어있는곳
{
//2// agent.SetDestination(navHit.position); //hit.point가 -> out navHit으로 됨
isMoving = true;
}
}
}
// 경로 탐색이 끝났다면,
//3// if (isMoving && !agent.pathPending) // isMoving이며, 쿼리요청중이 아니라면 경로탐색이 끝난것
{
// 경로가 장애물로 막혀 있는지 검사
NavMeshHit obstaclesHit;
//4// bool noObstacles = NavMesh.Raycast(transform.position, agent.destination, out obstaclesHit, NavMesh.AllAreas);
// 장애물에 없다면 빨간색, 장애물에 가로막혔다면 파란색으로 표시
Debug.DrawLine(
//5// agent.destination, //시작지점으로 agent.destination
agent.destination + (Vector3.up * 5f), //목적지
noObstacles ? Color.red : Color.blue);// 만약에 noObstacles가
true이면 Color.red
false이면 Color.blue
if (agent.remainingDistance <= agent.stoppingDistance)
{
Debug.Log("Moving Done");
isMoving = false;
}
}
}
}
'유니티' 카테고리의 다른 글
| [유니티] Terrain 3D BG (0) | 2025.05.09 |
|---|---|
| [유니티] Nev Mesh로 움직이기 (0) | 2025.05.07 |
| [유니티] 캐릭터 움직임 에러 (0) | 2025.05.05 |
| [유니티] NavMesh (0) | 2025.05.02 |
| [유니티] 움직임 override Layer, 블렌더 사용 (0) | 2025.05.01 |