언리얼4 C++ 총기 발사 구현

Intro

  • 언리얼4 C++ 총기 발사

총기 연사

딜레이를 위한 타이머 변수와 발사여부 확인용 bool변수 정의

FTimerHandle timer;

UPROPERTY()
bool isFiring;

발사를 위한 Fire함수들 생성

여기서

GetWorld()->GetTimerManager().SetTimer(timer, this, &AFPSPlayer::Fire, .1f, false);

이부분은 마우스를 꾹눌러 isFiring이 true일때 0.1초 대기후 OnFire함수를 재귀호출해 연사를 가능하도록 한다.

Fire(왼쪽 마우스버튼)에 바인드

PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AFPSPlayer::StartFire);
PlayerInputComponent->BindAction("Fire", IE_Released, this, &AFPSPlayer::StopFire);

이제 마우스 버튼을 누르면 StartFire함수 에서 isFiring을 true로 바꾼뒤 OnFire함수로 진입한다.

버튼을 다시 놓으면 StopFire함수에의해 IsFiring이 false가되어 발사를 멈추게된다.

총기 사운드 재생

변수 선언

UPROPERTY(BlueprintReadOnly, Category="Audio")
class UAudioComponent* AudioComponent;
	
UPROPERTY(BlueprintReadOnly, Category = "Audio")
class USoundCue* ShotCue;

UPROPERTY(BlueprintReadOnly, Category = "Audio")
class USoundCue* MetalCue;

초기화

총기 발사와 탄창 부족시 딸깍거리는 소리를 각 큐변수에 저장하고 오디오 컴포넌트를 추가한다.

총알이 없을때

AudioComponent->SetSound(MetalCue);
AudioComponent->Play();

총알이 있을때

AudioComponent->SetSound(ShotCue);
AudioComponent->Play();

Fire함수에서 각 상황마다 다른 사운드큐를 재생시키도록 한다.

애니메이션 재생

애니메이션 인스턴스 변수 선언

UPROPERTY()
class UFPSAnimInstance* FPSAnim;

PostInitializeComponents 함수 추가

virtual void PostInitializeComponents() override;

FPSAnim 초기화

void AFPSPlayer::PostInitializeComponents()
{
	Super::PostInitializeComponents();
	FPSAnim = Cast<UFPSAnimInstance>(GetMesh()->GetAnimInstance());
	
}

PostInitializeComponents는 액터가 월드에 등장하기전 최종 단계에서 호출되는 함수이므로 AnimInstance를 초기화하기에 적합하다.

AnimInstace로 가서 bool변수와 PlayFire함수를 선언

void PlayFire();

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Pawn, Meta = (AllowPrivateAccess = true))
bool IsFire;

PlayFire함수 정의

void UFPSAnimInstance::PlayFire()
{
	//Montage_Play(FireMontage, 1.0f);
	IsFire = true;
	UE_LOG(LogTemp, Log, TEXT("Fire"));
}

몽타주 대신 IsFire 변수로 애니메이션을 재생하도록함

애님 슬롯 추가

11

슬롯 매니저에서 UpperBody슬롯 추가

캐시 저장

1

애니메이션 블루프린트에서 기존 포즈를 캐시에 저장

포즈 블렌딩

2

저장한 캐시와 UpperBody슬롯의 발사 애니메이션을 본마다 블렌딩하여 걷거나 뛰면서도 상체가 총기발사 애니메이션을 실행하도록 함

그리고 IsFire 변수가 true이면 블렌딩된 발사모션을 표현하고 false이면 기존의 포즈를 그대로 표현하게됨

본 블렌딩 디테일

3

본 블렌딩 디테일에서 Bone NameSpine으로 설정

FireEnd 노티파이 추가

5

발사가 끝나는 지점에 새로운 노티파이 추가

노티파이 이벤트

6

FireEnd 노티파이 이벤트 발생시

IsFire 변수를 false로 만들어 총기발사 모션을 끝냄

정리하자면 캐릭터의 Fire함수에서 AnimInstancePlayFire함수를 호출하고 PlayFire함수에서 IsFire 변수를 true로 변경하면 총기발사 애니메이션이 실행되고 발사된 애니메이션에서 FireEnd 노티파이 이벤트가 발생하면 IsFire 변수를 false로 변경하여 발사 모션을 끝내도록 구현

실행 영상

참고문서

http://blog.naver.com/PostView.nhn?blogId=paulj2000&logNo=220912422034&redirect=Dlog&widgetTypeCall=true

https://rumiat.tistory.com/116

댓글남기기