[UE5] Lena: Dev Diary #7 - AI 재장전 기능, Muzzle Effect 변경, Hit Effect 변경, 배경음 추가

ChangJin·2024년 6월 24일
0

Unreal Engine5

목록 보기
73/114
post-thumbnail

2024.06.24

깃허브!풀리퀘!
https://github.com/ChangJin-Lee/SimpleShooter https://github.com/ChangJin-Lee/Project-Lena/pull/6

이번 포스팅에서는 AI의 재장전 기능, Muzzle Effect 변경, Hit Effect 변경, 그리고 배경음 추가에 대해 다룹니다. 이를 통해 게임의 완성도를 높이고, 플레이어의 몰입감을 향상시키는 방법을 소개합니다.


진행상황

  • ✅ 탄환 수 관리 시스템 구현
  • ✅ HUD에서 탄환 수 표시
  • ✅ 아이템 획득 시스템 구현
  • Pickup_Item 클래스 추가
  • ✅ 재장전 기능 구현
  • ✅ 재장전 애니메이션 추가
  • BP_Rifle 블루프린트 수정
  • ✅ 문제 해결 과정 설명
  • ✅ 게임 BGM 변경
  • ✅ 총 피격 이펙트 변경
  • ✅ 총구 발사 이펙트 변경
  • ⬜ 퍼즐 기믹 추가


AI 재장전 기능

Player 재장전 기능 살펴보기

[UE5] Lena: Dev Diary #6 - 재장전 기능 및 애니메이션 구현

이전 포스팅 ([UE5] Lena: Dev Diary #6 - 재장전 기능 및 애니메이션 구현)에서는 플레이어의 재장전 기능을 구현하였습니다. 이를 기반으로 AI도 재장전 기능을 갖추도록 개선하였습니다.

플레이어가 총을 발사할 수 있는 탄환 수를 추적하고, 탄환이 부족할 때 재장전할 수 있도록 했습니다. 재장전 애니메이션을 트리거하고, 애니메이션이 완료되면 탄환 수를 갱신하도록 했습니다. 그러나 AI는 장전이 안되어 탁탁거리는 소리만 발생하는 문제가 있었습니다.

다음은 프로젝트의 플레이어와 적 관계도입니다. Input 관련 기능은 Hero Character에 적용되며, 이를 비슷하게 Behavior Tree를 통해 Enemy Character에도 적용할 수 있습니다. AI Behavior Tree에도 Input과 비슷하게 Event Trigger를 추가해야 합니다.

캐릭터 관계도

  • AI 재장전 기능 구현에서 발생한 문제와 그 해결 과정을 아래와 같이 정리하였습니다.

문제 1. 블루프린트에서 Actor를 가져올 때 생기는 문제

캐릭터 블루프린트
  • Get Player Pawn으로 Player_0 액터를 가져와서 재장전을 하게 만들었던 것이 문제였습니다.

Get Player Pawn으로 Player_0 액터를 가져와 재장전을 하게 만든 것이 문제였습니다. 고민했던 부분은 블루프린트에서 "나"의 액터를 어떻게 가져올까였지만, 사실 필요하지 않았습니다. 함수가 현재 액터에서 실행 가능한 모든 노드를 보여주므로 별도의 cast가 필요 없었습니다.

이를 제거하여 해결하였습니다.

cast 부분 제거

문제 2. 블루프린트 Custom Event의 문제

=
캐릭터 블루프린트

캐릭터 블루프린트에서 Reload Event라는 이벤트가 생길 때 재장전을 하도록 만들었습니다. 이 이벤트는 Action Mapping으로 등록되어 있어 R 키를 눌렀을 때 플레이어에서만 재장전이 되었습니다.

캐릭터 블루프린트 Action Event

이 문제를 해결하기 위해 Input 트리거와 비슷하게 AI에서 사용할 수 있는 트리거를 정의했습니다. Base_Character에서 다음과 같은 함수를 추가하였습니다.

	void ReloadAction();
	void ReloadAIAction();
	UFUNCTION(BlueprintImplementableEvent, Category = "Reload")
	void ReloadAIEvent();
    
    void ABase_Character::ReloadAIAction()
{
	ReloadAIEvent();
	ReloadGun();
}

그리고 AI 비헤이비어 트리의 Shoot 부분에서 탄이 없을 경우 재장전을 하고 Shoot을 하도록 수정했습니다.

EBTNodeResult::Type UBTTask_Shoot::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
	Super::ExecuteTask(OwnerComp, NodeMemory);

	AAIController *AIController =  OwnerComp.GetAIOwner();

	if(AIController == nullptr)
	{
		return EBTNodeResult::Failed;
	}

	APawn *AIPawn = AIController->GetPawn();

	ABase_Character *ShooterCharacter = Cast<ABase_Character>(AIPawn);

	if(ShooterCharacter == nullptr)
	{
		return EBTNodeResult::Failed;
	}

	ShooterCharacter->ToggleIsArmed();

	if(!ShooterCharacter->GetAmmo())
	{
		ShooterCharacter->ReloadAIAction();
	}
	
	ShooterCharacter->Shoot();
	
	return EBTNodeResult::Succeeded;
}

배경음 추가하기

stocktune

https://stocktune.com/

Stocktune은 무료 배경음을 제공하는 웹사이트입니다. TPS, 어드벤처, 퍼즐 게임에 맞는 음악을 골라 사용하였습니다.

  • AmbientSound를 배치하고 원하는 음악을 추가하였습니다.


Muzzle, Hit Effect 변경

Niagara 세팅하기

  • 유데미의 Niagara VFX 강의를 참고하여 Muzzle 및 Hit Effect를 만들었습니다.
나이아가라 시스템 기본
Muzlle 1Muzlle 2Muzlle 3

유니티에서는 단순히 파티클 시스템을 사용하는 것만 해봤었는데, 언리얼 엔진은 기본 내장된 파티클 시스템을 통해 다양한 이펙트를 만들 수 있다는 점이 인상적이었습니다. 고수들이 만든 나이아가라 시스템은 고가에 거래되기도 합니다.

VFX를 만든 다음, Gun C++ 코드를 다음처럼 수정해주었습니다.


	UPROPERTY(EditAnywhere)
	class UNiagaraSystem* MuzzleFlashNS;  // Niagara 시스템 변수 추가

if (MuzzleFlashNS)
	{
		UNiagaraFunctionLibrary::SpawnSystemAttached(
			MuzzleFlashNS,
			Mesh,
			TEXT("MuzzleFlashSocket"),
			FVector::ZeroVector,
			FRotator::ZeroRotator,
			EAttachLocation::SnapToTargetIncludingScale,
			true
		);
	}

결론

이번 포스팅에서는 AI의 재장전 기능, Muzzle Effect 변경, Hit Effect 변경, 배경음 추가에 대해 다루었습니다. 이를 통해 게임의 완성도를 높이고 플레이어의 몰입감을 향상시킬 수 있었습니다. 다음 포스팅에서는 더욱 발전된 기능들을 다룰 예정이니 많은 기대 부탁드립니다.

참고 자료

이번 포스팅이 도움이 되셨길 바랍니다. 다음 포스팅도 많은 기대 부탁드립니다!

profile
게임 프로그래머

0개의 댓글