¸¶¿ì½º¸¦ ¹öÆ°À» ´©¸£¸é 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 |