언리얼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 변수로 애니메이션을 재생하도록함
애님 슬롯 추가
슬롯 매니저에서 UpperBody
슬롯 추가
캐시 저장
애니메이션 블루프린트에서 기존 포즈를 캐시에 저장
포즈 블렌딩
저장한 캐시와 UpperBody
슬롯의 발사 애니메이션을 본마다 블렌딩하여 걷거나 뛰면서도 상체가 총기발사 애니메이션을 실행하도록 함
그리고 IsFire
변수가 true
이면 블렌딩된 발사모션을 표현하고 false
이면 기존의 포즈를 그대로 표현하게됨
본 블렌딩 디테일
본 블렌딩 디테일에서 Bone Name
을 Spine
으로 설정
FireEnd 노티파이 추가
발사가 끝나는 지점에 새로운 노티파이 추가
노티파이 이벤트
FireEnd 노티파이 이벤트 발생시
IsFire 변수를 false로 만들어 총기발사 모션을 끝냄
정리하자면 캐릭터의 Fire
함수에서 AnimInstance
의 PlayFire
함수를 호출하고 PlayFire
함수에서
IsFire
변수를 true
로 변경하면 총기발사 애니메이션이 실행되고 발사된 애니메이션에서
FireEnd
노티파이 이벤트가 발생하면 IsFire
변수를 false
로 변경하여 발사 모션을 끝내도록 구현
댓글남기기