[박치영] Frost Giant Boss Monster 작업
parent
ff4c626d33
commit
f077976a16
|
@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
};
|
|
@ -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 대용으로 사용
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 대용으로 사용
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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;
|
||||
};
|
|
@ -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")
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue