NavMesh with Rigidbody

¸¶¿ì½º¸¦ ¹öÆ°À» ´©¸£¸é 2¹ÌÅÍ À§·Î targetÀ» À̵¿½ÃŲ´Ù.  ¸¶¿ì½º ¹öÆ°À» ¶¼¸é Áö¸éÀ¸·Î ¶³¾î¶ß¸°´Ù.
¾Æ¹«·± 󸮵µ ÇÏÁö ¾Ê°í ¶³¾î¶ß¸®¸é Ÿ°ÙÀº ¼ø½Ä°£¿¡ Áö¸éÀ¸·Î ¶³¾îÁú°ÍÀÌ´Ù.

³×ºñ¸Þ½¬ 󸮸¦ OffÇØ¾ß RigidbodyÀÇ ¹°¸® Èû¿¡ ÀÇÇØ ÀÚ¿¬½º·´°Ô ¶³¾îÁú°ÍÀÌ´Ù.

ÁÖ)Ÿ°Ù: Shpere¿¡ NavMeshAgent, Rigidbody, MoveTargetPositon ÄÄÆ÷³ÍÆ®¸¦ Ãß°¡ÇÑ GameObjectÀÌ´Ù.
MoveTargetPositon´Â ½ºÅ©¸³Æ®·Î µÚ¿¡¼­ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇÑ´Ù.
MoveTargetPositon.cs ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÈÄ Agent¸¦ NavMeshAgent ÄÄÆ÷³ÍÆ®·Î ¼³Á¤ÇÑ´Ù.



³×ºñ¸Þ½¬·Î À̵¿ÇÒ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
Rigidbody.isKinematicÀ» true·Î Çϸé ÇÁ·Î±×·¥ÀûÀ¸·Î À̵¿À» Á¦¾îÇÏ°Ô µÈ´Ù.

NavmeshAgent.Resume()
NavmeshAgent.updatePosition = true;
Rigidbody.isKinematic = true;


Rigidbody·Î¸¸ À̵¿ÇÒ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

NavmeshAgent.Sotp()
NavmeshAgent.updatePosition = false;
Rigidbody.isKinematic = false;

MoveTargetPosition.cs ÆÄÀÏ
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveTargetPosition : MonoBehaviour
{

    [SerializeField]
    NavMeshAgent agent = null;

    Coroutine coroutine;
    Coroutine debugCoroutine;

    void OnEnable()
    {
        debugCoroutine = StartCoroutine(UpdateDebug());
        coroutine = StartCoroutine(UpdateNavmesh());
    }

    void OnDisable()
    {
        StopCoroutine(debugCoroutine);
        StopCoroutine(coroutine);
    }

    IEnumerator UpdateDebug()
    {
        while (true)
        {
            yield return new WaitForSeconds(1);
            Debug.Log("agent pos: " + agent.transform.localPosition);
        }
    }

    //Navmesh À̵¿ ¸ÞÀÎ ·çƾ
    IEnumerator UpdateNavmesh()
    {
        //1. NavMesh Agent ÃʱâÈ­
        var mainCamera = Camera.main;
        var agentRigidbody = agent.GetComponent<Rigidbody>();
        RaycastHit hit = new RaycastHit();
        NavMeshHit navHit = new NavMeshHit();

        agentRigidbody.isKinematic = true;

        while (true)
        {
            //2. ¸¶¿ì½º Down ÇÒ ¶§ ±îÁö ´ë±â
            //°æ¿ì¿¡ µû¶ó¼­´Â "ij¸¯Å͸¦ ¼±ÅÃÇÒ ¶§±îÁö"·Î º¯°æ
            yield return new WaitWhile(() => Input.GetMouseButtonDown(0) == false);
            agent.Stop();

            //3. ¸¶¿ì½º UpÇÒ¶§±îÁö ´ë±â
            //2m ³ôÀº À§Ä¡·Î Agent¸¦ À̵¿
            yield return new WaitWhile(() => {
                if (Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition).origin,
                    mainCamera.ScreenPointToRay(Input.mousePosition).direction, out hit, 100,
                    Physics.DefaultRaycastLayers))
                {
                    //¸¶¿ì½º°¡ ´­·¯Á® ÀÖÀ»¶§ °è¼Ó ½ÇÇàµÈ´Ù
                    agent.transform.localPosition = hit.point + Vector3.up * 2;
                }

                return Input.GetMouseButtonUp(0) == false;
            });

            //4. NavMesh Agent disable, Rigidbody·Î À̵¿
            agent.updatePosition = false;
            agentRigidbody.isKinematic = false;

            //5. Navmesh¿Í Áö¸é°úÀÇ °Å¸®°¡ 1ÀÌ µÉ ¶§±îÁö ´ë±â
            yield return new WaitWhile(() => NavMesh.SamplePosition(agent.transform.localPosition, out navHit, 1.0f, NavMesh.AllAreas) == false);


            //6. Navmesh¿Í Áö¸é°úÀÇ ³ôÀÌ°¡ 0.1º¸´Ù ÀÛÀ»¶§±îÁö ´ë±â
            yield return new WaitWhile(() =>
            {
                if (Mathf.Abs(transform.localPosition.y - agent.transform.localPosition.y) < 0.1)
                    return false;
                else
                    return true;
            });

            //7. Navmesh Agent enable
            agent.Resume();
            agent.Warp(navHit.position);
            agent.updatePosition = true;
            agentRigidbody.isKinematic = true;
        }
    }
}

󸮼ø¼­¸¦ Á¤¸® ÇÏ¸é ´ÙÀ½°ú °°´Ù.
- UpdateNavmesh ÇÔ¼ö ¼³¸íÀ¸·Î ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ while¹®À» °è¼Ó µ·´Ù.



yield return new WaitWhileÀº ¸®ÅÏ°ªÀÌ trueÀÌ¸é °è¼Ó ½ÇÇàÇÏ°í falseÀÌ¸é ¹þ¾î³­´Ù.

¸¶¿ì½º ¹öÆ°ÀÌ ¾È´­·¯ ÀÖÀ¸¸é while¹®À» °è¼Ó µ¹°í, ¹öÆ°ÀÌ ´­¸®¸é while¹®À» ¹þ¾î³­´Ù.
yield return new WaitWhile(() => Input.GetMouseButtonDown(0) == false)


Âü°í)
http://tsubakit1.hateblo.jp/entry/2016/11/10/235816

ÄÚ·çƾ WaitWhile
http://theeye.pe.kr/archives/2725