ãUE5ãåãæãå»ãã§åãæªæ¥ä¿¡ããŠããµãã...ãããã°ã¬ã¹ãããŒã§ããã«ãŒããäœã£ãŠã¿ããã60åç®ã
â
ä»åãã£ãããš
ã»ããã«ãŒãå®è£
ããïŒïŒïŒ
ããã°ãã¯ãããŸãããã§ãïŒ
ã«ãŒãã²ãŒã ã®ãããæ§ç¯ã«ãããŠã
ã«ãŒãã®ã³ã¹ããã©ã³ã¹ã¯çåœç·ã§ãããã
ãšããããšã§ä»åã¯ãååäœæãããããç·šéæ©èœãçºå±ãããŠã
ãå ¥ããã«ãŒãã®ã³ã¹ã垯ãäžç®ã§ç¢ºèªã§ããããã«ãŒãã
ãå®è£ ããŸããïŒð
âŒååã®éçºèšäºã¯ãã¡ã
ä»åã¯UE䜿ãåãã«è§£èª¬ãå ¥ããŠã¿ãŸããïŒïŒãããããã£ããããããªããðââïžïŒ
TCGïŒãã¬ãŒãã£ã³ã°ã«ãŒãã²ãŒã ïŒããããã°ããšå¢ããç»é¢ããµã¯ããšç޹ä»ãããŠããã ããŸãð
ïŒïŒããã«ãŒãã£ãŠäœïŒ
ç°¡åã«èšããšããããã«å
¥ããã«ãŒãã®ãæ¶è²»ã³ã¹ãïŒããïŒããã
ã©ã®ãããªå²åã§ååžããŠããããäžç®ã§ç¢ºèªã§ããã°ã©ãã®ããšã§ãã
MTGããã¥ãšã«ã»ãã¹ã¿ãŒãºãªã©ã
å€ãã®ã«ãŒãã²ãŒã ãéãã ããšãããæ¹ãªããåç¥ã®éãã
匷åãªã«ãŒãã»ã©çºåã«å¿
èŠãªçæïŒããïŒãå€ããªããŸãã

ãã¡ããããHorizonNotesããåºæ¬çã«ã¯ãã®ã«ãŒã«ã«åã£ãŠããŸãã
ããã«æ¬äœã§ã¯ãã倿ãããšãŒãã«ïŒããïŒããã®ãŸãŸäŸçµŠã§ããããšããç¬èªã®ã·ã¹ãã ãããããã
ä»ã®TCG以äžã«ããã®ããç¹°ãã»ç®¡çãè¶
éèŠã«ãªã£ãŠããŸãã
ããããçµããšãã«ã
ã倿çšã«éãã³ã¹ãã®ã«ãŒãããããããå ¥ããŠãããšã¯å°åããå©ãããã«è»œãã«ãŒããå€ãã«ããŠâŠã
ãšãã£ãæŠç¥çãªãã©ã³ã¹èª¿æŽãçŽæçã«è¡ããããã«ããããã«ã
ãã®ããã«ãŒãç»é¢ã絶察ã«å¿
èŠã ã£ãããã§ãïŒ
2.C++ã§ãããå ã®åã³ã¹ãã®ååžãååŸãã
ãŸãã¯ãç·šéäžã®ãããå
ã«ãã©ã®ã³ã¹ãã®ã«ãŒããäœæãããã
ãèšç®ããŠååŸãã颿°ãäœæããŸãã
ð¡ã©ãããŠãC++ã§äœãã®ïŒ
UEã䜿ã£ãŠããæ¹ã®äžã«ã¯ã
ããªãã§ããããBPïŒãã«ãŒããªã³ãïŒãããªããŠäžããC++ã§äœã£ãŠãã®ïŒã
ãšçåã«æãæ¹ãããã£ããããããããŸããã
ç§ã¯åºæ¬çã«ã
ãåãæ±ãããŒã¿ã®çš®é¡ãããåŠçã®è€éããã«ãã£ãŠC++ãšBPã䜿ãåããããã«ããŠããŸãã
ä»åéèšãããã¹ãã«ã«ãŒãã®æ å ±ãã¯ã
ããšããšC++ã§å®çŸ©ããæ§é äœãPDAïŒãã©ã€ããªããŒã¿ã¢ã»ããïŒã®äžã«æ ŒçŽãããŠããŸãã
ãããããããBPåŽã«äžã€ãã€åŒã£åŒµãåºããŠåŠçãããããã
ããŒã¿ã®å€§å ãããC++åŽã§äžæ°ã«èšç®ããŠããŸã£ãæ¹ãã
ããžãã¯ãšããŠå§åçã«ã¹ããŒãã§ããã
åŠçã¹ããŒããæ®µéãã«éããªããšãã寞æ³ã§ãã

