유니티:내비게이션

학교의 모든 지식. SMwiki
Sam (토론 | 기여)님의 2021년 8월 3일 (화) 12:50 판 (→‎개요)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
둘러보기로 이동 검색으로 이동

틀:유니티

  1. 유니티:개요
  2. 유니티:기본 조작
    1. 유니티:에셋스토어
  3. 유니티:카메라
  4. 유니티:오브젝트
    1. 유니티:데이터 입력받기
    2. 유니티:오브젝트 이동(오브젝트 조작)
    3. 유니티:힘으로 오브젝트 이동
    4. 유니티:충돌 이벤트
    5. 유니티:오브젝트 작성 tip
    6. 유니티:프리팹
  5. 유니티:코딩기초
    1. 유니티:C sharp 코딩 편의기능
    2. 유니티:MonoBehaviour
    3. 유니티:이벤트 메서드
    4. 유니티:컴포넌트 조작하기
  6. 유니티:UI
  7. 유니티:게임 내 화면
  8. 유니티:플레이어
    1. 유니티:모델
    2. 유니티:캐릭터 이동
    3. 유니티:애니메이션
    4. 유니티:주인공 시점
  9. 유니티:맵
    1. 유니티:투명한 벽 만들기
    2. 유니티:내비게이션
  10. 유니티:씬
  11. 유니티:몬스터
  12. 유니티:아이템
  13. 유니티:음향
    1. 유니티:배경음
    2. 유니티:효과음
  14. 유니티:빌드
  15. 유니티:VR
    1. 유니티:VR:UI
    2. 유니티:VR:VR로 변환
  16. 유니티:팁

개요[편집 | 원본 편집]

몬스터 따위가 길을 찾기 위해 안내해주는 과정.

방법[편집 | 원본 편집]

  1. 지형에 해당하는 오브젝트를 Static화 한다.(인스펙터 창에서 이름 옆에 체크박스가 있다.)
  2. 내비게이션 메시 생성.
    Static인 오브젝트들의 경사, 높이 따위를 통해 다닐 수 있는 길을 지정한다.
    Window>AI>Navigation에서 Bake 메뉴 선택. 여기에서 다시 Bake버튼 클릭.
  3. 내비게이션 메시 지정.
    몬스터 따위의 오브젝트에 Nav Mesh Agent 컴포넌트를 추가한다.
    그냥 내버려두면 몬스터가 내비게이션 목표물과 겹치는데, Stopping Distance 값을 주면 겹치기 전에 멈춘다.
  4. 스크립트로 이동을 제어한다.

제어 스크립트[편집 | 원본 편집]

다음과 같이 NavMeshAgent를 통해 움직임을 제어할 수 있다.

(아래엔 공격시간이라든가, 몬스터의 체력 따위들이 섞여 있으니, 필요한 것만 뽑아다 쓰자. 나중에 필요없는 것들은 지워버리자.)

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(UnityEngine.AI.NavMeshAgent))]
public class Drone : MonoBehaviour {
	UnityEngine.AI.NavMeshAgent agent;
	Transform tower;
	public float ATTACK_TIME = 2;
	float attackTime = 0;
	public int MAX_HP = 3;
	[System.NonSerialized]
	public int hp = 0;

	public float ATTACK_DISTANCE = 1;
	// Use this for initialization
	void Start () {
		agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
		tower = GameObject.Find("Tower").transform;
		agent.destination = tower.position;

		hp = MAX_HP;
		attackTime = ATTACK_TIME;
	}


	void Update()
	{
		
		if(agent.remainingDistance <= ATTACK_DISTANCE)
		{
			attackTime += Time.deltaTime;
			if(attackTime > ATTACK_TIME)
			{
				attackTime = 0;
				Tower.Instance.Damage();
			}
		}
	}
}