모든 스켈레톤이 되는지는 모르겟지만, 만들면서 사용 중인 MCO_Mocap_Basics 으로 적용함

기존 캐릭터는 A_Pose 통칭 A 로, T_Pose 통칭 T 애니메이션

리타깃 하면 스켈레톤이 안맞는 현상이 발생한다.

 

리타깃 화면

 

리타깃 화면에도 T 와 A가 다른 것이 보인다.

이것으로 리타깃을 하고 애니메이션을 하게 되면,

기괴한 애니메이션을 보게 된다.

리타깃 결과

 

그러다 리소스를 살펴보니 컨버팅 하는 방법이 적혀있었다



 

“A” POSE OR “T” POSE CONVERSION - UNREAL ENGINE RETARGET MANAGER

“A” POSE OR “T” POSE  -  THE UE4 RETARGET MANAGER Most of our current packs come with a default “T” pose for the humanoid “Retarget Manager”. This is different from the new “A” pose from Epic. Since many users asked if we could provide a “T” that they were

mocaponline.com

 


 

들어가서 적용되게할 포즈를 다운 받는다,

T -> A로 A포즈 다운
A -> T로 T포즈 다운

일단 A포즈로 바꾸기 위해서 A 포즈 다운로드 함

 

임포트화면 꼭 체크해주자



위를 꼭 설정해주어야 한다

 

프리뷰 메시

 

사용할 애니메이션에  있는 프리뷰메시를 바꾸면

 위처럼 바뀌어 진다. 

그리고 리타깃 화면을 다시 보면

 

달라진 리타켓 화면

 

리타켓 화면이 달라진 걸 볼 수 있다.

마지막으로 결과를 보면

 

 

올바르게 애니메이션이 적용된 걸 확인 할 수 있다.

이것으로 애니메이션 리소스를 많이 구할 수 있게 됨!

 

※ 다른 리소스에는  적용 안되는 거 같음

 

'Unreal > Game 2 ' 카테고리의 다른 글

7. 탄 생성, 발사, 재장전  (0) 2019.06.20
6. 무기 생성 및 소켓 장착  (0) 2019.06.19
5. 점프 애니메이션  (0) 2019.06.18
4.1 기존 바인딩 함수 이동  (0) 2019.06.18
4. 캐릭터 애니메이션  (0) 2019.06.17


캡슐컴포넌트->IsFalling()

변수 추가 bool  bisAir

애니메이션 TimeRemain


캐릭터 속도변수 추가 BaseSpeed

 



PlayerInputComponent->BindAction(TEXT("OnCrouch"), EInputEvent::IE_Pressed, this, &AKCharacter::OnKCrouch);
PlayerInputComponent->BindAction(TEXT("UnCrouch"), EInputEvent::IE_Released, this, &AKCharacter::UnKCrouch);


 위 영상에서

키를 한번 누르면 앉은 자세가 되고 유지 되는 것에서 

키를 누르고 있어야 앉은 자세가 되는 걸로 바꾸었다

 

 

 

 


컨트롤러에 정의하는게 아닌거 같아서 캐릭터로 이동함

네트워크 작업떄 방법이 틀렷으면 다시 복구

코드관리가 쉬워짐, 네트워크 작업 할떄 좋을 지 모르겟음

 

 

 

 

1. 리타킷 ㅇㅋ

2. 애님인스턴스ㅇㅋ

3. 애님블루프린트 ㅇㅋ

4. 애님블루프린트 연동ㅇㅋ

5. 앉은 애니메이션 ㅇㅋ



□  최대한 한클래스어 넣어두지 않고, 분산하기 위해서 노력함

□ 현재 클래스 : AnimInstace, Character, Controller, GameMode

□  바인딩 함수 위치, 캐릭터 상태, 블루프린트 애니메이션 컨트롤, 핸들링 때문에 시간이 걸림

Character : 스트링 암, 메시
Controller : input bindAxis 되어 있음
AnimInstace: c++와 연동을 해서 bp 연동해서 앉은 애니메이션 처리, Character 방향과 속도를 받고
GameMode : 건들거 없는 거 같음

 

□ 중요과제는 Crouch관련 함수를 bindAction을 하고, bCrouch를 이용하여 앉은 애니메이션을 처리 하는 것.


 Character에서 액션키 바인딩과  bool IsCrouch를 사용했으면 쉬울거 같은데,  한 곳에 코드가 몰릴 거 같아서 안함

 액션키 바인딩은 한 클래스와 관련된 클래스만 일단 이 클래스에서 Controller에서만 바인딩함

 bCrouch 애님블루프린트에 노출이 될라면, AnimInstace에 있어야 하거나 핸들링이 필요한거 같음

 AnimInstace: c++와 연동을 해서 bp 연동해서 앉은 애니메이션 처리, Character 방향과 속도를 받고

 

□ 일단 핸들링이 필요한거 같음.

 상태관련 isCrouch를 isDead 캐릭터에서 정의해서 관리를 할까 했지만, 이러면 AnimInstace와 2번 관리를 해야 하고, Controller에서 사용도 어려워져서 안함 -> 실패

 AnimInstace에 포인터변수로 Character를 저장해서 사용할려고 했으나 헤더에서 구현클래스(KClass)는 사용이 안됨.
헤더에 kClass 추가하면 연결될 거 같으나, 헤더가 꼬일까봐 안함 -> 실패

 bindAction을 Delegate로 사용해봤지만, 뻥남 -> 실패

 앉기 애니메이션을 하다가 ACharacter::Crouch 관련 함수들이 있었으나 -> 실패

 블루프린트에서  isCrouch 가져오기 위해서 여러가지 해봣지만, 캐스팅을 해야 하는데,
   이 과정에서 Character 및 Controller 를 얻어 오는 게 번거로웠음 -> 실패




 bindAction과 앉기 함수