ã¹ããã1ïŒéèšçšæ§é äœïŒStructïŒã®å®çŸ©
ãŸãã¯ãC++ã§éèšããããŒã¿ããã«ãŒããªã³ãïŒUIïŒãžæž¡ãããã®ãç®±ããäœããŸãã
ïŒä»åãC++ã®ã³ãŒãäœæèªäœã¯ã
Geminiå
çãClaudeããã«ãé¡ãããŠããŸãã
ç§ã¯ãããŸã§äžèº«ããã§ãã¯ãããã£ã¬ã¯ã¿ãŒä¿ã§ãðïŒ
ããã§å€§äºãªãã€ã³ãããé åã®èŠçŽ æ°ãã§ãã
ä»åã®UIã§ã¯ãã0, 1, 2, 3, 4, 5, 6以äžããšããããã®ã³ã¹ãåž¯ã®ææ°ãåå¥ã«èšç®ããŠã°ã©ãåããã®ãç®çã§ãã
å
šéšã§7ã€ã®æ®µéã«åãããŠããããã
é
åã®æ°ã¯ã7ãã§åºå®ããŠãããŸãã
ãããããããã·ã¹ãã ãåžãC++ã®ããããŒãã¡ã€ã«ã«è¿œå ããŸãã
C++
// DeckBuildLibrary.h ã«è¿œå
USTRUCT(BlueprintType)
struct FDeckAnalytics
{
GENERATED_BODY()
// ã³ã¹ã垯ããšã®ææ°ïŒIndex 0 = 0ã³ã¹ã, Index 6 = 6ã³ã¹ã以äžïŒ
UPROPERTY(BlueprintReadWrite, Category = "Analytics")
TArray<int32> ManaCurve;
// ã¯ã©ã¹ïŒã¿ã°ïŒããšã®ææ°
UPROPERTY(BlueprintReadWrite, Category = "Analytics")
TMap<FGameplayTag, int32> ClassDistribution;
FDeckAnalytics()
{
// 0ã³ã¹ãã6ã³ã¹ã以äžã®ã7段éããšããŠåæå
ManaCurve.Init(0, 7);
}
};
ã¹ããã2ïŒéèšé¢æ°ã®å®çŸ©ãšå®è£
次ã«ããããæ å ±ãåãåã£ãŠéèšçµæãè¿ã颿° CalculateDeckAnalytics ãäœããŸãã
ãã®é¢æ°ã¯ãå ã»ã©äœã£ã FDeckAnalytics åã®ããŒã¿ãšããŠçµæãè¿ããŠãããŸãã
ããããå ã»ã©åæ§ããããŒãã¡ã€ã«ïŒå ¥ãç©ïŒã«è¿œå ããŸãã
ð¡ ã¡ãã£ãšè§£èª¬ïŒåïŒTypeïŒã£ãŠäœïŒ
ããã°ã©ã ã®äžçã§ã¯ãããŒã¿ã®çš®é¡ïŒåïŒããã£ã¡ã決ããå¿ èŠããããŸãã
ã»æŽæ°ïŒIntïŒïŒ
æ°åãšããŠæ±ãã®ã§ãè¶³ãç®ãåŒãç®ãªã©ã®èšç®ãã§ããïŒ
ã»æååïŒStringïŒïŒ
æåãšããŠæ±ãã®ã§ãç»é¢ã«è¡šç€ºãããæç« ãç¹ãããã§ããïŒ
æååã§ã1ããšå ¥åããŠãèšç®ã¯ã§ããŸãããã
æŽæ°ã®ç®±ã«ããããšããæåãå ¥ãããšãšã©ãŒã«ãªã£ãŠããŸããŸãã
ä»åã®ãã€ã³ãã¯ãå ã»ã©èªåã§äœã£ã DeckAnalytics ãšããæ§é äœãããªãªãžãã«ã®åããšããŠäœ¿ã£ãŠãããšããã§ãïŒ
ïŒâ»UEã®C++ã«ãŒã«ã«åŸã£ãŠãé ã«ãFããã€ã㊠FDeckAnalytics ãšåŒãã§ããŸãïŒ

