지난 포스팅에서 UGameInstanceSubsystem을 상속받은 클래스 UGameManager를 만들어, 게임의 볼륨을 조정하는 함수를 만들었다.
이번 포스팅에는 UGameManager의 추가적인 설명과 더불어, UGameManager를 사용한 적들의 팀플레이 기능을 만들고자 한다.
언리얼 엔진의 Subsystem은 UGameInstanceSubsystem 외에도 여러가지가 있다.
https://docs.unrealengine.com/5.3/ko/programming-subsystems-in-unreal-engine/
<~~>SubSystem은 <~~>와 수명 주기가 똑같다.
게임 전반에 걸쳐 지속적으로 살아있는 클래스를 만들려면 UGameInstanceSubsystem를 상속 받으면 되고, 플레이어가 살아있는 동안 같이 살아있는 클래스를 만들려면 ULocalPlayerSubsystem을 상속받으면 되는 것이다.
따라서 GameManager는 UGameInstanceSubsystem를 상속받는 것이 적합하다.
서브시스템 사용의 장점 역시 공식 문서에 잘 나와있다.
이제 UGameManager를 통해 적들을 관리할 것이다.
GameManager.h에 다음과 같은 TArray를 만들어주었다.
UPROPERTY(BlueprintReadOnly)
TArray<AEnemy*> ActiveEnemies;
그리고 Enemy의 BeginPlay, Die 함수에 다음과 같은 코드를 추가했다.
// Called when the game starts or when spawned
void AEnemy::BeginPlay()
{
/*생략*/
// 자기 자신을 적 리스트에 추가
GetGameInstance()->GetSubsystem<UGameManager>()->ActiveEnemies.Add(this);
}
void AEnemy::Die(FDamageEvent const& DamageEvent)
{
/*생략*/
// 자기 자신을 적 리스트에서 삭제
GetGameInstance()->GetSubsystem<UGameManager>()->ActiveEnemies.Remove(this);
}
이로써 모든 적들은 태어날 때 TArray에 자신을 추가하고, 죽을 때 TArray에서 자신을 지운다.
에디터로 넘어가기 전에, AEnemy에 BlueprintCallable 함수 하나를 더 추가했다.
bool AEnemy::IsNotEngaged()
{
return TargetCharacter == nullptr;
}
TargetCharacter가 nullptr이라는 것은, 적이 교전 중이지 않다는 뜻이다.
이제 에디터로 넘어와, 새로운 BTTask를 만들어주었다.
UGameManager를 서브시스템을 상속받아 만들었으므로, 블루프린트에서 Get Subsystem을 통해 불러올 수 있다.
만들어진 노드는 다음과 같다.
BTTask_CallOutTarget은 적이 칸나를 발견했을 때 하는 태스크이다.
현재 활성화되어있는 적들에 대하여 IsNotEngaged라면 블랙보드의 TargetActor, 즉 교전 대상을 칸나로 설정해주고, Notice Player 함수를 호출한다.
만약 이렇게 적들을 GameManager의 리스트로 관리하지 않았다면, 다음 노드를 사용해야 했다.
Get All Actors Of Class는 게임 상의 액터들에 대해 전체 검색을 진행하기 때문에 성능 하락의 주범이 될 수 있다.
가끔씩 쓰는건 괜찮지만, 노드의 설명대로 매 프레임마다 사용하는 것은 절대 피하는 것이 좋으며, 웬만하면 다른 방안을 사용하는 것이 좋다.
유니티의 FindObjectOfType과 비슷하다.
테스트 결과, 한 적이라도 칸나를 발견하면 다른 적들도 모두 교전에 잘 돌입하는 것을 볼 수 있었다.
'언리얼 엔진 5 > 개발 일지' 카테고리의 다른 글
[UE5] 블루아카이브 TPS게임 개발일지 (62) - 대사 기능 적용 (0) | 2024.02.24 |
---|---|
[UE5] 블루아카이브 TPS게임 개발일지 (61) - 대사 시스템 (Typewriter 효과) (0) | 2024.02.21 |
[UE5] 블루아카이브 TPS게임 개발일지 (59) - 사망 연출 제작 3 (0) | 2024.02.16 |
[UE5] 블루아카이브 TPS게임 개발일지 (58) - 사망 연출 제작 2 (0) | 2024.02.16 |
[UE5] 블루아카이브 TPS게임 개발일지 (57) - 사망 연출 제작 (Geometry Collection) (0) | 2024.02.16 |