// This class does not need to be modified. UINTERFACE(MinimalAPI) class UWeaponInterface : public UInterface { GENERATED_BODY() }; class BOSSFIGHT_API IWeaponInterface { GENERATED_BODY() // Add interface functions to this class. This is the class that will be inherited to implement this interface. public: virtual void AttackTrace() = 0; };
USTRUCT(BlueprintType) struct FBFWeaponCollisionData { GENERATED_USTRUCT_BODY() UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) FName StartSocket; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) FName EndSocket; UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) bool bIsShow = false; };🎮 AWeaponBase.h
UCLASS() class BOSSFIGHT_API AWeaponBase : public APropBase, public IWeaponInterface { GENERATED_BODY() public: AWeaponBase(); FORCEINLINE EBFEquipType GetEquipType() const { return EquipType; } virtual void AttackTrace() override; //중략 };🎮 APlayerWeapon.cpp
void APlayerWeapon::AttackTrace() { FVector Start = Mesh->GetSocketLocation(CollisionData.StartSocket); FVector End = Mesh->GetSocketLocation(CollisionData.EndSocket); FVector BoxSize = WeaponCollision->GetScaledBoxExtent(); TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes; ObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_GameTraceChannel3)); TArray<AActor*> ActorsToIgnore; ActorsToIgnore.Add(Cast<AActor>(GetOwner())); FHitResult HitResult; UKismetSystemLibrary::BoxTraceSingleForObjects( GetWorld(), Start, End, BoxSize, GetActorRotation(), ObjectTypes, false, ActorsToIgnore, CollisionData.bIsShow ? EDrawDebugTrace::Persistent : EDrawDebugTrace::None, HitResult, true); }
🎮 UPawnCombetComponent.h
UCLASS() class BOSSFIGHT_API UPawnCombetComponent : public UPawnExtensionComponent { GENERATED_BODY() public: UFUNCTION(BlueprintCallable) void ActivateWeaponTrace(EBFEquipType Type); };🎮 UPawnCombetComponent.h
void UPawnCombetComponent::ActivateWeaponTrace(EBFEquipType Type) { UPawnEquipmentComponent* EquipmentComponent = Cast<IPawnEquipmentInterface>(GetOwner())->GetPawnEquipmentComponent(); IWeaponInterface* WeaponInterface = Cast<IWeaponInterface>(EquipmentComponent->GetCurrentWeapon(Type)); WeaponInterface->AttackTrace(); }위와 같이 WeaponInterface를 통해 TraceCheck를 하도록 구현 하였다.
추가로 UPawnEquipmentComponent에 GetCurrentWeapon()함수를 추가하였다. 해당 함수는 CurrentWeaponMap에서 Type에 맞는 무기를 AWeaponBase* 형태로 반환 해주는 함수이다.
또한 기존의UPlayerEquipmentComponent의 GetPlayerCurrentWeapon()함수에서 GetCurrentWeapon()을 호출하고 Cast하도록 변경 하였다.