ãã©ã¡ããã坿ãð
C++
/** ãããå
ã®ããã«ãŒããšã¯ã©ã¹ååžãéèšããŠè¿ããŸã */
UFUNCTION(BlueprintCallable, Category = "DeckBuild|Analytics")
static FDeckAnalytics CalculateDeckAnalytics(const FPlayerDeck& Deck);
STEP 3 : ãœãŒã¹ãã¡ã€ã« (DeckBuildLibrary.cpp) ã®å®è£
å ¥ãç©ãåºæ¥ãã®ã§ã次ã¯ããããå®éã«åããéšåïŒãœãŒã¹ãã¡ã€ã«ïŒãäœæããŸãã
现ããéšåããã¹ãŠè§£èª¬ãããšå€§å€ãªã®ã§âŠ
ä»åã¯äžçªã®ãã€ã³ãã¯
FMath::Clamp ã䜿ã£ãŠãã³ã¹ã6以äžããã²ãšãŸãšãã«ããŠããç¹ã§ãã
ð¡ãããããFMath::Clampã£ãŠäœïŒ
æ°å€ããæå®ããç¯å²å ãã«åŒ·å¶çã«åããŠããã䟿å©ãªæ©èœïŒé¢æ°ïŒã§ãã
ä»åã¯ãã³ã¹ãã6以äžã®ã«ãŒãã¯äžåŸã§åãã6ïŒãã®æ ãšããŠèšç®ããããã«ããŠããŸãã
ïŒã³ã¹ã7ã8ã9âŠãšã°ã©ãã®æ ãäœãç¶ãããšã
ç»é¢ãããããã£ãŠãè¶³ããªãã§ããããã¬ã€ã€ãŒãçŽæçã«èŠã¥ãããªã£ãŠããŸããŸãð ïŒ
ãã®ãããããã§äºããæå€§ã§ã6ãšããŠæ±ãããšå¶éããããŠãããŸãã
ããããã°å®éã«åãæ±ãããŒã¿ããŽã£ãã7çš®é¡ïŒ0ã6ïŒã«éå®ãããã®ã§ã
åŸããUIã«è¡šç€ºããåŠçãæ Œæ®µã«æ¥œã«ãªããŸãã

