이 페이지는 에이전트를 목표 주변에서 원을 그리며 이동시키는 방법을 설명합니다.
목표 지점으로 이동하는 것만으로는 충분하지 않을 때가 있습니다. 에이전트가 오프셋을 두고 목표를 따라가거나, 주어진 목표를 중심으로 원을 그리며 이동하거나, 단순히 한 지점으로 이동하는 것이 아닌 다른 행동을 할 필요가 있을 수 있습니다. 이는 매 프레임마다(또는 필요한 만큼 자주) 이동 스크립트의 destination 필드를 업데이트함으로써 달성할 수 있습니다.
예를 들어, 에이전트를 목표 주변에서 원을 그리며 이동시키려면, 에이전트가 원의 경계를 따라 움직일 수 있도록 목적지를 에이전트 바로 앞의 지점으로 설정해야 합니다.
이를 계산하기 위해 목표에서 에이전트로 향하는 벡터를 가져와서 정규화합니다. 이를 normal이라고 합니다. 그런 다음, 이 normal을 90도 회전시킵니다. 이를 tangent라고 합니다. 그러면 에이전트의 목적지는 다음과 같이 설정됩니다.
ai.destination = target.position + normal * r + tangent * k
목적지를 에이전트로부터 약간 떨어진 곳에 배치하고 싶습니다. 그렇지 않으면 에이전트가 목적지에 거의 도달했다고 생각하여 속도가 느려질 수 있습니다.
이 계산을 매 프레임마다 수행하고 목적지를 에이전트에 할당하면, 에이전트는 위의 비디오처럼 목표 주변을 원을 그리며 이동할 것입니다.
코드로는 다음과 같이 보일 것입니다:
public class MoveInCircle : VersionedMonoBehaviour {
public Transform target;
public float radius = 5;
public float offset = 2;
IAstarAI ai;
void OnEnable () {
ai = GetComponent<IAstarAI>();
}
void Update () {
var normal = (ai.position - target.position).normalized;
var tangent = Vector3.Cross(normal, target.up);
ai.destination = target.position + normal * radius + tangent * offset;
}
public override void DrawGizmos () {
if (target) Draw.Circle(target.position, target.up, radius, Color.white);
}
}
참조 이는 패키지에 포함된 MoveInCircle 컴포넌트에 구현되어 있습니다. |
같은 종류의 설정을 사용하여 에이전트가 오프셋을 두고 목표를 따라가게 만들 수 있습니다: 매 프레임마다 에이전트의 목적지를 목표의 위치에 오프셋을 더한 위치로 업데이트하십시오.
참고 이 솔루션은 FollowerEntity 이동 스크립트와 함께 사용할 때 가장 부드럽게 작동합니다. FollowerEntity는 목적지를 설정할 때마다 경로를 수정하여 항상 최신 상태로 유지합니다. 다른 이동 스크립트에서도 작동하지만, 더 부드럽게 만들기 위해 경로 재계산 간의 시간을 줄여야 할 수도 있습니다. |
참조 AIDestinationSetter Patrol |
'유니티 에셋 > A* Pathfinding project pro' 카테고리의 다른 글
Pathfinding from editor scripts (0) | 2024.05.26 |
---|---|
Manual Player Movement (0) | 2024.05.26 |
Utilities for turn-based games (0) | 2024.05.25 |
Pathfinding in 2D > Pathfinding on tilemaps (0) | 2024.05.25 |
Pathfinding in 2D (0) | 2024.05.25 |