0. 개요
몬스터에 커서를 가져다 대면 빨간색의 외곽선이 표시되는 것처럼, 다른 맵으로 이동하는 액터 입구 등에 적용할 수 있도록 하이라이트를 만든다.
1. 몬스터가 아닌 액터 하이라이트
(1) 포스트 프로세스 볼륨의 머티리얼 찾기
이전에 몬스터에 외곽선을 그릴 때, 포스트 프로세스를 사용했다.
레벨에 배치된 포스트 프로세스 볼륨을 선택하고 머티리얼을 따라간다.
위의 파란색에서 연결되어져 나온 두번째 if 노드를 마지막 if 노드의 A>B에 연결한다.
이제 코멘트에 따라서, 액터의 메쉬에 커스텀 스텐실 값을 250이나 251 등의 값으로 지정하면 하이라이팅 색이 변경될 것이다.
(2) 특정 액터에 커스텀 스텐실 값 부여
포스트 프로세싱은 렌더링 된 상태에서 그래픽 효과를 부여하는 작업이므로, 에디터에서 실행 중인 상태에서 테스트를 해 볼 수 있다.
- 액터의 메시 컴포넌트를 클릭하고 커스텀 뎁스 패스 렌더를 체크
- 커스텀 뎁스 스텐실 값 부여
(3) Aura.h에서 커스텀 뎁스 스텐실 값 정의
#define CUSTOM_DEPTH_RED 250
#define CUSTOM_DEPTH_BLUE 251
#define CUSTOM_DEPTH_TAN 252
C++ 코드에서 해당 값을 편리하게 사용하기 위해 값을 정의한다.
- 커스텀 뎁스 스텐실 패스가 올바르게 작동하지 않을 때 확인
커스텀 뎁스-스텐실 패스가 Enabled with Stencil로 되어있는지 확인한다.
2. 하이라이트 인터페이스
이전에 몬스터를 하이라이트하기 위해, EnemyInterface에 하이라이트 기능을 만들었었다.
해당 기능을 하이라이트 인터페이스로 이전하고 다른 클래스에도 사용할 수 있도록 확장한다.
(1) HighlightInterface로 EnemyInterface의 기존 함수 이전
class AURA_API IHighlightInterface
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
void HighlightActor();
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
void UnHighlightActor();
};
(2) AuraPlayerController의 LastActor, ThisActor의 타입 변경
TScriptInterface<IHighlightInterface> LastActor;
TScriptInterface<IHighlightInterface> ThisActor;
(3) AuraEnemy가 하이라이트 인터페이스를 상속받도록 변경
UCLASS()
class AURA_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface, public IHighlightInterface
{
GENERATED_BODY()
public:
AAuraEnemy();
virtual void PossessedBy(AController* NewController) override;
public:
// 하이라이트 인터페이스 오버라이드
virtual void HighlightActor_Implementation() override;
virtual void UnHighlightActor_Implementation() override;
// 하이라이트 인터페이스 끝
한편 AuraEnemy의 HighlightActor 함수를 살펴보면 아래와 같다.
void AAuraEnemy::HighlightActor_Implementation()
{
GetMesh()->SetRenderCustomDepth(true);
GetMesh()->SetCustomDepthStencilValue(CUSTOM_DEPTH_RED);
Weapon->SetRenderCustomDepth(true);
Weapon->SetCustomDepthStencilValue(CUSTOM_DEPTH_RED);
}
커스텀 뎁스 스텐실 값을 CUSTOM_DEPTH_RED로 지정하는 것을 볼 수 있다.
이제 몬스터가 아닌 액터 대상으로 메쉬를 가져와 렌더 커스텀 뎁스를 true로 바꾼 후 커스텀 뎁스 스텐실 값을 CUSTOM_DEPTH_BLUE 또는 CUSTOM_DEPTH_TAN으로 지정할 수 있다.
3. 문제점
void AAuraPlayerController::AbilityInputTagPressed(FGameplayTag InputTag)
{
// 입력 상태 태그 확인
if (GetASC() && GetASC()->HasMatchingGameplayTag(FAuraGameplayTags::Get().Player_Block_InputPressed))
{
return;
}
if (InputTag.MatchesTagExact(FAuraGameplayTags::Get().InputTag_LMB))
{
// ThisActor가 nullptr이 아니면 true
bTargeting = ThisActor ? true : false;
bAutoRunning = false;
}
if (GetASC())
GetASC()->AbilityInputTagPressed(InputTag);
}
지금은 마우스 클릭이 AbilityInputTagPressed에 의해 발동되고, ThisActor의 nullptr 유무에 따라 액터의 타겟팅 상태를 판단하고 있다.
또한 대상이 어떻든 ASC에 대해서 입력 태그에 할당된 어빌리티를 발동하고 있기 때문에, 적이 아닌 액터를 클릭하더라도 왼쪽 마우스 클릭에 할당된 어빌리티가 실행될 것이다.
(ex) 던전 입구를 클릭했더니 입구로 이동하지 않고 입구를 향해 파이어볼트 발사
이를 해결하기 위해 타겟팅 상태를 도입한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
30-3. 맵 이동 - (3) 적이 아닌 대상 하이라이트 (0) | 2025.04.11 |
---|---|
30-2. 맵 이동 - (2) 타겟팅 상태, 커서 트레이스 리펙토링 (0) | 2025.04.11 |
29-9. 저장 - (10) 월드 불러오기와 역직렬화(Deserialize) (0) | 2025.04.10 |
29-8. 저장 - (9) 월드 저장과 직렬화 (0) | 2025.04.10 |
29-7. 저장 - (8) 어빌리티 저장 및 불러오기 (0) | 2025.04.08 |