[박치영] Frost Giant Boss Monster 작업

main
PCYPC\pcy35 2023-09-14 20:13:09 +09:00
parent ff4c626d33
commit f077976a16
49 changed files with 202 additions and 33 deletions

View File

@ -147,4 +147,7 @@ ManualIPAddress=
+FunctionRedirects=(OldName="/Script/D1.ICombatInterface.PerformCombatAttack",NewName="/Script/D1.ICombatInterface.PerformAttack")
+FunctionRedirects=(OldName="/Script/D1.ICombatInterface.SetIFrames",NewName="/Script/D1.ICombatInterface.SetIFrame")
+PropertyRedirects=(OldName="/Script/D1.MasterAI.DeathAnimation",NewName="/Script/D1.MasterAI.DeathAnimations")
+PropertyRedirects=(OldName="/Script/D1.MasterAI.MainWeaponCollisionComponent",NewName="/Script/D1.MasterAI.RightWeaponCollisionComponent")
+PropertyRedirects=(OldName="/Script/D1.MasterAI.RightWeaponCollisionComponent",NewName="/Script/D1.MasterAI.MainCollisionComponent")
+PropertyRedirects=(OldName="/Script/D1.MasterAI.LeftWeaponCollisionComponent",NewName="/Script/D1.MasterAI.SubCollisionComponent")

Binary file not shown.

View File

@ -41,8 +41,9 @@ ABossEnemy::ABossEnemy()
//Setting MainWeaponCollisionComponent
//Setting others is Parents
MainWeaponCollisionComponent->OnHitDelegate.BindUObject(this, &ABossEnemy::OnHit);
MainCollisionComponent->OnHitDelegate.BindUObject(this, &ABossEnemy::OnHit);
SubCollisionComponent->OnHitDelegate.BindUObject(this, &ABossEnemy::OnHit);
//Setting CombatComponent
//Setting others is Parents
CombatComponent->OnCombatToggled.AddUObject(this, &ABossEnemy::OnCombatToggled);
@ -51,11 +52,7 @@ ABossEnemy::ABossEnemy()
void ABossEnemy::BeginPlay()
{
//Blueprint에서 UMG 생성
Super::BeginPlay();
MainWeaponCollisionComponent->SetCollisionMeshComponent(WeaponMeshComponent);
MainWeaponCollisionComponent->AddActorToIgnore(this);
}
void ABossEnemy::OnTargetSet(AActor* NewTarget)

View File

@ -0,0 +1,34 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "AI/FrostGiantBoss.h"
#include "Components/CapsuleComponent.h"
#include "Components/CollisionComponent.h"
AFrostGiantBoss::AFrostGiantBoss()
{
// Set size for collision capsule
GetCapsuleComponent()->InitCapsuleSize(90.f, 200.f);
GetMesh()->SetRelativeLocation(FVector(0.f, 0.f, -192.f));
MainCollisionComponent->SetStartSocketName(TEXT("RightWeaponStart"));
MainCollisionComponent->SetEndSocketName(TEXT("RightWeaponEnd"));
MainCollisionComponent->SetTraceRaius(50.f);
SubCollisionComponent->SetStartSocketName(TEXT("LeftWeaponStart"));
SubCollisionComponent->SetEndSocketName(TEXT("LeftWeaponEnd"));
SubCollisionComponent->SetTraceRaius(50.f);
}
void AFrostGiantBoss::BeginPlay()
{
Super::BeginPlay();
MainCollisionComponent->SetCollisionMeshComponent(GetMesh());
MainCollisionComponent->AddActorToIgnore(this);
SubCollisionComponent->SetCollisionMeshComponent(GetMesh());
SubCollisionComponent->AddActorToIgnore(this);
if(IsValid(SubIntro))
PlayAnimMontage(SubIntro);
}

View File

@ -0,0 +1,26 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "AI/BossEnemy.h"
#include "FrostGiantBoss.generated.h"
/**
*
*/
UCLASS()
class D1_API AFrostGiantBoss : public ABossEnemy
{
GENERATED_BODY()
public:
AFrostGiantBoss();
protected:
virtual void BeginPlay() override;
private:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Montage|Actions", meta = (AllowPrivateAccess = "true"))
TObjectPtr<UAnimMontage> SubIntro;
};

View File

