1. EffectActor 를 만듬
2. 충돌할 구, 매쉬를 만듬, 연결
UPROPERTY(VisibleAnywhere)
TObjectPtr<USphereComponent> Sphere;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UStaticMeshComponent> Mesh;
// 생성자
AAuraEffectActor::AAuraEffectActor()
{
// 이 액터는 매 프레임마다 업데이트되지 않음
PrimaryActorTick.bCanEverTick = false;
// 메시 컴포넌트 생성 및 초기화
Mesh = CreateDefaultSubobject<UStaticMeshComponent>("Mesh");
// 메시를 루트 컴포넌트로 설정
SetRootComponent(Mesh);
// 구형 충돌 컴포넌트 생성 및 초기화
Sphere = CreateDefaultSubobject<USphereComponent>("Sphere");
// 구형 컴포넌트를 루트 컴포넌트에 첨부
Sphere->SetupAttachment(GetRootComponent());
}
3. 충돌시 실행할 함수 생성, 충돌시 실행시키라고 바인딩
UFUNCTION()
virtual void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
UFUNCTION()
virtual void EndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
void AAuraEffectActor::BeginPlay()
{
Super::BeginPlay(); // 부모 클래스의 BeginPlay 함수를 호출합니다.
Sphere->OnComponentBeginOverlap.AddDynamic(this, &AAuraEffectActor::OnOverlap); // 충돌 시작 이벤트에 OnOverlap 함수를 연결합니다.
Sphere->OnComponentEndOverlap.AddDynamic(this, &AAuraEffectActor::EndOverlap); // 충돌 종료 이벤트에 EndOverlap 함수를 연결합니다.
}
4. 함수구현
// (물약이) 다른 액터(플레이어)와 겹쳤을 때 호출되는 함수(v1)
// 나중에 수정할것임
void AAuraEffectActor::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
//TODO: Change this to apply a Gameplay Effect. For now, using const_cast as a hack!
// 능력 시스템 인터페이스를 구현한 다른 액터를 찾아 체력 증가 처리
if (IAbilitySystemInterface* ASCInterface = Cast<IAbilitySystemInterface>(OtherActor))
{ //IAbilitySystemInterface를 구현한 OtherActor에 대해 체크하고, 이를 통해 해당 액터의 능력 시스템 컴포넌트를 가져옵니다.
const UAuraAttributeSet* AuraAttributeSet = Cast<UAuraAttributeSet>(ASCInterface->GetAbilitySystemComponent()->GetAttributeSet(UAuraAttributeSet::StaticClass()));
// 체력 속성을 수정 가능하게 하기 위해 const_cast 사용 (주의: 일반적으로 권장되지 않는 방법)
UAuraAttributeSet* MutableAuraAttributeSet = const_cast<UAuraAttributeSet*>(AuraAttributeSet);
// 체력을 증가시키고 이 액터를 파괴
MutableAuraAttributeSet->SetHealth(AuraAttributeSet->GetHealth() + 25.f);
Destroy();
}
}
5. const_cast 란?
1. const pointer는 변경불가능 -> const_cast로 변경가능토록 만들기
2. 형식 : 타입* 수정가능포인터 = const_cast<타입*>(const ptr)
UAuraAttributeSet* MutableAuraAttributeSet = const_cast<UAuraAttributeSet*>(AuraAttributeSet);
3.이후 수정가능포인터 에서 값을 바꾸면 원본 const ptr의 값이 바뀐다.
강제로 p의 값을 바꾸었다.
4. 단점 : p의 원본인 num의 값은 그대로임 -> 혼란 -> 사용자제
6. EffectActor 상속받은 bp만들고, 포션매쉬 넣기
7. 뷰포트에 배치후, 정상작동인지 확인 (` -> showdebug abilitysystem)
체력이 100->125로 증가했다.
'UE5 > GAS' 카테고리의 다른 글
[UE5] GAS 속성개념, 구현, 속성추가방법, 디버깅방법 (0) | 2024.05.26 |
---|---|
[UE5] GAS Ability Actor Info // 능력 정보초기화 하는방법 (0) | 2024.05.26 |
[UE5] GAS 복제 모드 설정 // 멀티플레이설계 -> 싱글플레이 작동가능(역X) (0) | 2024.05.26 |
[UE5] GAS 구현 // ASC, AS Getter구현 (0) | 2024.05.26 |
[UE5] Gas Server 이해 (0) | 2024.05.26 |