C++
#include "Utility/HorizonGameplayTags.h"
FDeckAnalytics UDeckBuildLibrary::CalculateDeckAnalytics(const FPlayerDeck& Deck)
{
FDeckAnalytics Analytics;
UAssetManager* AssetManager = UAssetManager::GetIfInitialized();
if (!AssetManager)
{
return Analytics;
}
for (const auto& Pair : Deck.SpellCardList)
{
FName CardID = Pair.Key;
int32 CardCount = Pair.Value;
FPrimaryAssetId AssetId(FPrimaryAssetType(TEXT("SpellCard")), CardID);
// äºåããŒãæžã¿ãªã®ã§ TryLoad ã§é«éã«ååŸ
if (UObject* LoadedObj = AssetManager->GetPrimaryAssetPath(AssetId).TryLoad())
{
if (USpellCardDataAsset* PDA = Cast<USpellCardDataAsset>(LoadedObj))
{
// ---------------------------------------------
// 1. ããã«ãŒãã®éèš
// ---------------------------------------------
int32 BaseCost = 0;
for (const FDataTableRowHandle& Handle : PDA->Data.CostTypeHandles)
{
if (Handle.IsNull()) continue;
FCardCost* Row = Handle.GetRow<FCardCost>(TEXT("AnalyticsCostLookup"));
if (Row && Row->ResourceTag == HorizonTags::Stat_Cost)
{
BaseCost = Row->Amount;
break;
}
}
// ã³ã¹ãã6以äžã®å Žåã¯ãã¹ãŠIndex 6ïŒäžéïŒã«ãŸãšãã
int32 CostIndex = FMath::Clamp(BaseCost, 0, 6);
Analytics.ManaCurve[CostIndex] += CardCount;
// ---------------------------------------------
// 2. ã¯ã©ã¹ååžã®éèš
// ---------------------------------------------
if (PDA->Data.RequiredClasses.IsEmpty())
{
Analytics.ClassDistribution.FindOrAdd(HorizonTags::Class_Neutral) += CardCount;
}
else
{
for (const FGameplayTag& ClassTag : PDA->Data.RequiredClasses)
{
Analytics.ClassDistribution.FindOrAdd(ClassTag) += CardCount;
}
}
}
}
}
return Analytics;
}
ããã§C++åŽã®æºåã¯å®äºã§ãã
3.BPåŽã§ååŸããããã«ãŒããããã°ã¬ã¹ããŒã«åæ ããã
C++ã®ã³ã³ãã€ã«ãæåãããã
ãããç·šæç»é¢ã®ãŠã£ãžã§ãããéããŸãã
ããã§ãä»åã®äž»åœ¹ã«ãªãä»åã®äž»åœ¹ã«ãªããããã°ã¬ã¹ããŒããšããUIããŒãã«ã€ããŠãã¡ãã£ãšããè£è¶³ãããŸãã

ð¡ããã°ã¬ã¹ããŒã£ãŠäœïŒ
ãã£ããèšããšãäžèº«ãäžäžãããæ£ã°ã©ãïŒã²ãŒãžïŒãã§ãã
UEã§ã¯ããã®ã²ãŒãžã®äŒžã³å ·åã
ãFloatïŒæµ®åå°æ°ç¹æ°ïŒå°æ°ã®ããŒã¿ïŒãã䜿ã£ãŠå¶åŸ¡ããŸãã
å ·äœçã«ã¯ã
æå°å€ã 0.0 (0%)ãæå€§å€ã 1.0 (100%) ãšããŠå€ãå ¥åããŸãã
â å€ã0.0ã®å ŽåïŒç©ºã£ãœïŒ

â å€ã0.5ã®å ŽåïŒã¡ããã©ååïŒ

STEP1 : ããã°ã¬ã¹ããŒãææ°è¡šç€ºã®ããã¹ããé åãšããŠã»ãããã
ãŸãã¯ãç»é¢ã«é
眮ãã7ã€ã®ããã°ã¬ã¹ããŒãšã
ææ°ã衚瀺ããããã¹ããããããããé
å倿°ãã«ãŸãšããŠæ ŒçŽããæºåãããŸãã
ïŒããã¯ãåŸã®åŠçãå¹ççã«è¡ãçºã§ããïŒ
â .é å倿°ãçšæãã
倿°å: ManaCurveBars (å: ProgressBar ã®ãªããžã§ã¯ãåç § / é åã«ãã)
倿°å: ManaCurveTexts (å: ããã¹ã ã®ãªããžã§ã¯ãåç § / é åã«ãã)

