gotoPlayerAndFertilize() 함수 사용 모습
NPC에 적용한 스크립트와 Nav Mesh Agent
Nav Mesh Agent는 콜라이더 처럼 테두리가 있다.
테두리가 객체보다 크면 객체가 장애물을 테두리가 클 수록 크게 돌아간다.
사이즈를 적당하게 조절하지 않으면 객체가 공중에 떠서 이동하는 경우도 있었다.
Navigation_farmer
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class Navigation_farmer : MonoBehaviour
{
Rigidbody myRigid;
[SerializeField] private float moveSpeed;
private static Vector3 originPos;
private static NavMeshAgent agent;
[SerializeField] private Transform tf_Destination;
private bool justone;
private static bool goto_on;
DateTime StartTime;
DateTime EndTime;
// Start is called before the first frame update
void Start()
{
myRigid = GetComponent<Rigidbody>();
agent = GetComponent<NavMeshAgent>();
originPos = transform.position;
StartCoroutine(checkLotation());
justone = true;
gotoPlayerAndFertilize();
}
private IEnumerator checkLotation()
{
while(true)
{
if (Vector3.Distance(transform.position, originPos) < 0.5f)
{
if(LookAtPlayer.player_in_farmerTrigger == false)
transform.rotation = Quaternion.Euler(0, 90, 0);
if (goto_on == false)
farmer_animator.IsMove = false;
LookAtPlayer.ShowUI = true;
}
else
LookAtPlayer.ShowUI = false;
yield return new WaitForSeconds(1f);
}
}
public void gotoPlayerAndFertilize()
{
goto_on = true;
farmer_animator.IsMove = true;
agent.SetDestination(tf_Destination.position);
StartCoroutine(waitMeeting());
}
static public void gotoOrigin()
{
goto_on = false;
agent.SetDestination(originPos);
farmer_animator.IsMove = true;
}
private IEnumerator waitMeeting()
{
while(true)
{
if(Vector3.Distance(transform.position, tf_Destination.position) < 0.3f)
{
farmer_animator.IsMove = false;
farmer_animator.Fertilize_on = true;
break;
}
yield return new WaitForSeconds(1f);
}
}
}
네비게이션을 사용하기 위해선 map 을 Navigation Static 설정해주어야 한다.
다음 bake를 통해 지형을 ai가 인식할 수 있도록 해야한다.
<bake를 하기위한 경로>
탭에서 Window를 선택 -> AI 를 선택 -> Navigation 선택
눌렀으면 Inspector 창 옆에 Navigation이 생성된다.
<추가 정보>
[SerializeField] 를 변수 앞에 붙이면 Unity Inspector 창에서 값을 볼 수 있게되며 설정 또한 할 수 있게된다.
Vector3.Distance(transform.position, originPos) < 0.5f
위 함수는 2가지 객체의 position 정보를 받아서 위치를 비교하여 값을 반환하는 함수이다.
agent = GetComponent<NavMeshAgent>();
agent.SetDestination(originPos);
위 agent 객체를 통해 목표점으로 이동할 수 있다.
비료를 준 후 원래 자리로 이동을 위해 아래 함수에 추가된 gotoOrigin()
public void invisible_Fertilize_box()
{
if (Fertilize_on)
{
Fertilize_on = false;
Navigation_farmer.gotoOrigin();
}
}
'Unity3D' 카테고리의 다른 글
[Unity3D] 현재 진행상황을 알리기 위한 화살표 이동 (0) | 2020.07.16 |
---|---|
[Unity] 트리거 인식을 위한 조건, 버튼 마우스 클릭 반응을 위한 조건 (0) | 2020.06.19 |
[unity]유니티 생명주기 중 OnEnable, 그리고 코루틴 (0) | 2020.05.21 |
[unity]lookAt 함수 x,z축으로만 보게 만들기 (0) | 2020.05.20 |
[Unity3D]자라나는 식물 구현 (0) | 2020.03.21 |