* GE 만들기
* SpecHandle 만들기
포인터가아니므로, .h를 인클루드해야함
class AURA_API AAuraProjectile : public AActor
{
...
UPROPERTY(BlueprintReadWrite,meta = (ExposeOnSpawn=true)) //BP 노드에 노출
FGameplayEffectSpecHandle DamageEffectSpecHandle;
스펠(GA 화염구)에서 사용할 GE 변수를 만듬
class AURA_API UAuraProjectileSpell : public UAuraGameplayAbility
{
...
UPROPERTY(EditDefaultsOnly,BlueprintReadOnly)
TSubclassOf<UGameplayEffect> DamageEffectClass; //데미지줄 GE
발사체의 specHandle을 set
//TODO: 발사체에게 Gameplay Effect Spec 부여 => 데미지 주기위해
//1. SpecHandle 만들기
UAbilitySystemComponent* SourceASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetAvatarActorFromActorInfo());
FGameplayEffectSpecHandle SpecHandle = SourceASC->MakeOutgoingSpec(DamageEffectClass, GetAbilityLevel(),SourceASC->MakeEffectContext());
Projectile->DamageEffectSpecHandle=SpecHandle; //set
GE 적용하기
void AAuraProjectile::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
...
//서버에있는경우
if(HasAuthority())
{
if(auto TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(OtherActor))
{
//GE 적용하기
TargetASC->ApplyGameplayEffectSpecToSelf(*DamageEffectSpecHandle.Data.Get());
}
Destroy(); //파괴 => 클라에복제안되게
}
-AS에 디버깅용 코드 추가
void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
Super::PostGameplayEffectExecute(Data);
FEffectProperties Props;
SetEffectProperties(Data,Props);
if(Data.EvaluatedData.Attribute==GetHealthAttribute())
{
SetHealth(FMath::Clamp(GetHealth(),0.f,GetMaxHealth()));
UE_LOG(LogTexture, Warning, TEXT("Changed Health on %s Health: %f"),*Props.TargetAvatarActor->GetName(),GetHealth());
* 적 속성 초기화하기
초기화 함수도 있음
void AAuraCharacterBase::InitializeDefaultAttributes() const
{
ApplyEffectToSelf(DefaultPrimaryAttributes, 1.f);
ApplyEffectToSelf(DefaultSecondaryAttributes, 1.f);
ApplyEffectToSelf(DefaultVitalAttributes, 1.f);
}
사용만 하면됨
void AAuraEnemy::InitAbilityActorInfo()
{
...
InitializeDefaultAttributes();
}
-해결 : 비긴플레이에서 함수호출 안하고있었음..
void AAuraEnemy::BeginPlay()
{
Super::BeginPlay();
InitAbilityActorInfo();
}
* 시작시 불쏘는 버그 고치기
맵에 GA_firebolt가 배치되있었음 -> 삭제
* 불에서 벗어나도 체력 깍이는 버그 고치기
효과가 2번적용되는걸로 추정
원인 : 캐릭의 캡슐, 매쉬에 2번 겹쳐서 그런거임
해결 : 캡슐에서 오버랩 이벤트꺼줌
- cpp 에서도 수정
// Sets default values
AAuraCharacterBase::AAuraCharacterBase()
{
// Set this character to call Tick() every frame.
// You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = false; //틱마다 tick함수 실행하지마
//캐릭겹치면 카메라 줌인 해결 : 캡슐, 매시가 카메라 무시하도록
GetCapsuleComponent()->SetCollisionResponseToChannel(ECC_Camera,ECR_Ignore);
GetCapsuleComponent()->SetGenerateOverlapEvents(false);
'UE5 > Ability Tasks' 카테고리의 다른 글
[UE5] AbilityTask 퀴즈 (0) | 2024.06.18 |
---|---|
[UE5] 적 체력바 구현 (0) | 2024.06.18 |
[UE5] 발사체와 충돌할 대상 정리 (0) | 2024.06.15 |
[UE5] 발사체 이펙트, 소리, 수명 구현 (0) | 2024.06.15 |
[UE5] 발사체 방향으로 캐릭회전 구현 (0) | 2024.06.15 |