â¡.Event ConstructïŒåæåïŒã§ã®ç»é²
Event ConstructïŒãŠã£ãžã§ãããç»é¢ã«è¡šç€ºãããæã«æåã«åŒã°ããåŠçïŒã« Make ArrayïŒé åã®äœæïŒ ããŒããç¹ããŸãã
ããã§å ã»ã©é 眮ããUIããŒããé çªïŒ0ã³ã¹ãã6ã³ã¹ã以äžïŒã«ãã³ã«ç¹ããäœæããé å倿°ã«ã»ããããŠãããŸãã

STEP2 : æŽæ°çšé¢æ°ïŒUpdateManaCurveUIïŒã®å®è£
次ã«ãC++ããæ§é äœïŒFDeckAnalyticsïŒãåãåã£ãããšã®åŠçãBPã«æžããŠãããŸãã
å šäœåã¯ãã£ãããããªæãã§ããïŒã¡ãã£ãšãããããâŠïŒ
æ§é äœãBreak(åè§£)ãã
ManaCurveé åãã Max (Int Array) ããŒããç¹ãã§ã
äžçªææ°ãå€ãã³ã¹ã垯ã®ãæå€§å€ïŒMaxïŒããååŸããŸããBranchã§ãMax > 0ãããå€å®ããŸã
ïŒãããã0æã®ãšãã®ããšã©ãŒããåé¿ããããã§ãïŒãTrueãªããäºåã«çšæãã ManaCurveBarsïŒããã°ã¬ã¹ããŒã®é åïŒ ã«å¯Ÿã㊠For Each Loop ãåããŸãã
ãã«ãŒãå ã§è¡ãæŽæ°åŠçã
ããã°ã¬ã¹ããŒã®æŽæ°ïŒ
ManaCurve é åããçŸåšã® Index ã§ææ°ãååŸããŠFloatã«å€æã
ãããæå€§å€ïŒMaxïŒã§å²ãç®ãã
ãã®çµæã ProgressBar ã® Set Percent ã«ç¹ããŸããããã¹ãã®æŽæ°ïŒ
ManaCurveTexts é åãã察象ã®ããã¹ããåŒã£åŒµãåºãã
Set Text ã«ææ°ãæž¡ããŠè¡šç€ºãæŽæ°ããŸãã

ããã§ã®äžçªã®å·¥å€«ã¯ãå²åïŒPercentïŒã®èšç®ãã§ãã
ãŸããManaCurveé åã®äžãããäžçªææ°ãå€ãã³ã¹ã垯ïŒMaxïŒããèŠã€ããŸãã
ãããŠãåã³ã¹ãã®ææ°ããã®Maxã§å²ãç®ããŸãã
ããããããšã§ã
ãäžçªææ°ãå€ãã³ã¹ãã®ã²ãŒãžããŽã£ãã1.0ïŒ100%ïŒãã«ãªãã
ä»ã®ã³ã¹ã垯ãããã«åãããŠç¶ºéºãªå±±ãªãã®ã°ã©ãã«ãªã£ãŠãããŸãã
ð¡ä»æ¥ã®ãã€ã©ã€ãïŒããã°ã¬ã¹ããŒã®æäœã«ã¯ãSet PercentãïŒ
ããã°ã¬ã¹ããŒã®ã²ãŒãžãåããæã¯ãSet Percent ããŒãã䜿ããŸãã
æäœãããããã°ã¬ã¹ããŒãã¿ãŒã²ããã«ç¹ãã
In Percent ã®ãã³ã« FloatïŒ0.0ã1.0ã®å°æ°ïŒãæž¡ããŠãããããšã§ã
ã²ãŒãžã®é·ããèªç±ã«æäœããããšãã§ããŸãïŒ
STEP3ïŒæŽæ°çšã«ã¹ã¿ã ã€ãã³ããäœã£ãŠå®æïŒ
ããããæåŸã®ä»äžãã§ãã
ãããŸã§äœã£ãæ©èœãã¬ããã£ã³ã³ããŸãã

