midas+son의 크리에이티브(creative) 이야기

Pawn을 움직이는 방법은 여러가지가 있다.

대표적으로 Actor를 강제로 움직이거나,

MovementComponent(CharacterMovementComponent)를 이용하는 방법.

전자는 물리 적용이 되지 않고 좌표에 맞게 움직이는 것이다.

SetActorRelativeLocation(FVector)를 보통 사용한다.(World도 있다.)


하지만 기본적으로 물리가 적용안되니 떨어지거나 언덕을 오르는데 무리가 있다.

후자인 MovementComponent를 사용하는 것은

간편하지만 고려되어야 할게 좀 있다.

이 글은 어떠한 점을 고려해야 하는지에 대한 글이다.


1.

튜토리얼이나 docs를 보면 간단하게 MovementComponent를 가지는 Pawn에서

AddMovementInput(Direction, Val)함수를 호출하면 알아서 이동하는 것을 볼 수 있다.

튜토리얼들은 기본적으로 PlayerController가 그 Pawn에 들어가 있기에 가능한 것이다.


문제는 캐릭터 시점에서 컨트롤 하지 않거나 여러 캐릭을 컨트롤해야 할 경우

즉, 해당 Pawn에 Possess하지 않거나 DefaultPawn으로 설정 하지 않을 경우 AddMovementInput가 동작 안한다.


이럴 경우에는 설정을 하나 더 해주어야 한다.

블루프린트에서는 위와 같은 디테일 창에서 찾으면 된다.

Auto Possess AI가 기본적으로는 Palced in World로 되어있다.

이 옵션을 SpawnedPlaced in World or Spawned로 바꾸어 주자.

그러면 이제서야 AddMovementInput이 동작하는 것을 볼 수 있다.


2.

AddMovementInput 함수의 인자값에 대한 얘기를 해보자.

(FVector WorldDirection, float ScaleValue, bool bForce /*=false*/)

이렇게 3가지 인자가 들어간다.

1번째는 방향 벡터, 

2번째는 스케일값, 

3번째는 false 일 경우 !IsMoveInputIgnored()를 같이 체크하고, true일경우 ControlInputVector에 바로 움직일 값이 들어간다.


문제는 1, 2번째 인자 값이다.

1번째는 방향 Direction인데 어떠한 큰 값을 적용해도

나중에는 크기 1의 단위 벡터로 되어버린다.

2번째 인자값 스케일도 -1.0f~1.0f 값 사이만 적용이 되어야 한다.

아무리 크게 주어도 더 빨리 움직이지 않는다.

여기서 중요한 규칙이 있다.

단위 벡터화 되는 것이 1번째와 2번째 인자를 곱하고 나서 나중이기 때문에

1번째가 단위 벡터가 아니고 2번째가 -1.0f~1.0f이 아니라면

나중에 계산될 단위 벡터가 스케일을 제대로 따라 가지 않게 된다.

이는 중요하게 입력값 제한을 두어야 한다.

설정에 따른 속도 변화와 부드러운 움직임을 원한다면

1번째는 단위벡터, 2번째는 -1.0f~1.0f를 넣자.(큰값을 넣어봤자 의미도 없고 나중 계산이 달라지므로...)

따라야 한다.


3.

2번 문제처럼 값을 받는다면 도대체 어디에서 속도를 제어 할 수 있는가?

그 값은 CharacterMovementComponent에 있다.

컴포넌트 내부에 MaxWalkSpeed, MaxAcceleration 등등의 float값이 있고

아래처럼 초기값이 들어간다.

...

MaxFlySpeed = 600.0f;

MaxWalkSpeed = 600.0f;

MaxSwimSpeed = 300.0f;

MaxCustomMovementSpeed = MaxWalkSpeed;

...

MaxAcceleration = 2048.0f;

BrakingFrictionFactor = 2.0f; // Historical value, 1 would be more appropriate.

BrakingDecelerationWalking = MaxAcceleration;

...

위의 float값들을 직접 변경하면 속도를 컨트롤 할 수 있다.

Character의 움직임 속도는 가속도를 따른다.

Max Speed를 넘기지 않는 선에서 가속도에 따라 속도가 차츰 올라간다.

적절히 변경해 원하는 속도대로 가게 만들자.


이상... 

여러 캐릭터를 움직이게 프로그래밍하면서 알게 된 내용을 정리해보았다.

나름 시간을 들여 알아보았는데 단순하다.

위와 같은 단순하고 필요한 내용들이 튜토리얼이나 docs에 없었다는게 아쉬울 따름이다.