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(); 

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

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




 

 

+ Recent posts