åé ã§äœæããC++ã®éèšããŒããåŒã³åºããŠã
ãã®çµæãå
ã»ã©ã®UIæŽæ°ããŒãã«ç¹ãã ãã
ããšã¯ããã®ã€ãã³ããããããã«ã«ãŒãã远å ã»åé€ããæãã«åŒã°ããããã«éã«æãã§ãããã°âŠâŠ
ã«ãŒããåºãå
¥ããããã³ã«ã¬ãã¬ãåããããã«ãŒãUIã®å®æã§ãð
ãã¹ãå®è¡
ããã§ã¯ãæ©éå®è¡ããŠã¿ãŸãã
â çµæã¯âŠ
ãããäžæãè¡ããŸãããð
ææ°ã«å¿ããŠããã¹ããããŒãå€ãã£ãŠãããŠããããšã確èªã§ããŸããã
ããã§ãããã«ãŒãã®å®è£ å®äºã§ãðð
ããšã¯ãã¯ã©ã¹ããšã®ææ°ãã衚瀺ãããããã«ããããšããã§ããâŠâŠ
å®è£
æé ã¯ä»åã®ããã«ãŒããšã»ãŒåãã«ãªãã¯ããªã®ã§ã
ãã¡ãã¯è£ã§ãµã¯ããšãã£ãŠãããŸãïŒ
ãŸãšã
ä»åã¯ããã«ãŒãã®å®è£ ããå±ãããŸãããããããã§ãããïŒ
ã°ã©ããåããšããããç·šæç»é¢ãäžæ°ã«æ¬æ Œçã«ãªã£ãŠããŸãããã
ãŸã ãŸã 现ãã調æŽã¯å¿
èŠã§ããã
å人çã«ãé èª¿ãªæå¿ããæããŠããŸãð
次åã¯ããããããããã®ä¿åã»ããŒãåŠçãïŒ
âŠâŠãšè¡ããããšãããªã®ã§ããã
ãŸãã¯ä»ã®ç»é¢ã®æäœæãªã©ãè£ã§ãã£ããä»äžããããšæããŸãã
ãã®ãããã·ã¹ãã éçºã®ãã°ã¯å°ããäŒã¿ããŠã
次ããã¯äŸã®
ãnoteã®çãããšäžç·ã«ã²ãŒã ãäœã£ãŠããäŒç»ã
ã®èšäºãã¡ã€ã³ã«ãå±ãããŠããäºå®ã§ãïŒ
çãããšã¯ã€ã¯ã€é²ããäŒç»ããã²ãæåŸ ãã ããïŒ
ãããã®èšäºããåèã«ãªã£ãããéçºã®èŠåŽãäŒãã£ãïŒããç¶ããæ°ã«ãªãïŒããšæã£ããã
èšäºã®äžã«ãããã¹ãïŒããŒãããŒã¯ïŒããæŒããŠããã ãããšå¬ããã§ãïŒ
çæ§ã®å¿æŽããããæ¯æ¥ã®éçºãšæŽæ°ã®äœããã®å±ã¿ã«ãªããŸãã
æåŸãŸã§ãèªã¿ããã ããããããšãããããŸããïŒ
ãŸã次åã®èšäºã§ãäŒãããŸãããïŒ
#ããã°ã¬ã¹ã㌠#UIãã¶ã€ã³ #ããŒã¿é§å #ã«ãŒãã²ãŒã #ãããæ§ç¯å #HorizonNotes
ãããªãšæã£ããå¿æŽãããïŒ
ãããããã°å¿æŽãé¡ãããŸãïŒ
ããã ãããããã¯ã¯ãªãšã€ã¿ãŒãšããŠã®ã²ãŒã éçºã«äœ¿ãããŠããã ããŸãïŒ
â»ããããšå
±ã«ãã£ãŠæ¬²ããäºããã£ããèšã£ãŠãã ããïŒ
å¯èœãªç¯å²ã§ããã°é 匵ããŸã