CharacterMovementComponent는 매번 언급할 때 이름이 너무 길기 때문에 CMC로 칭한다. CMC를 사용하는 캐릭터는 자동으로 클라이언트-서버 네트워킹이 탑재된다. 난 서버딸린 게임을 만들 생각은 아직 없기 때문에 구체적인 리플리케이션 방식에 대해선 언리얼 Document 원문을 참고하자. 아무튼 서버 네트워킹이 자동으로 탑재되어있다니 매우 편리한 컴포넌트임에는 틀림없다.
What is CharacterMovement Component?
CMC는 Character 소유자와 관련된 움직임 로직을 다루는 컴포넌트이다. CMC는 걷기, 떨어지기, 수영, 날기, 커스텀 등 다양한 움직임 모드를 지원한다. 움직임은 주로 최근 속도와 가속도의 영향을 받는다. 가속도는 지금까지 누적된 input벡터를 기반으로 매 프레임마다 업데이트된다. (UPawnMovementComponent::GetPendingInputVector()를 통해 볼 수 있다.) 네트워킹은 서버-클라이언트 수정 및 예측을 포함하여 완벽하게 구현되어있다.
1. 계층구조
2. 모듈&헤더
Engine모듈에 속해있고, 헤더는 #include "GameFramework/CharacterMovementComponent.h"를 통해 가져올 수 있다.
3. 움직임에 관련된 함수들
3-1 MoveAlongFloor
Current Floor 와 ComputeGroundMovementDelta()함수를 사용하여 이동방향을 가져온뒤 바닥을 따라 이동합니다. 만약 두번째 walkable 표면에 hit되면 마찬가지로 동일한 접근 방식을 사용하여 이동합니다.
virtual void MoveAlongFloor
(
const FVector & InVelocity,
float DeltaSeconds,
FStepDownResult * OutStepDownResult
)
InVelocity : 움직임의 속도.
DeltaSeconds : 이동이 발생하는 시간.
OutStepDownResult : Null이 아닌 경우, Floor check를 수행하면 해당 결과를 반영하도록 이 변수가 업데이트된다.
3-2 MoveAutonomous
발생한 다양한 이벤트(점프 등)을 나타내는 compressed 플래그가 지정된 경우, 지정된 타임스탬프에서 이동을 처리합니다.
virtual void MoveAutonomous
(
float ClientTimeStamp,
float DeltaTime,
uint8 CompressedFlags,
const FVector & NewAccel
)
ClientTimeStamp : 클라이언트 타임스탬프
DeltaTime : 이동이 발생하는 시간.
CompressedFlags : 발생한 다양한 이벤트를 나타내는 압축플래그.
NewAccel : 새로운 가속벡터
3-3 MoveSmooth
현재 이동 모드를 기반으로 하는 간단한 이동 규칙을 기반으로 하여 지정된 이동 방향을 따라 이동합니다. (일반적으로 시뮬레이티드 프록시에서 사용됩니다.)
virtual void MoveSmooth
(
const FVector & InVelocity,
const float DeltaSeconds,
FStepDownResult * OutStepDownResult
)
InVelocity : 움직임의 속도.
DeltaSeconds : 이동이 발생하는 시간.
OutStepDownResult : Null이 아닌 경우, Floor check를 수행하면 해당 결과를 반영하도록 이 변수가 업데이트된다.
3-4 AddImpulse
Impulse(충격)들은 각각의 tick마다 누적되고 한꺼번에 적용되므로 이 함수에 대한 여러번의 호출이 누적됩니다. Impulse는 순간적인 힘으로, 보통 한번 적용됩니다. 만약 지속적으로 각각의 프레임마다 힘을 적용하려면 AddForce함수를 사용하세요. 이와 같이 캐릭터의 운동량(momentum)을 변경하여 이동 모드를 변경할 수 있습니다.
virtual void AddImpulse
(
FVector Impulse,
bool bVelocityChange
)
Impulse : 충격에 관한 정보를 담은 Vector, 적용할 충격.
bVelocityChange : 충격을 질량과 관련지을지 여부.
4. 그 외 함수들
하나하나 소개하기엔 너무 많기에 자세한 내용은 Document를 참고하자. 여기엔 내가 공부하며 실제 사용할 함수, 변수들을 추가해나갈 예정이다.
void AddForce(FVector Force) //캐릭터에 Force만큼 힘을 가한다.
void AddImpulse(FVector Impulse, bool bVelocityChange) //캐릭터에게 충격을 준다.
bool CheckFall(...) //폰이 떨어지는 중인지 판단.
void DisableMovement() //이동불가로 만든다.(움직임 모드를 MOVE_None으로 셋팅한다.)
bool DoJump(bool bReplayingMoves) //점프하는 함수.
ACharacter& GetCharacterOwner() //UpdatedComponent를 소유하고 있는 캐릭터를 가져온다.
FRotator GetDeltaRotation(float DeltaTime) //DeltaTime 시간간격 동안 캐릭터가 얼마나 회전할지 반환.
위의 링크를 참고하여 만들었으므로 자세한 내용은 위를 참고하자.
'UE4' 카테고리의 다른 글
[UE4] Projectile Movement Component (0) | 2023.02.14 |
---|---|
[UE4] 게임플레이 프레임워크 (0) | 2023.01.18 |
[UE4] 위젯 UI 제작하기 (0) | 2022.11.14 |
[UE4] UPROPERTY (0) | 2022.11.12 |
[UE4] Unrecognized type Error 해결법 (0) | 2022.11.12 |