diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Animations/Gruntling_Sword_Attack_Swing.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Animations/Gruntling_Sword_Attack_Swing.uasset new file mode 100644 index 00000000..d0ce56ac Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Animations/Gruntling_Sword_Attack_Swing.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Animations/Idle_Grunt.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Animations/Idle_Grunt.uasset new file mode 100644 index 00000000..90989bfb Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Animations/Idle_Grunt.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/BP_GruntlingEnemy.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/BP_GruntlingEnemy.uasset new file mode 100644 index 00000000..9f18c5ef Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/BP_GruntlingEnemy.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/BT_GruntlingEnemy.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/BT_GruntlingEnemy.uasset new file mode 100644 index 00000000..e8d5b051 Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/BT_GruntlingEnemy.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Materials/CharM_Gruntling_Guardian.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Materials/CharM_Gruntling_Guardian.uasset new file mode 100644 index 00000000..948f0b65 Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Materials/CharM_Gruntling_Guardian.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/SK_Gruntling_Guardian.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/SK_Gruntling_Guardian.uasset new file mode 100644 index 00000000..2937417d Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/SK_Gruntling_Guardian.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/SK_Gruntling_Guardian_Skeleton.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/SK_Gruntling_Guardian_Skeleton.uasset new file mode 100644 index 00000000..2c523168 Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/SK_Gruntling_Guardian_Skeleton.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_D.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_D.uasset new file mode 100644 index 00000000..4cb8a6a0 Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_D.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_E.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_E.uasset new file mode 100644 index 00000000..d0316c0d Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_E.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_M.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_M.uasset new file mode 100644 index 00000000..507e2fc8 Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_M.uasset differ diff --git a/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_N.uasset b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_N.uasset new file mode 100644 index 00000000..d95ace69 Binary files /dev/null and b/Content/CombatSystem/Blueprints/AI/GruntlingEnemy/Mesh/Textures/T_Gruntling_Guardian_N.uasset differ diff --git a/Source/D1/AI/GruntlingEnemy.cpp b/Source/D1/AI/GruntlingEnemy.cpp new file mode 100644 index 00000000..9352868c --- /dev/null +++ b/Source/D1/AI/GruntlingEnemy.cpp @@ -0,0 +1,106 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "AI/GruntlingEnemy.h" + +#include "Blueprint/UserWidget.h" +#include "Components/CollisionComponent.h" +#include "Components/WidgetComponent.h" +#include "Components/CombatComponent.h" +#include "DamageType/AttackDamageType.h" +#include "Kismet/GameplayStatics.h" +#include "UI/UI_HealthBar.h" + +AGruntlingEnemy::AGruntlingEnemy() +{ + TargetingWidgetComponent->SetRelativeLocation(FVector(0.f, 0.f, 132.f)); + + //Setting SocketName + AttachSocketName = TEXT("SwordHipAttachSocket"); + WeaponHandSocketName = TEXT("RightWeaponSocket"); + + //Setting UWidgetComponent + HealthBarComponent = CreateDefaultSubobject(TEXT("HealthBar")); + static ConstructorHelpers::FClassFinder WidgetRef(TEXT("/Game/CombatSystem/UI/WBP_HealthBar.WBP_HealthBar_C")); + if(WidgetRef.Class) + { + HealthBarComponent->SetWidgetClass(WidgetRef.Class); + HealthBarComponent->SetWidgetSpace(EWidgetSpace::Screen); + HealthBarComponent->SetDrawSize({150.f, 10.f}); + HealthBarComponent->SetupAttachment(GetMesh()); + HealthBarComponent->SetRelativeLocation(FVector(0.f, 0.f, 200.f)); + HealthBarComponent->SetVisibility(false); + } + + //Setting WeaponMeshComponent + WeaponMeshComponent = CreateDefaultSubobject(TEXT("WeaponMeshComponent")); + WeaponMeshComponent->SetRelativeLocationAndRotation(FVector(0.f, 0.f, 0.f), FRotator(0.f, 0.f, 0.f)); + WeaponMeshComponent->SetupAttachment(GetMesh(), AttachSocketName); + WeaponMeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); + + //Setting MainWeaponCollisionComponent + //Setting others is Parents + MainWeaponCollisionComponent->OnHitDelegate.BindUObject(this, &AGruntlingEnemy::OnHit); + + //Setting CombatComponent + //Setting others is Parents + CombatComponent->OnCombatToggled.AddUObject(this, &AGruntlingEnemy::OnCombatToggled); +} + +void AGruntlingEnemy::BeginPlay() +{ + Super::BeginPlay(); + + MainWeaponCollisionComponent->SetCollisionMeshComponent(WeaponMeshComponent); + MainWeaponCollisionComponent->AddActorToIgnore(this); + + if(APlayerController* playerController = UGameplayStatics::GetPlayerController(GetWorld(), 0)) + { + UUI_HealthBar* HealthBarRef = Cast(HealthBarComponent->GetWidget()); + if(HealthBarRef) //ExposeOnSpawn 대용으로 사용 + { + HealthBarRef->InitializeHealthBar(this->StatsComponent, EStats::Health); + HealthBarComponent->SetWidget(HealthBarRef); + } + } +} + +void AGruntlingEnemy::OnTargeted(bool bIsTargeted) +{ + Super::OnTargeted(bIsTargeted); + HealthBarComponent->SetVisibility(bIsTargeted); +} + +void AGruntlingEnemy::OnHit(FHitResult hitResult) +{ + ICombatInterface* pActor = Cast(hitResult.GetActor()); + if (pActor) + { + if (pActor->Execute_CanReceiveDamage(hitResult.GetActor())) + UGameplayStatics::ApplyPointDamage(hitResult.GetActor(), StatsComponent->GetCurrentStatValue(EStats::Damage), this->GetActorForwardVector(), hitResult, GetController(), this, UAttackDamageType::StaticClass()); + } +} + +void AGruntlingEnemy::OnCombatToggled(bool IsCombatEnabled) +{ + FName SocketName; + if(IsCombatEnabled) + SocketName = WeaponHandSocketName; + else + SocketName = AttachSocketName; + FAttachmentTransformRules rules(EAttachmentRule::SnapToTarget, EAttachmentRule::SnapToTarget, EAttachmentRule::SnapToTarget, true); + WeaponMeshComponent->AttachToComponent(GetMesh(), rules, SocketName); +} + +void AGruntlingEnemy::PerformDeath() +{ + //TODO : 죽었을 때 무기에 Collision이 남아있는 버그 있음 + Super::PerformDeath(); + SimulateWeaponPhysics(); +} + +void AGruntlingEnemy::SimulateWeaponPhysics() +{ + WeaponMeshComponent->SetCollisionProfileName(TEXT("PhysicsActor"), true); + WeaponMeshComponent->SetSimulatePhysics(true); +} diff --git a/Source/D1/AI/GruntlingEnemy.h b/Source/D1/AI/GruntlingEnemy.h new file mode 100644 index 00000000..3c0dabca --- /dev/null +++ b/Source/D1/AI/GruntlingEnemy.h @@ -0,0 +1,46 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "AI/MasterAI.h" +#include "GruntlingEnemy.generated.h" + +/** + * + */ +UCLASS() +class D1_API AGruntlingEnemy : public AMasterAI +{ + GENERATED_BODY() +public: + AGruntlingEnemy(); + +private: + UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="UI", meta=(AllowPrivateAccess="true")) + TObjectPtr HealthBarComponent; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Component", meta=(AllowPrivateAccess="true")) + TObjectPtr WeaponMeshComponent; + +protected: + virtual void BeginPlay() override; + +protected: + // Inherited via ITargetingInterface + virtual void OnTargeted(bool bIsTargeted) override; + +public: // Delegate + //UCollisionComponent + void OnHit(FHitResult hitResult); + //UCombatComponent + void OnCombatToggled(bool IsCombatEnabled); +public: + virtual void PerformDeath() override; + void SimulateWeaponPhysics(); + +private: + UPROPERTY(EditAnywhere, Blueprintable, Category="Initialization", meta=(AllowPrivateAccess="true")) + FName AttachSocketName; + UPROPERTY(EditAnywhere, Blueprintable, Category="Initialization", meta=(AllowPrivateAccess="true")) + FName WeaponHandSocketName; +};