이 페이지는 A* Pathfinding Project를 사용하여 캐릭터를 수동으로 이동시키는 방법을 설명합니다.
Contents
Introduction
게임에서 플레이어 캐릭터를 키보드 또는 게임 패드를 사용하여 제어하거나, 포인트 앤 클릭 이동을 사용하여 제어하고자 할 수 있습니다. 이 튜토리얼에서는 사용할 수 있는 몇 가지 다른 설정을 설명합니다.
Case studies
Keyboard movement with pathfinding
키보드를 사용하여 캐릭터를 이동시키는 것은 게임에서 캐릭터를 제어하는 일반적인 방법입니다. 이는 액션 게임, 플랫폼 게임 및 플레이어가 캐릭터의 움직임을 직접 제어하는 다른 게임에서 자주 사용됩니다. 일반적으로 WASD 키 또는 화살표 키를 사용하여 캐릭터를 이동시킵니다.
이를 달성하기 위해 내장된 이동 스크립트 중 하나를 사용할 수 있으며, 현재 키보드 입력에 의해 나타나는 방향으로부터 몇 미터 떨어진 지점에 에이전트의 목적지를 지속적으로 설정합니다.
using UnityEngine;
using Pathfinding;
public class PlayerMovement : MonoBehaviour {
public float lookaheadDistance = 1f;
IAstarAI ai;
void OnEnable () {
ai = GetComponent<IAstarAI>();
}
void Update () {
// 현재 키보드 입력을 확인합니다.
var dx = Input.GetAxis("Horizontal");
var dz = Input.GetAxis("Vertical");
// 첫 번째 활성화된 카메라를 가져옵니다.
var cam = Camera.allCameras[0];
// 카메라를 기준으로 한 이동 방향을 계산합니다.
var forward = cam.transform.forward;
forward.y = 0;
forward.Normalize();
var right = cam.transform.right;
right.y = 0;
right.Normalize();
// AI의 목적지를 캐릭터 앞의 몇 미터 지점으로 설정합니다.
// 원하는 방향으로 이동합니다.
ai.destination = transform.position + (dx * right + dz * forward) * lookaheadDistance;
}
}
동영상에서는 현재 경로가 주황색으로 표시됩니다. 장애물에 부딪히려고 할 때에도 에이전트가 자동으로 이를 피하는 방법을 확인할 수 있습니다. 이것은 이러한 매우 짧은 경로에서도 경로 탐색을 사용하는 중요한 장점입니다.
"slowdown time" 또는 "slowdown distance" (이동 스크립트에 따라 다름)를 설정할 때 주의하십시오. 이 방법을 사용할 때, 설정이 너무 낮으면 목적지가 항상 에이전트와 매우 가까워서 에이전트가 매우 느리게 이동할 수 있습니다.
참고 이 방법은 매 프레임마다 경로를 자동으로 수정하여 매우 반응성이 뛰어난 FollowerEntity 이동 스크립트와 함께 사용할 때 가장 효과적입니다. |
게임에 다른 NPC가 있는 경우, NPC가 플레이어 캐릭터를 피하게 하기 위해 로컬 회피를 사용할 수 있습니다. 일반적으로 플레이어가 NPC를 피하게 하고 싶지는 않을 것입니다.
이는 RVOController 컴포넌트 또는 FollowerEntity 이동 스크립트를 사용하는 경우 FollowerEntity 컴포넌트의 로컬 회피 설정을 변경하여 할 수 있습니다.
특히 플레이어 캐릭터에서는 우선순위를 최대값으로 설정하고, "Collides With" 마스크를 "Nothing"으로 설정해야 합니다. 이렇게 하면 플레이어는 다른 모든 에이전트를 무시하지만, 다른 에이전트는 여전히 플레이어를 피하고, 다른 에이전트보다 플레이어를 피하는 것을 우선시하게 됩니다.
Keyboard movement without pathfinding
내장된 이동 스크립트를 사용하지 않고 플레이어 캐릭터에 대한 자체 이동 코드를 사용하는 것도 가능합니다.
이 경우 게임의 다른 에이전트가 플레이어 캐릭터를 피하도록 로컬 회피를 통합하고 싶을 수도 있습니다.
이를 위해 플레이어 캐릭터에 RVOController 컴포넌트를 추가할 수 있습니다. 그런 다음 이동 코드에서 RVOController's velocity 를 캐릭터의 원하는 속도로 수동으로 설정할 수 있습니다. 속도를 수동으로 설정하면 로컬 회피 시스템이 이 에이전트를 수동으로 제어되는 것으로 표시하고, 다른 에이전트는 이를 처리해야 합니다.
참고 매 프레임마다 속도를 설정해야 하며, 그렇지 않으면 로컬 회피 시스템이 에이전트가 더 이상 수동으로 제어되지 않는다고 생각할 것입니다. |
void Update () {
var x = Input.GetAxis("Horizontal");
var y = Input.GetAxis("Vertical");
var v = new Vector3(x, 0, y) * speed;
// RVOController의 속도를 재정의합니다. 이렇게 하면 한 시뮬레이션 단계 동안 로컬 회피 계산이 비활성화됩니다.
rvo.velocity = v;
transform.position += v * Time.deltaTime;
}
에이전트를 네비메쉬에 고정하고 싶다면, NavmeshClamp 컴포넌트를 사용할 수 있습니다.
Point and click movement
포인트 앤 클릭 이동은 게임에서 캐릭터를 이동시키는 일반적인 방법입니다. 전략 게임, RPG, 그리고 플레이어가 캐릭터의 움직임을 직접 제어하지 않는 다른 게임에서 자주 사용됩니다.
이것은 A* Pathfinding Project의 내장 이동 스크립트를 사용하는 데 완벽한 사용 사례이며, 구현하기 매우 간단합니다.
플레이어를 특정 지점으로 이동시키고 싶을 때마다 이동 스크립트의 destination 속성을 해당 지점으로 설정할 수 있습니다.
void PointAndClick (IAstarAI ai) {
// 마우스 버튼이 눌렸는지 확인합니다.
if (Input.GetMouseButton(0)) {
var cam = Camera.main;
// 레이캐스트가 모든 콜라이더에 맞도록 합니다.
LayerMask mask = -1;
// 커서에서 레이를 쏴서, 월드에서 어디에 맞는지 확인합니다.
if (Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out var hit, Mathf.Infinity, mask)) {
// 레이가 맞은 지점을 AI의 목적지로 설정합니다.
ai.destination = hit.point;
}
}
}
참조 TargetMover 컴포넌트는 예제 장면에서 이와 같은 이동을 제공하기 위해 사용됩니다. |
로컬 회피는 Keyboard movement with pathfinding 과 동일한 방식으로 처리할 수 있습니다.
'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글
Graph Generation (0) | 2024.05.26 |
---|---|
Pathfinding from editor scripts (0) | 2024.05.26 |
Circling a target (0) | 2024.05.26 |
Utilities for turn-based games (0) | 2024.05.25 |
Pathfinding in 2D > Pathfinding on tilemaps (0) | 2024.05.25 |