* 발사체주문 클래스 생성
* 발사체주문 클래스에 뭐가 필요한지 생각
* 능력활성화 함수 Test (c++ , BP)
class AURA_API UAuraProjectileSpell : public UAuraGameplayAbility
{
GENERATED_BODY()
protected:
virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo,
const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
};
일단 로그만 찍어보자
// Fill out your copyright notice in the Description page of Project Settings.
#include "AbilitySystem/Abilities/AuraProjectileSpell.h"
#include "Kismet/KismetSystemLibrary.h"
void UAuraProjectileSpell::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
//BP의 PrintString과 동일함
UKismetSystemLibrary::PrintString(this,FString("ActivatedAbility C++"), true, true,FLinearColor::Yellow, 3);
}
* 발사체 주문함수 구현
- 일단 발차세클래스를 변수로 가져야함 (의존성주입은 BP에서)
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TSubclassOf<AAuraProjectile> ProjectileClass;
- 우리는 발사체를 서버에서 생성하고 , 클라로 복사함(클라는 복사본을 보게될것임)
발사체클래스에서 복사 켜주기
AAuraProjectile::AAuraProjectile()
{
PrimaryActorTick.bCanEverTick = false;
bReplicates=true; //발사체 서버에서 클라로 복사
발사체 생성하는 함수구현
void UAuraProjectileSpell::ActivateAbility(const FGameplayAbilitySpecHandle Handle,
const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo,
const FGameplayEventData* TriggerEventData)
{
Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData);
//발사체는 서버에서생성, 클라는 복제본을 보게될거임
//발사체가 서버에있는지 어케암?
const bool bIsServer = HasAuthority(&ActivationInfo);
if(! bIsServer) return ; //발사체가 서버있는경우만 발사체 생성
FTransform SpanwTransform; //발사체생성할 위치 == 지팡이끝 / but, 캐릭터에의존하면안됨, 전투인터페이스에서 소켓위치를 반환받으면 좋겠음.
//<생성하고자하는타입> (클래스, 날아갈 회전값, 수행자, 수행할폰, 충돌-겹침 상관없이 항상생성)
GetWorld()->SpawnActorDeferred<AAuraProjectile>(
ProjectileClass,
SpanwTransform,
GetOwningActorFromActorInfo(),
Cast<APawn>(GetOwningActorFromActorInfo()),
ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
}
* 문제 : 발사체를 생성할위치를 정하는데, 캐릭에 의존안하고 전투인터페이스에서 소켓위치를 리턴받고자함
FVector AAuraCharacterBase::GetCombatSocketLocation()
{
return Weapon->GetSocketLocation(WeaponTipSocketName);
}
- 할일 :에디터에서 WeaponTipSocketName 설정
아래코드가 실행될거임
FVector AAuraCharacterBase::GetCombatSocketLocation()
{
return Weapon->GetSocketLocation("TipSocket");
}
* 크래쉬 발생
원인 : 얘가 널임
해결 : GA에서 발사체 클래스 뭘 사용할건지 의존성주입 해주면됨 //우리가만든 BP_FireBolt 사용
* Test
해결 : 회전을 설정해주면됨
'UE5 > Gameplay Abilities' 카테고리의 다른 글
[UE5] Gameplay Abilities 퀴즈 (0) | 2024.06.09 |
---|---|
[UE5] fix : 커서트레이스 버그수정, 고블린눌러도 불 안나가는 버그수정? (0) | 2024.06.09 |
[UE5] PC 리팩토링, 클라에서 포션먹음 메시지 안뜨는 버그수정, 클라이언트 RPC (0) | 2024.06.09 |
[UE5] Click To Move 구현 (0) | 2024.06.09 |
[UE5] 태그에 맞는 능력 활성화 구현 (0) | 2024.06.09 |