[DevNote] Character Skill
Skill Data
UENUM(BlueprintType)
enum class ESkillState : uint8
{
None = 0,
Added, // ์คํฌ์ด ์ถ๊ฐ๋ ์ํ. ๋ฏธ์ฅ์ฐฉ
Equipped, // ์คํฌ์ด ์ฅ์ฐฉ๋ ์ํ. ๋นํ์ฑ ์ํ. ์: A ๋ฌด๊ธฐ ์คํฌ์ด๋ฉด์ ์คํฌํธ๋ฆฌ์์ ์ฅ์ฐฉ. ๊ทธ๋ฌ๋ ํ์ฌ ๋ฌด๊ธฐ๋ B
Activated, // ์คํฌ์ด ํ์ฑํ ๋ ์ํ.
};
USTRUCT(BlueprintType)
struct FSkillData
{
GENERATED_BODY()
// ์ง์ง Skill ์ ๋ณด ์ ๊ทผ GUID
UPROPERTY()
FGuid SkillJournalID;
UPROPERTY()
TWeakObjectPtr<class USkillJournal> SkillJournal;
UPROPERTY()
int32 CurrentSkillLevel = 0;
UPROPERTY()
int32 MaxSkillLevel = 0;
UPROPERTY()
ESkillState SkillState = ESkillState::None;
};
- ์์ Skill Data๋ ์ค์ ์คํฌ ์ ๋ณด๋ณด๋ค๋, ๊ทธ ์ ๋ณด์ ์ ๊ทผํ ์ ์๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๋ค
- ์ค์ Skill ์ ๋ณด๋ ๋ณ๋์ ๋ฐ์ดํฐ ํ์์ผ๋ก ๊ด๋ฆฌํ๋ค (DataTable, ๋๋ Journal)
- ๊ทธ๋ฆฌ๊ณ ์ด ์ค์ Skill ์ ๋ณด๋ ์ถ๋ ฅ์ํฌ Abl๊ณผ ์กฐ๊ฑด, ์ด๋ฆ, Description ์ ๋ณด ๋ฑ์ ๊ฐ์ง๋ค
- ๋ํ ํด๋น Skill์ ์ํ๋ฅผ enum์ผ๋ก ๊ตฌ๋ถํ๋ค
Note
์ด๊ฒ ์กฐ๊ธ ์ง๊ด์ ์ด์ง ์๋ค๋ ์๊ฐ์ด ์์ง๋ ๋ ๋ค
๋ฒ๊ทธ ์ํฉ์ด๊ธด ํ์ง๋ง A ๋ฌด๊ธฐ ์ฐฉ์ฉ ์ B ๋ฌด๊ธฐ ์ ์ฉ ์คํฌ์ด ์ถ๋ ฅ๋๋ ํ์์ด ์์๋ค
์ถ๋ ฅ ์กฐ๊ฑด์์ ํ์ฌ ๋ฌด๊ธฐ ํ์
์ ์ฒดํฌํ๊ณ ์ถ๋ ฅํ๋ ๊ฒ ๋ ๋ซ์ง ์์์๊น?
๊ทธ๋ผ State ํ๋๊ฐ ์ค์ด๋ค๊ณ ํ์
์ boolean์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ ๊ฒ ๊ฐ์๋ฐโฆ
Skill Journal
UCLASS(meta=(DisplayName="Skill"))
class AACLIENT_API USkillJournal : public UJournalContainerEntry
{
GENERATED_BODY()
public:
//...
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
int32 ID;
// ํ์ฑํ๋์ด ์์ด์ผ ํ Skill Node ID, ์์ผ๋ฉด ์ธํ
์ ํ๋ฉด ๋จ...
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TArray<int32> ActivatePrerequisiteIDs;
UPROPERTY(EditAnywhere)
FText DisplayName;
UPROPERTY(EditDefaultsOnly, meta=(categories="Skill"))
FGameplayTagContainer SkillTraits;
// ...
// ์คํฌ ์คํ ์ ์คํํ Able
// Active Skill
UPROPERTY(EditAnywhere)
TSubclassOf<class UAblAbility> SkillAbl;
// ์คํฌ ์ฅ์ฐฉ ์ ์คํํ GA
// Passive Skill
UPROPERTY(EditAnywhere)
TArray<TSubclassOf<class UGameplayAbility>> SkillGA;
};
- ์์ Skill Data๋ Skill Journal(DT์ ์ผ์ข ) ํ์ ์ผ๋ก์, ์ค์ Skill ์ ๋ณด๋ค์ด ์ ์๋์ด ์๋ค
- ์คํํ Abl, ์ ํ ์คํฌ ID ๋ชฉ๋ก, Icon ์ด๋ฏธ์ง, Trait, Granted GA ๋ฑ์ด ์ฌ๊ธฐ์ ํฌํจ๋๋ค
- ํนํ Skill Trait์, ํ๊ทธ๋ก์ Skill์ Passive/Active, Slot1/Slot2 ๋ฑ ์คํฌ ๊ณ ์ ์ ์์ฑ์
Skill Component
- ํ๋ ์ด์ด์ ์คํฌ์ ๊ด๋ฆฌํ๋ ์ปดํฌ๋ํธ
- PlayerState์ Component
- ์คํฌ ์ถ๊ฐ, ์ ๊ฑฐ, ์ํ ๋ณ๊ฒฝ ๋ฑ ๊ธฐ๋ฅ
- ๋ฌด๊ธฐ ๋ฑ ์ฅ๋น ๋ณ๊ฒฝ๊ณผ UI๋ฅผ ํตํ ์คํฌ ๋ณ๊ฒฝ ๋ฑ ๋ฉ์์ง๋ฅผ ๋ฐ๋๋ค
Note
์ฒ์ Skill ๊ฐ์ฒด๋ฅผ Item์ผ๋ก ๋ง๋ค์ด Inventory์์ ๊ด๋ฆฌํ๋๋ก ํ๋๋ฐ, ์ด๋ ์๋ชป๋ ์ ํ์ด์๋ ๋ฏโฆ
๋จ์ํ Skill์ ์ต๋ ์ฌ๋ถ ์ด์ธ์๋ ์ํ ๊ด๋ฆฌ๋ฅผ ๋ณ๋๋ก ํด์ค์ผ ํ๋ค๋ ์ ์์ ๊ตณ์ด ์์ดํ
๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํ ํ์๋ X
๊ดํ Item Category๋ง ๋์ด๋๊ณ ๊ด๋ฆฌ๋ง ๋ ํ๋ค์ด์ก๋คโฆ
Skill ์คํ
bool UComboNode::CanSelect() const
{
UComboNodeData* NodeData = CastChecked<UComboNodeData>(ComboNodeData);
UAblComponent* AblComponent = FL::GetActorComponent<UAblComponent>(OwnerActor);
if (IsValid(NodeData) && IsValid(AblComponent))
{
// ...
// NodeData๊ฐ ๊ฐ์ง ์คํฌ ์ ๋ณด์ ์ ๊ทผํด State ํ์ธ
if (APlayerState* PlayerState = FL::GetPlayerState(OwnerActor))
{
if (USkillComponent* SkillComponent = PlayerState->FindComponentByClass<USkillComponent>())
{
return SkillComponent->IsSkillActivated(NodeData->Journal.Guid);
}
}
// ...
}
return false;
}
- ์ค์ ๋ก ์คํฌ์ ์ถ๋ ฅํ๋ ๋ถ๋ถ์ ComboComponent
- ComboComponent์์ ComboAseet์ ํตํด CurrentNode ์คํ
- CurrentNode๋ ์ ์๋ ๋ฐ์ดํฐ์ Skill ์ ๋ณด๊ฐ ์๋์ง ํ์ธ
bool UComboNode::Select()
{
if (UAblAbility* AblCDO = GetAblAbility())
{
if (UAblComponent* AblComponent = FL::GetActorComponent<UAblComponent>(OwnerActor))
{
UAblAbilityContext* AblAbilityContext = UAblAbilityContext::MakeContext(AblCDO, AblComponent, OwnerActor, OwnerActor->GetInstigator());
check(AblAbilityContext);
if (UComboNodeData* NodeData = CastChecked<UComboNodeData>(ComboNodeData))
{
AblAbilityContext->SetCopyFromPrevAblContext(NodeData->bCopyTargetsFromPrevNode);
}
AblCDO->SetupTargeting(AblAbilityContext);
EAblAbilityStartResult Result;
if(ComboAsset->IsComboPlaying())
{
Result = AblComponent->BranchAbility(AblAbilityContext);
}
else
{
Result = AblComponent->ActivateAbility(AblAbilityContext);
}
if(Result == EAblAbilityStartResult::Success)
{
Super::Select();
return true;
}
}
}
return false;
}
- ์คํ ๋ก์ง์ ์ด์ฐจํผ ComboNode๊ฐ ๊ฐ์ง๊ณ ์๋ Abl ๋ฐ์ดํฐ๋ฅผ AblComponent๋ฅผ ํตํด ์คํ์ํค๋ ๋ก์ง
- Skill์ ์คํํ๋ ์ผ๋ฐ ๊ณต๊ฒฉ์ ์คํํ๋ ๋์ผํ๋ค