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();
        }
    }

 

+ Recent posts