티스토리 뷰
Gameplay Ability System - Top Down RPG / Section 9-8
Just Move 2026. 7. 11. 06:02Click To Move
입력과 이를 처리하는 콜백이 준비되었으므로, 이제 실제 기능을 구현할 수 있다.
추가적으로 캐릭터 기능을 구현할 수 있는데, 이 포르젝트는 탑다운(Top-Down) 프로젝트이므로 Click To Move 기능을 활용할 것이다.
이는 대부분의 탑다운 게임에서 사용하는 대표적인 이동 방식이다.
언리얼에서 제공하는 Top Down Template에는 기본적으로 Clik To Move가 상당히 잘 구현되어 있다.
짧게 클릭 - 클릭한 위치까지 자동으로 이동
길게 클릭 - 마우스를 따라 계속 이동
하지만 멀티플레이에서는 문제가 발생한다.
Client 플레이 모드
짧게 클릭 -> 잠깐 움직이다가 바로 멈춤 (자동 이동 x)
길게 클릭 -> 정상 작동
Listen Server 플레이 모드
호스트(서버)
짧게 클릭 -> 정상 작동
길게 클릭 -> 정상 작동
클라이언트
짧게 클릭 -> 동작하지 않음
길게 클릭 -> 정상 작동
문제가 생기는 이유는 TopDownPlayerController 코드를 보면 이유를 알 수 있다.
이동 처리는 TopDownPlayerController 안에서 이루어지며, Ehanced Input으로 입력 액션이 바인딩되어 있다.
SetDestinataionClickAction -> ETriggerEvent::Started, Triggered, Completed, Canceled
문제는 Completed 이벤트의 Simple Move To Location 함수에서 발생한다.
이는 AI Blueprint Helper Library에 있는 함수로, 원래 목적은 AI 캐릭터를 이동시키는 것이다.
AI 캐릭터는 서버에서 제어되기에 서버에서 호출하면 문제가 없다.
하지만 클라이언트가 제어하는 플레이어 캐릭터는 해당 함수만으로 멀티플레이 이동이 복제되지 않는다.
반대로 Triggered 이벤트에서 이동 처리를 위한 AddMovementInput 함수는 Pawn의 Movement Component를 이용한다.
Movement Component는 이미 멀티플레이 리플리케이션이 내장되어 있기 때문에 클라이언트에서 AddMovementInput를 호출하면 서버도 그 이동을 인식하며 다른 클라이언트에게도 복제된다.
이러한 문제로 클라이언트 모드에서 길게 클릭을 통한 이동은 정상적으로 작동하지만, 짧게 클릭을 통한 이동은 동작하지 않는다.
비록 멀티플레이에서 Simpe Move To Location 함수의 문제가 있지만, Path Finding이라는 강력한 장점이 있다.
Path Finding은 Navigation Mesh를 활용하는 기능으로, 단추키 P를 누르면 NavMesh를 확인할 수 있다.
즉, Simple Move To Location은 NavMesh 기반 길찾기를 수행한다.
이러한 방식은 예시로 기둥 뒤를 클릭하면 직선으로 이동하지 않고, 자동으로 기둥을 돌아가는 경로를 계산해준다.
하지만 멀티플레이에서 클라이언트가 동작하지 않기에, 이러한 기능들을 그대로 사용하지 못하고 조금 더 발전한 방식으로 구현해야 한다.
따라서 우리가 목표로 하는 것은 짧게 클릭하면 자동 이동, Path Finding 사용, 멀티 플레이 지원 이 세 가지를 모두 만족시키는 것이다.
단순하게 생각했을 때, 캐릭터 위치와 마우스 위치만 있다면 방향은 MousePosition과 CHaracterPosition을 통해 계산할 수 있다.
해당 방향으로 매 프레임 AddMoveMentInput을 호출하면 멀티플레이에서도 정상적으로 동작한다.
하지만 캐릭터와 목적지 사이에 장애물이 있으면, 벽에 부딪히고 또 벽을 향해 계속 움직이게 되는 문제가 발생한다.
다행히 언리얼에서는 경로(Path)를 생성하는 함수가 존재하여 경로의 여러 지점을 얻는 것은 어렵지 않다.
하지만 이러한 경로는 여러 개의 Point로 이루어지기 떄문에 Point 도착후 다른 Point로 이동 시에 방향이 순간적으로 바뀌는 문제가 있다.
현재 위치 (Point 1까지 직선 이동)
↓
Point1 (Point 1 도착 후 Point2 방향으로 회전)
↓
Point2 (point 2 도착 후 목적지 방향으로 회전)
↓
목적지
이러한 이동 방식은 캐릭터가 툭툭 꺾이는 느낌이 발생하여 매우 부자연스럽다는 문제가 발생한다.
여기서 사용되는 해결 방법이 Spline이다.
생성된 Path Point들을 Spline을 통해 각 점들을 부드러운 곡선으로 연결한다.
이러면 직선 구간이 아니라, 매끄러운 곡선을 따라 이동하게 된다.
또한 Spline은 어느 위치에서든 접선 방향을 구할 수 있기에 현재 위치에서 항상 자연스러운 이동 방향을 얻을 수 있다.
1. 매 프레임 현재 위치의 Tangent 방향을 얻음 -> 그 방향으로 AddMovementInput 호출
2. Movement Component 이동 처리 (멀티 플레이 정상 지원)
-> Path Finding 그대로 활용하며, 회전도 정상적으로 작동
따라서 다음 강의에서는 위에서 설계한 방식대로 Navigation Path를 생성하고, Path Poiunt를 추출하여 Spline을 생성해 멀티 플레이를 지원하는 Click To Move를 구현해볼 것이다.
'Study > [Unreal] Udemy 강의' 카테고리의 다른 글
| Gameplay Ability System - Top Down RPG / Section 9-10 (0) | 2026.07.13 |
|---|---|
| Gameplay Ability System - Top Down RPG / Section 9-9 (0) | 2026.07.12 |
| Gameplay Ability System - Top Down RPG / Section 9-7 (0) | 2026.07.09 |
| Gameplay Ability System - Top Down RPG / Section 9-6 (0) | 2026.07.09 |
| Gameplay Ability System - Top Down RPG / Section 9-5 (0) | 2026.07.08 |