Character 만들어서 핸들링 했으나 안됨
AnimInstace에서 만들어서 핸들링 했으나 안됨
기존부터 바인딩 해왔던 Controller  에서만 되는 거 같음
그래서 AnimInstace에서 변수를 만들고, Controller에서 바인딩함


□ isCrouch 및 SetCrouch (2중 핸들링?)

AnimInstace에서 Character 캐스팅을 해서 받음 속도와 방향벡터를 얻음.
AnimInstace에서 상태관리를 하기로 함
Controller에서 AnimInstace함수를 가지고 와서 바인딩




void UKAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeUpdateAnimation(DeltaSeconds);

	mycharacter = Cast<ACharacter>(TryGetPawnOwner());
	if (!::IsValid(mycharacter)) return;
	
	if (!m_bIsDead)
	{
		m_fSpeed = mycharacter->GetVelocity().Size();
		m_fDir = CalculateDirection(mycharacter->GetVelocity(), mycharacter->GetActorRotation());
	}
}


void UKAnimInstance::SetCrouch()
{
	if (m_bIsCrouch == false)
		m_bIsCrouch = true;
	else
	{
		m_bIsCrouch = false;
	}
}

 

void AKPlayerController::SetupInputComponent()
{
	Super::SetupInputComponent();

	InputComponent->BindAxis(TEXT("MoveFB"), this, &AKPlayerController::MoveFB);
	InputComponent->BindAxis(TEXT("MoveRL"), this, &AKPlayerController::MoveRL);
	InputComponent->BindAxis(TEXT("Turn"), this, &AKPlayerController::Turn);

	InputComponent->BindAction(TEXT("Crouch"), EInputEvent::IE_Pressed, this, &AKPlayerController::ToggleCrouch);
}


void AKPlayerController::ToggleCrouch()
{
	auto pawn = Cast<AKCharacter>(GetPawn());
	if (!IsValid(pawn)) return;

	auto  anim = Cast<UKAnimInstance>(pawn->GetMesh()->GetAnimInstance());
	anim->SetCrouch();
}

 

 

m_fSpeed = mycharacter->GetVelocity().Size(); 

위 변수를 이용해서 이동 애니메이션 블렌딩 적용

애니메이션 리소스가 적어서 디테일한 모션 생략하게됨 




 

 

방법1 - 플레이어 캐릭터에서 설정

 

기존에 하던 폰에서 바인딩 방법

void AABCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis(TEXT("UpDown"), this, &AABCharacter::UpDown);
	PlayerInputComponent->BindAxis(TEXT("LeftRight"), this, &AABCharacter::LeftRight);
}



 

3.에디터 - 폰 입력 연동, 바인딩

void AABPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); PlayerInputComponent->BindAxis(TEXT("UpDown"),this,&AABPawn:..

kyoun.tistory.com

 



방법2 - 플레이어 컨트롤러에서 설정

 

컨트롤러가 캐릭터 및 폰에 빙의가 되기 때문에 컨트롤러에서 바인딩하고 폰에 적용
나중에 네트워크 처리 할떄도 컨트롤러에서 처리하는 게 좋다고함(?)

/** Allows the PlayerController to set up custom input bindings. */
void AKPlayerController::SetupInputComponent()
{
	Super::SetupInputComponent();

	InputComponent->BindAxis(TEXT("MoveFB"), this, &AKPlayerController::MoveFB);
	InputComponent->BindAxis(TEXT("MoveRL"), this, &AKPlayerController::MoveRL);
	InputComponent->BindAxis(TEXT("Turn"), this, &AKPlayerController::Turn);
}


void AKPlayerController::MoveFB(float NewAxisValue)
{
	APawn* const MyPawn = GetPawn();
	if (MyPawn && NewAxisValue != 0.0f)
	{
		FRotator rot =  GetControlRotation();
		FVector Dir = FRotationMatrix(rot).GetScaledAxis(EAxis::X);

		MyPawn->AddMovementInput(Dir, NewAxisValue);
	}
}

void AKPlayerController::MoveRL(float NewAxisValue)
{
	APawn* const MyPawn = GetPawn();
	if (MyPawn && NewAxisValue != 0.0f)
	{
		FRotator rot = GetControlRotation();
		FVector Dir = FRotationMatrix(rot).GetScaledAxis(EAxis::Y);
		MyPawn->AddMovementInput(Dir, NewAxisValue);
	}
}

void AKPlayerController::Turn(float NewAxisValue)
{
	APawn* const MyPawn = GetPawn();
	if (MyPawn && NewAxisValue != 0.0f)
	{
		FRotator rot = MyPawn->GetControlRotation();
		MyPawn->AddControllerYawInput(NewAxisValue);
	}
}


마지막으로 게임모드에서 디폴트 컨트롤러를 지정을 해주면 된다







이외에도 만드는 방법은 매우 많음!

'Unreal > Game 2 ' 카테고리의 다른 글

4.1 기존 바인딩 함수 이동  (0) 2019.06.18
4. 캐릭터 애니메이션  (0) 2019.06.17
2. 기본 게임모드 및 기본캐릭터 설정  (0) 2019.06.14
1. 게임준비 및 디버깅로그 세팅  (0) 2019.06.14
0. 게임 기획?  (0) 2019.06.14

+ Recent posts