character controller๋ ๊ฐ์ด ์์ด์ผ ํ๋ค.
๐ Navigation ํ์ฑํํ๊ธฐ
Agents์ ์์ฑ๊ฐ๋ค์ character controller์ ๊ฐ๋ค๊ณผ ๋์ผํ๊ฒ ๋ง์ถฐ์ค๋ค.
๊ธธ์ฐพ๊ธฐ ์ค๋ธ์ ํธ๋ฅผ ๋น๋ํ ๋ฉ์ฌ ์ ํ
navigation ๐ object ๐ mesh renderers
mesh๋ฅผ ํฌํจํ๊ณ ์๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ค์ด ์ ๋ ฌ๋๋ค.
๋น๋ํ ์ค๋ธ์ ํธ๋ค์ ์ ํ
- offMeshLinks : ์ ํ ๋ฐ ์๊ฐ์ด๋ ๋ฑ ๋ค๋ฅธ ํ๋๋ค์ ์ค์ ํด์ค ์ ์๋ ๊ฒ
- navigation area : walkable = ์ฌ์ฉ์๊ฐ ์ด๋ํ ์ ์๋ ๊ฒ์ผ๋ก ์ค์ cf. not walkable = ์ด๋ํ ์ ์๋ ๊ฒ
terrains ์ ํ ๐ ํ์ด์ด๋ผํค์ ๊ธฐ์กด์ terrains ์์ ์ ํ ์ค๋ธ์ ํธ๋ค์ด ์ ๋ ฌ๋จ
mesh renderers์ ๋์ผํ๊ฒ walkable, not walkable ์ค์
bake : ๋ค๋น๊ฒ์ด์ ๋ฉ์ฌ ๋น๋ ๐ bake ๋ฒํผ ํด๋ฆญ
์ ์ฉ๋ ๋ถ๋ถ๋ค์ด ํ๋์์ผ๋ก ๋ณด์ธ๋ค.
๐ ์ด๋ํ ์ค๋ธ์ ํธ(์บก์)์ nav mesh agent ์ปดํฌ๋ํธ ์ฝ์
- angular speed : ์ด๋น ์ด๋์๋
using UnityEngine;
using UnityEngine.AI;
namespace FastCampus.Characters {
[RequireComponent(typeof(NavMeshAgent)), RequireComponent(typeof(CharacterController))]
public class AgentControllerCharacter : MonoBehaviour {
#region Variables
private CharacterController characterController;
private NavMeshAgent agent;
private Camera camera;
[SerializeField] private LayerMask groundLayerMask;
#endregion
#region Unity Methods
private void Start() {
characterController = GetComponent<CharacterController>();
agent = GetComponent<NavMeshAgent>();
agent.updatePosition = false; // agent์ ์ด๋ ์์คํ
์ ์ฌ์ฉํ์ง ์๋๋ค.
agent.updateRotation = true; // agent์ ํ์ ์์คํ
์ ์ฌ์ฉํ๋ค.
camera = Camera.main;
}
private void Update() {
// Process mouse left button input
if (Input.GetMouseButtonDown(0)) {
// Make ray from screen to world
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
// Check hit from ray
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100, groundLayerMask)) {
Debug.Log("We hit " + hit.collider.name + " " + hit.point);
// Move our player to what we hit
agent.SetDestination(hit.point);
}
}
if (agent.remainingDistance > agent.stoppingDistance) {
characterController.Move(agent.velocity * Time.deltaTime);
}
else {
characterController.Move(Vector3.zero);
}
}
private void LateUpdate() {
transform.position = agent.nextPosition;
}
#endregion Main Methods
}
}