Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공부용 이모저모

UE4 - 점프기능 구현 본문

UE4 - C++

UE4 - 점프기능 구현

불타는버스 2021. 8. 31. 17:48

이득우의 언리얼 C++ 게임 개발의 정석 책보고 따라하기 

 

 

프로젝트 세팅 - 입력에 보면 점프가 스페이스바로 연결되어 있다.

점프는 Character에서 기본으로 세팅되어있다.

GetCharacterMovement()->JumpZVelocity : 캐릭터의 점프 강도. 기본값은 420이다.

 

AABCharacter::AABCharacter()
{
	....
	GetCharacterMovement()->JumpZVelocity = 800.0f;	//800으로 임의 상승
}

void AABCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed, this, &ACharacter::Jump);
    //점프액션을 취한다.
}

점프를 하지만 모션은 안바뀐다.

이제 점프중인지에 대한 스테이터스 확인을 해야하는데,일단 언리얼 폰의 무브먼트가 제공하는 상태는 다음과 같다.

 

IsFalling(): 현재 떨어지고 있는가?(바닥에 닿지않았는가?)

IsSwimming():현재 수영중인가?

IsCrouching():현재 앉아있는가?

IsMoveOnGround():땅 위에서 이동중인가?

 

여기서 점프중인가에 쓰일것은 IsFalling이다.

AnimInstance의 헤더에 해당 변수를 추가해준다.

 

ABAnimInstance.h에 추가

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
bool IsInAir;

 

EditAnywhere = 블루프린트 단계에서 수정이 가능해진다.

BlueprintReadOnly = 블루프린트에 해당 변수 표시

Category = 블루프린트에 리스트될 카테고리(Pawn 메뉴에 리스트업된다)

 

ABAnimInstance.cpp에 추가

 

UABAnimInstance::UABAnimInstance()//생성자
{
	...
    IsInAir = false;
}

//애니메이션 데이터 받아오기
void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
	...
	if(::IsValid(Pawn))
    {
    	...
        auto Character = Cast<ACharacter>(Pawn);
        if(Character)
        {
        	//캐릭터의 떨어짐 여부를 저장한다.
        	IsInAir = Character->GetMovementComponent()->IsFalling();
        }
    }
}

새로 추가한 IsInAir은 떨어지는 여부를 체크하며,애님 블루프린트에 표기된다.

 

컴파일 할때 반드시 메뉴창에서 컴파일을 해주어야한다.비쥬얼 스튜디오 컴파일과는 또 다르다.
애님블루프린트를 켜보면 IsInAir이 생긴걸 확인 할 수 있다.
만약 애님그래프등이 안보인다면 여기서 더블클릭.
스테이트로 Jump를 추가한다
테두리를 드래그하면 상호 연결이 가능하다.
버튼을 누르면 조건문 설정이 가능

이런 스테이트에서 스테이트로의 이동조건을 트랜지션이라 부른다.

우선 Jump->Ground.IsInAir을 드래그해서 넣는다.
드래그 후 NotBoolean 조건문으로 세팅해서 넣는다.
Ground->Jump 의 경우
점프시에는 아직 애니메이션을 안넣었으니 기본 자세가 된다.

애니메이션 리타겟

작 중 책에서 쓰이는 예시의 경우, 점프 애니메이션이 없다. 하지만 기본 언리얼 마네킹에는 점프가 있다.

그래서 언리얼 마네킹의 점프를 다른 메시에 적용시키는 방법을 설명 해주고 있다.

 

마네킹의 위치는 여기
리타겟 매니저를 누르고 인간형 릭을 선택해서 저장한다.

사용하고 있는 매쉬도 리타겟 매니저로 재저장하면 서로 공유가 가능해진다.

만약 매핑이 안될경우 자동매핑 사용.
마네킹의 애니메이션 위치
JumpStart,Loop,End를 고르고 리타깃한다.

리타깃은 임의로 해주는 것이기 때문에 애니메이션이 이상하게 나올 가능성도 있다.

 

기존 점프 방식을 제거하고, JumpStart, JumpLoop, JumpEnd로 세분화한다.이경우는 단일방향으로 작업한다.
Ground->JumpStart
JumpLoop -> Ground는 기존과 똑같이 처리

JumpLoop->JumpEnd가 아님에 유의!

JumpStart-> JumpLoop / JumpEnd -> Ground는 애니메이션과 연관되있으므로

먼저 애니메이션 연결부터 한다.

각 스테이트로 들어가 해당하는 애니메이션을 연결시킨다.
Jump_Start와 End는 디테일에서 Loop Animation 체크를 풀어준다.
JumpStart->JumpLoop로 들어가서, 해당 애니메이션을 검색해보면 애니메이션 정보값을 받아 올 수 있다.

Jump_Start에서 Jump_Loop로 넘어가는 트랜지션에서는,

Jump_Start에서 사용하고있던 애니메이션의 정보값을 받아오는게 가능하다.

즉 바뀌기 직전의 애니메이션 마지막 상태값을 얻어오는것이 가능하다.

 

Time_Remaining - 애니메이션의 남아있는 시간을 가져온다

Length - 애니메이션의 길이를 가져온다

Current Time - 애니메이션이 얼마나 재생되었는가를 가져온다.

 

ratio는 비율이며, 1이 100%이다.  예를들어,

Time Remaining(ratio)의 반환값이 0.13이라면 애니메이션 끝가지 13%가 남아있다는 의미이다.

 

조건문, 결과값과 다른 무언가를 비교해서 값을 반환한다(if문)
JumpStart->JumpLoop = 남은 시간이 10%이하일경우 트랜지션
JumpEnd->Ground(착지 모션 후 땅)도 똑같이 처리한다.
애님 프리뷰 에디터에서 미리 시뮬레이션이 가능하다.값은 저장되지 않는다.
Automatic Rule Based on Sequence Player in State 옵션 체크시 애니메이션이 끝나면 자동으로 넘어간다.