6.2 스테이트 머신 제작
애닝 그래프의 스테이트 머신
복잡 한 애니메이션을 스테이트 단위로 나누어서 설계 및 관리
스테이트 : 각 애니메이션의 동작
스테이트 머신 구축 예제
애니메이션 블루 프린터 ▷ 애닝 그래프 ▷ 스테이트 머신 새로 추가 ▷ BaseAction 이름 변경
스테이트 머신 ▷ 스테이트 추가 ▷Ground 스테이트 추가
스테이트 머신 설계 시 다른 스테이트로 이동 할려면 조건 필요
조건은 트랜지션 이라 하며 단방향 화살표로 표현
Entry 노드에서 Ground 스테이트 연결 되면 시작 스테이트라 정의
Ground 스테이트에는 앞에서 사용 했던 bool로 포즈를 블렌딩을 사용 해
속도에 따라서 idel, ran 애니메이션 실행
점프 기능 구현
캐릭터 무브 먼트 컴포넌트에는 점프 기능 사용
1. AChatacter의 Jump() 바인딩 후
2. GetchatacterMovement()로 jumpZvelocity 값 설정( 점프 속도 값 조정)
AABCharacter::AABCharacter()
{
GetCharacterMovement()->JumpZVelocity = 800.0f;
}
void AABCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed,this, &AABCharacter::Jump);
}
점프 애니메이션 추가
점프 모션을 재생 할 수 있게 애니메이션 블루 프린터에 추가
점프한 캐릭터가 언제 땅에 떨어질지 모르기 때문에 점프 모션의 재생 부분에 신경
애니메이션 블루프린트에서 점프중, 착지 등에 정보 파악
폰의 무브먼트 컴포넌트
IsFalling(), IsSwimming, IsCrouching(), IsmoveOnGround() 제공
FloatingPawnMovement 에서는 해당 함수들이 모두 false 값을 반환
실제 동작은 캐릭터 무브먼트 컴포넌트에서만 실행
ISFalling 사용해 폰이 현재 점프 중인지 아닌지 판단
판단 값을 ISInAir 에 갱신 후 스테이트 머신에서 사용
class ARENABATTLE_API UABAnimInstance : public UAnimInstance
{
GENERATED_BODY()
//...
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
bool IsInAir;
}
UABAnimInstance::UABAnimInstance()
{
CurrentPawnSpeed = 0.0f;
IsInAir = false;
}
//애닝 인스턴스에서 상속 받은 NativeUpdateAnimation 사용, Tick 보다 뒤에 실행
void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
//현재 Pawn에 접근, 컨트롤러가 조종하는 Pawn 리턴
auto Pawn = TryGetPawnOwner();
if (::IsValid(Pawn))
{
//속도 값을 가지고 온다
CurrentPawnSpeed = Pawn->GetVelocity().Size();
auto Character = Cast<ACharacter>(Pawn);
if (Character)
{
//character의 movementcomponent 의 Isfalling() 호출
IsInAir = Character->GetMovementComponent()->IsFalling();
}
}
}
IsInAir 변수 연동
BaseAction 에서 Jump 스테이트 상태 생성
Ground ▷ Jump 트랜지션 생성 ▷ 조건 IsinAir 와 결과 블록에 연결
Jump ▷ Ground 트랜지션 생성 ▷ 조건 IsinAir을 NOT 블록 연결 후 결과 연결
애니메이션 리타겟
현재 점프 애니메이션이 없을 경우
인간형 캐릭터의 경우 스켈레톤의 구성이 달라도 애니메이션 교환 할 수 있는 기능
리타켓 설정 순서
마네킹 캐릭터의 스켈레톤 에셋
스켈레톤 툴 바에서 리타켓 매니저 클릭
릭 선택 메뉴에서 인간형 릭 선택
(캐릭터의 뼈대를 이루는 본의 이름을 분석해 리타켓 설정 값 매핑)
박스 캐릭터의 스켈레톤 에셋
스켈레톤 툴 바에서 리타켓 매니저 클릭
릭 선택 메뉴에서 인간형 릭 선택
리타켓 할 애니메이션 복제
Jump_end, Jump_loop, Jump_Start 애니메이션을 클릭 후
애님 애셋 리타겟 ▷애님 애셋 복제 후 리타겟
리타겟 다이얼 로그 활성화
왼쪽 목록에 있는 스켈레톤 애셋 선택
폴더 위치 지정 후 리타겟
점프의 구현
점프 동작 도약, 체공, 착지로 나누고 애니메이션의 재생 시간 조정
JumpStart, JumpLoop, JumpEnd 스테이트 추가
각 상태 마다 애니메이션 연결 JumpStart, JumpEnd 은 LoopAnimation 옵션 false
각 스테이트 트랜지션 조건
Ground ▷JumpStart : IsinAir == true
JumpLoop ▷ JumpEnd : IsinAir == false
JumpStart ▷ JumpLoop : Time Remaining 노드 사용해
0.1 값이면 재생 시간 10% 남을 경우 다음 스테이트로 이동 ( 즉 90% 애니메이션 실행)
JumpLoop ▷ JumpEnd : Time Remaining 노드 사용해
0.1 값이면 재생 시간 10% 남을 경우 다음 스테이트로 이동 ( 즉 90% 애니메이션 실행)
Automatic Rule Based on Sequence in State 옵션
트렌지션 옵션에 애니메이션 종료 시 자동으로 다음 스테이트 넘어가는 옵션 제공