@ -40,7 +40,7 @@ AGruntlingEnemy::AGruntlingEnemy()
//Setting MainWeaponCollisionComponent
//Setting others is Parents
MainWeaponCollisionComponent->OnHitDelegate.BindUObject(this, &AGruntlingEnemy::OnHit);
MainCollisionComponent->OnHitDelegate.BindUObject(this, &AGruntlingEnemy::OnHit);
//Setting CombatComponent
//Setting others is Parents
@ -51,8 +51,8 @@ void AGruntlingEnemy::BeginPlay()
{
Super::BeginPlay();
MainWeaponCollisionComponent->SetCollisionMeshComponent(WeaponMeshComponent);
MainWeaponCollisionComponent->AddActorToIgnore(this);
MainCollisionComponent->SetCollisionMeshComponent(WeaponMeshComponent);
MainCollisionComponent->AddActorToIgnore(this);
UUI_HealthBar* HealthBarRef = Cast<UUI_HealthBar>(HealthBarComponent->GetWidget());
if (HealthBarRef) //ExposeOnSpawn 대용으로 사용

View File

@ -40,7 +40,7 @@ AHeavyMobEnemy::AHeavyMobEnemy()
//Setting MainWeaponCollisionComponent
//Setting others is Parents
MainWeaponCollisionComponent->OnHitDelegate.BindUObject(this, &AHeavyMobEnemy::OnHit);
MainCollisionComponent->OnHitDelegate.BindUObject(this, &AHeavyMobEnemy::OnHit);
//Setting CombatComponent
//Setting others is Parents
@ -51,8 +51,8 @@ void AHeavyMobEnemy::BeginPlay()
{
Super::BeginPlay();
MainWeaponCollisionComponent->SetCollisionMeshComponent(WeaponMeshComponent);
MainWeaponCollisionComponent->AddActorToIgnore(this);
MainCollisionComponent->SetCollisionMeshComponent(WeaponMeshComponent);
MainCollisionComponent->AddActorToIgnore(this);
if(APlayerController* playerController = UGameplayStatics::GetPlayerController(GetWorld(), 0))
{

View File

@ -83,18 +83,29 @@ AMasterAI::AMasterAI()
StatsComponent->SetMaxStatValue(EStats::Damage, 300.f);
StatsComponent->InitializeStats();
// Setting MainWeaponCollisionComponent
// Setting WeaponCollisionComponent
// Setting OnHit Func is Child Class
MainWeaponCollisionComponent = CreateDefaultSubobject<UCollisionComponent>(TEXT("CollisionComponent"));
MainWeaponCollisionComponent->SetTraceRaius(20.f);
MainWeaponCollisionComponent->SetStartSocketName(TEXT("WeaponStart"));
MainWeaponCollisionComponent->SetEndSocketName(TEXT("WeaponEnd"));
MainCollisionComponent = CreateDefaultSubobject<UCollisionComponent>(TEXT("MainCollisionComponent"));
MainCollisionComponent->SetTraceRaius(20.f);
MainCollisionComponent->SetStartSocketName(TEXT("WeaponStart"));
MainCollisionComponent->SetEndSocketName(TEXT("WeaponEnd"));
TArray<TEnumAsByte<EObjectTypeQuery>> InputCollisionObjectTypes;
InputCollisionObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
MainWeaponCollisionComponent->SetCollisionObjectTypes(InputCollisionObjectTypes);
MainWeaponCollisionComponent->SetDrawDebugType(EDrawDebugTrace::None);
MainCollisionComponent->SetCollisionObjectTypes(InputCollisionObjectTypes);
MainCollisionComponent->SetDrawDebugType(EDrawDebugTrace::None);
FGameplayTagContainer GameplayTags(FCombatGameplayTags::Get().Character_Enemy);
MainWeaponCollisionComponent->SetGameplayTagsIgnore(GameplayTags);
MainCollisionComponent->SetGameplayTagsIgnore(GameplayTags);
SubCollisionComponent = CreateDefaultSubobject<UCollisionComponent>(TEXT("SubCollisionComponent"));
SubCollisionComponent->SetTraceRaius(20.f);
SubCollisionComponent->SetStartSocketName(TEXT("WeaponStart"));
SubCollisionComponent->SetEndSocketName(TEXT("WeaponEnd"));
TArray<TEnumAsByte<EObjectTypeQuery>> LeftInputCollisionObjectTypes;
LeftInputCollisionObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
SubCollisionComponent->SetCollisionObjectTypes(LeftInputCollisionObjectTypes);
SubCollisionComponent->SetDrawDebugType(EDrawDebugTrace::None);
FGameplayTagContainer LeftGameplayTags(FCombatGameplayTags::Get().Character_Enemy);
SubCollisionComponent->SetGameplayTagsIgnore(LeftGameplayTags);
//Settings OwnedGameplayTags
OwnedGameplayTags.AddTag(FCombatGameplayTags::Get().Character_Enemy);
@ -209,12 +220,36 @@ void AMasterAI::SetCanMove_Implementation(bool inputCanMove)
void AMasterAI::ActivateCollision_Implementation(ECollisionPart CollisionPart)
{
MainWeaponCollisionComponent->ActivateCollision();
switch (CollisionPart)
{
case ECollisionPart::MainWeapon:
MainCollisionComponent->ActivateCollision();
break;
case ECollisionPart::OffhandWeapon:
SubCollisionComponent->ActivateCollision();
break;
case ECollisionPart::RightFoot:
break;
default:
break;
}
}
void AMasterAI::DeactivateCollision_Implementation(ECollisionPart CollisionPart)
{
MainWeaponCollisionComponent->DeactivateCollision();
switch (CollisionPart)
{
case ECollisionPart::MainWeapon:
MainCollisionComponent->DeactivateCollision();
break;
case ECollisionPart::OffhandWeapon:
SubCollisionComponent->DeactivateCollision();
break;
case ECollisionPart::RightFoot:
break;
default:
break;
}
}
void AMasterAI::SetIFrame_Implementation(bool InputEnableIFrame)
@ -222,6 +257,11 @@ void AMasterAI::SetIFrame_Implementation(bool InputEnableIFrame)
bEnableIFrame = InputEnableIFrame;
}
void AMasterAI::RotateToTarget_Implementation()
{
RotateToTargetTL();
}
float AMasterAI::PerformAction(FGameplayTag ActionTag, FGameplayTag StateTag, int32 MontageIndex, bool bRandomIndex)
{
TArray<UAnimMontage*> montages = GetActionMontage(ActionTag);
@ -276,7 +316,6 @@ float AMasterAI::PerformAttack(FGameplayTag AttackType, int32 AttackIndex, bool
}
else
{
RotateToTarget();
StateManagerComponent->SetCurrentState(FCombatGameplayTags::Get().Character_State_Attacking);
StateManagerComponent->SetCurrentAction(AttackType);
@ -360,7 +399,7 @@ void AMasterAI::CharacterStateEnd(FGameplayTag CharState)
{/*None*/}
else if (FCombatGameplayTags::Get().Character_State_Attacking == CharState)
{
StopRotateToTarget();
StopRotateToTargetTL();
}
else if (FCombatGameplayTags::Get().Character_State_Dodging == CharState)
{/*None*/}
@ -461,12 +500,12 @@ void AMasterAI::ApplyImpactEffect(EDamageType InDamageType)
UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), HitEmitter, LastHitInfo.Location);
}
void AMasterAI::RotateToTarget()
void AMasterAI::RotateToTargetTL()
{
RotateToTargetTimeLineComponent->PlayFromStart();
}
void AMasterAI::StopRotateToTarget()
void AMasterAI::StopRotateToTargetTL()
{
RotateToTargetTimeLineComponent->Stop();
}
@ -643,6 +682,8 @@ TArray<UAnimMontage*> AMasterAI::GetActionMontage(FGameplayTag characterAction)
outputArr.Add(EnterCombat);
else if (FCombatGameplayTags::Get().Character_Action_ExitCombat == characterAction)
outputArr.Add(ExitCombat);
else if (FCombatGameplayTags::Get().Character_Action_Intro == characterAction)
outputArr.Add(Intro);
return outputArr;
}

View File

@ -31,7 +31,9 @@ protected:
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true"))
TObjectPtr<class UStatsComponent> StatsComponent;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true"))
TObjectPtr<class UCollisionComponent> MainWeaponCollisionComponent;
TObjectPtr<class UCollisionComponent> MainCollisionComponent;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Components", meta=(AllowPrivateAccess="true"))
TObjectPtr<class UCollisionComponent> SubCollisionComponent;
protected:
// APawn interface
@ -67,6 +69,9 @@ public:
UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void SetIFrame(bool InputEnableIFrame);
virtual void SetIFrame_Implementation(bool InputEnableIFrame) override;
UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void RotateToTarget();
virtual void RotateToTarget_Implementation() override;
virtual EMovementSpeedMode GetCombatMovementSpeedMode() override { return GetMovementSpeedMode(); }
virtual float PerformAction(FGameplayTag ActionTag, FGameplayTag StateTag, int32 MontageIndex, bool bRandomIndex);
@ -99,10 +104,9 @@ private:
void ApplyHitReaction(EDamageType InDamageType);
void ApplyImpactEffect(EDamageType InDamageType);
//Timeline
void RotateToTarget();
void StopRotateToTarget();
void RotateToTargetTL();
void StopRotateToTargetTL();
UFUNCTION()
void RotateToTargetUpdate(float Value);
@ -168,6 +172,8 @@ private:
TObjectPtr<UAnimMontage> EnterCombat;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Montage|Actions", meta = (AllowPrivateAccess = "true"))
TObjectPtr<UAnimMontage> ExitCombat;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Montage|Actions", meta = (AllowPrivateAccess = "true"))
TObjectPtr<UAnimMontage> Intro;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Patrol", meta = (AllowPrivateAccess = "true"))
TArray<TObjectPtr<ATargetPoint>> PatrolPoints;

View File

@ -34,7 +34,7 @@ AMobEnemy::AMobEnemy()
//Setting MainWeaponCollisionComponent
//Setting others is Parents
MainWeaponCollisionComponent->OnHitDelegate.BindUObject(this, &AMobEnemy::OnHit);
MainCollisionComponent->OnHitDelegate.BindUObject(this, &AMobEnemy::OnHit);
//Setting CombatComponent
//Setting others is Parents
@ -45,8 +45,8 @@ void AMobEnemy::BeginPlay()
{
Super::BeginPlay();
MainWeaponCollisionComponent->SetCollisionMeshComponent(GetWeaponMesh());
MainWeaponCollisionComponent->AddActorToIgnore(this);
MainCollisionComponent->SetCollisionMeshComponent(GetWeaponMesh());
MainCollisionComponent->AddActorToIgnore(this);
UUI_HealthBar* HealthBarRef = Cast<UUI_HealthBar>(HealthBarComponent->GetWidget());
if (HealthBarRef) //ExposeOnSpawn 대용으로 사용

View File

@ -0,0 +1,26 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "Animation/FrostGiantAnimInstance.h"
#include "GameFramework/Character.h"
#include "GameFramework/CharacterMovementComponent.h"
void UFrostGiantAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
BossCharacter = Cast<ACharacter>(GetOwningActor());
if(BossCharacter)
CharacterMovementComponent = BossCharacter->GetCharacterMovement();
}
void UFrostGiantAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
if(!IsValid(BossCharacter) || !IsValid(CharacterMovementComponent))
return;
GroundSpeed = CharacterMovementComponent->Velocity.Length();
}

View File

@ -0,0 +1,27 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "FrostGiantAnimInstance.generated.h"
/**
*
*/
UCLASS()
class D1_API UFrostGiantAnimInstance : public UAnimInstance
{
GENERATED_BODY()
protected:
virtual void NativeInitializeAnimation() override;
virtual void NativeUpdateAnimation(float DeltaSeconds) override;
private:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="References", meta=(AllowPrivateAccess="true"))
TObjectPtr<ACharacter> BossCharacter;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="References", meta=(AllowPrivateAccess="true"))
TObjectPtr<class UCharacterMovementComponent> CharacterMovementComponent;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="EssentialMovementData", meta=(AllowPrivateAccess="true"))
float GroundSpeed;
};

View File

@ -70,6 +70,11 @@ void FCombatGameplayTags::InitializeNativeGameplayTags()
FString("Action ExitCombat")
);
GameplayTags.Character_Action_Intro = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Character.Action.Intro"),
FString("Action Intro")
);
GameplayTags.Character_Action_GeneralAction = UGameplayTagsManager::Get().AddNativeGameplayTag(
FName("Character.Action.GeneralAction"),
FString("Action GeneralAction")

View File

@ -27,6 +27,7 @@ public:
FGameplayTag Character_Action_Dodge;
FGameplayTag Character_Action_EnterCombat;
FGameplayTag Character_Action_ExitCombat;
FGameplayTag Character_Action_Intro;
FGameplayTag Character_Action_GeneralAction;
FGameplayTag Character_Action_Attack_ChargedAttack;
FGameplayTag Character_Action_Attack_FallingAttack;

View File

@ -43,6 +43,8 @@ public:
void DeactivateCollision(ECollisionPart CollisionPart);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void SetIFrame(bool InputEnableIFrame);
UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
void RotateToTarget();
UFUNCTION()
virtual EMovementSpeedMode GetCombatMovementSpeedMode() = 0;
@ -50,5 +52,6 @@ public:
virtual float PerformAction(FGameplayTag ActionTag, FGameplayTag StateTag = FCombatGameplayTags::Get().Character_State_GeneralActionState, int32 MontageIndex = 0, bool bRandomIndex = false);
UFUNCTION(Category="CombatActions")
virtual float PerformAttack(FGameplayTag AttackType, int32 AttackIndex, bool bRandomIndex = false);
};