[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FEQ2F54CSHVVV9VSCCQ3PB":3,"skill-same:01M6FEQ2F54CSHVVV9VSCCQ3PB":48},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M6FEQ2F54CSHVVV9VSCCQ3PB","ue-cpp-foundations",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fquodsoler\u002Funreal-engine-skills\u002Fue-cpp-foundations\u002FSKILL.md",[],[18,19,20],"cpp","foundations","ue cpp foundations","2026-11-10 10:12:30",false,"# UE C++ Foundations\n\nYou are an expert in Unreal Engine's C++ extensions and property system.\n\n## Context\n\nRead `.agents\u002Fue-project-context.md` for engine version, coding conventions, and project-specific rules. Engine version matters: UE5 uses `TObjectPtr\u003C>` where UE4 used raw `UObject*`, and `GENERATED_BODY()` replaces `GENERATED_USTRUCT_BODY()` in structs.\n\n## Before You Start\n\nAsk which area the user needs help with if unclear:\n- **Macros & Reflection** — UCLASS, UPROPERTY, UFUNCTION, USTRUCT, UENUM\n- **Containers** — TArray, TMap, TSet, TOptional\n- **Delegates** — static, dynamic, multicast, binding patterns\n- **Strings** — FName, FString, FText conversion and formatting\n- **Memory & GC** — TObjectPtr, TWeakObjectPtr, TSharedPtr, GC roots\n- **Logging** — UE_LOG, log categories, verbosity\n- **Subsystems** — GameInstance, World, LocalPlayer subsystems\n\n---\n\n## UObject Macros & Reflection\n\nAll UE reflection macros require `GENERATED_BODY()` inside the class\u002Fstruct and the corresponding `.generated.h` include.\n\n### UCLASS()\n\n| Specifier | Effect |\n|-----------|--------|\n| `Blueprintable` | Blueprint subclassing allowed |\n| `BlueprintType` | Usable as Blueprint variable |\n| `Abstract` | Cannot be instantiated |\n| `NotBlueprintable` | Blocks Blueprint subclassing |\n| `Config=\u003CName>` | Loads UPROPERTY(Config) from `\u003CName>.ini` |\n| `Transient` | Not saved\u002Fserialized |\n| `Within=\u003COuterClass>` | Outer must be of given type |\n\n```cpp\nUCLASS(Blueprintable, BlueprintType)\nclass MYGAME_API UMyDataObject : public UObject\n{\n    GENERATED_BODY()\npublic:\n    UMyDataObject();\n};\n```\n\nFull specifier list: [references\u002Fproperty-specifiers.md](references\u002Fproperty-specifiers.md).\n\n### UPROPERTY()\n\n```cpp\nUCLASS(Blueprintable)\nclass MYGAME_API AMyCharacter : public ACharacter\n{\n    GENERATED_BODY()\npublic:\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"Stats\")\n    float MaxHealth = 100.f;\n\n    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=\"Stats\")\n    float CurrentHealth;\n\n    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category=\"Config\")\n    int32 MaxLevel = 50;\n\n    UPROPERTY(ReplicatedUsing=OnRep_Health, Category=\"Replication\")\n    float ReplicatedHealth;\n\n    UPROPERTY(Transient)                             \u002F\u002F Not serialized; GC still tracks\n    TObjectPtr\u003CUParticleSystemComponent> CachedFX;\n\n    UPROPERTY(SaveGame, BlueprintReadWrite, Category=\"Persistence\")\n    int32 PlayerScore;\n\n    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=\"Stats\",\n              meta=(ClampMin=\"0.0\", ClampMax=\"1.0\"))\n    float DamageMultiplier = 1.f;\n\n    UFUNCTION()\n    void OnRep_Health();\n\n    virtual void GetLifetimeReplicatedProps(\n        TArray\u003CFLifetimeProperty>& OutLifetimeProps) const override;\n};\n```\n\n### UFUNCTION()\n\n```cpp\nUFUNCTION(BlueprintCallable, Category=\"Actions\")\nvoid PerformAttack(float Damage);\n\nUFUNCTION(BlueprintPure, Category=\"Queries\")\nfloat GetHealthPercent() const;\n\nUFUNCTION(BlueprintNativeEvent, Category=\"Events\")  \u002F\u002F C++ provides _Implementation\nvoid OnDamageTaken(float Amount);\nvirtual void OnDamageTaken_Implementation(float Amount);\n\nUFUNCTION(BlueprintImplementableEvent, Category=\"Events\")  \u002F\u002F Blueprint must implement\nvoid OnLevelUp(int32 NewLevel);\n\nUFUNCTION(Server, Reliable, WithValidation)         \u002F\u002F RPC: runs on server\nvoid ServerFireWeapon(FVector Origin, FVector Direction);\nvoid ServerFireWeapon_Implementation(FVector Origin, FVector Direction);\nbool ServerFireWeapon_Validate(FVector Origin, FVector Direction);\n\nUFUNCTION(Client, Reliable)                        \u002F\u002F RPC: runs on owning client\nvoid ClientShowDamageNumber(float Amount);\nvoid ClientShowDamageNumber_Implementation(float Amount);\n\nUFUNCTION(NetMulticast, Reliable)                   \u002F\u002F RPC: runs on all\nvoid MulticastPlayEffect(FVector Location);\nvoid MulticastPlayEffect_Implementation(FVector Location);\n\nUFUNCTION(Exec)                                    \u002F\u002F Console command (~ in-game)\nvoid DebugResetStats();                            \u002F\u002F Works on PC, Pawn, HUD, GM, GI, CheatManager\n```\n\n### USTRUCT() and UENUM()\n\n```cpp\n\u002F\u002F UE5: always GENERATED_BODY() — never GENERATED_USTRUCT_BODY()\nUSTRUCT(BlueprintType)\nstruct MYGAME_API FWeaponStats\n{\n    GENERATED_BODY()\n    UPROPERTY(EditAnywhere, BlueprintReadWrite) float BaseDamage = 10.f;\n    UPROPERTY(EditAnywhere, BlueprintReadWrite) float FireRate   = 0.5f;\n};\n\n\u002F\u002F DataTable row\nUSTRUCT(BlueprintType)\nstruct MYGAME_API FEnemyTableRow : public FTableRowBase\n{\n    GENERATED_BODY()\n    UPROPERTY(EditAnywhere, BlueprintReadWrite) FName EnemyID;\n    UPROPERTY(EditAnywhere, BlueprintReadWrite) TSoftClassPtr\u003CAActor> SpawnClass;\n};\n\nUENUM(BlueprintType)\nenum class EWeaponState : uint8\n{\n    Idle      UMETA(DisplayName=\"Idle\"),\n    Firing    UMETA(DisplayName=\"Firing\"),\n    Reloading UMETA(DisplayName=\"Reloading\"),\n};\n```\n\n---\n\n## UE Containers\n\nSee [references\u002Fcontainer-patterns.md](references\u002Fcontainer-patterns.md) for full API and performance guide.\n\n### TArray — Ordered Dynamic Array\n\n```cpp\nTArray\u003CFString> Names;\nNames.Add(TEXT(\"Alpha\"));\nNames.Emplace(TEXT(\"Beta\"));       \u002F\u002F Construct in-place (avoids copy)\nNames.Reserve(100);                \u002F\u002F Pre-allocate\n\nFString First = Names[0];\nbool bHas     = Names.Contains(TEXT(\"Alpha\"));\nint32 Idx     = Names.Find(TEXT(\"Beta\"));  \u002F\u002F INDEX_NONE if absent\nFString* Ptr  = Names.FindByPredicate([](const FString& S){ return S.StartsWith(TEXT(\"A\")); });\n\nNames.Sort([](const FString& A, const FString& B){ return A.Len() \u003C B.Len(); });\nNames.Remove(TEXT(\"Alpha\"));       \u002F\u002F Order-preserving O(n)\nNames.RemoveAtSwap(0);             \u002F\u002F Fast O(1), destroys order\n\nfor (const FString& N : Names) { \u002F* do NOT add\u002Fremove during ranged-for *\u002F }\nfor (int32 i = Names.Num()-1; i >= 0; --i) { if (Names[i].IsEmpty()) Names.RemoveAt(i); }\n```\n\n### TMap — Hash Map\n\n```cpp\nTMap\u003CFName, int32> ItemCounts;\nItemCounts.Add(FName(\"Sword\"), 3);\n\nint32& Ref  = ItemCounts.FindOrAdd(FName(\"Sword\")); \u002F\u002F Insert default if absent\nint32* Ptr  = ItemCounts.Find(FName(\"Axe\"));        \u002F\u002F nullptr if absent\nbool   bHas = ItemCounts.Contains(FName(\"Shield\"));\nItemCounts.Remove(FName(\"Shield\"));\n\nfor (const TPair\u003CFName, int32>& Pair : ItemCounts) { \u002F* ... *\u002F }\n```\n\n### TSet — Hash Set\n\n```cpp\nTSet\u003CFName> Tags;\nTags.Add(FName(\"Flying\"));\nbool bFlying          = Tags.Contains(FName(\"Flying\"));\nTSet\u003CFName> Intersect = Tags.Intersect(OtherTags);\nTSet\u003CFName> Union     = Tags.Union(OtherTags);\n```\n\n### TOptional\n\n```cpp\nTOptional\u003Cfloat> MaybeHP;\nif (MaybeHP.IsSet()) { float H = MaybeHP.GetValue(); }\nfloat Safe = MaybeHP.Get(0.f);  \u002F\u002F Default if not set\nMaybeHP = 75.f;\nMaybeHP.Reset();\n```\n\n### TVariant\n\n```cpp\n\u002F\u002F Type-safe tagged union — avoids unsafe casts\nTVariant\u003Cint32, float, FString> Value;\nValue.Set\u003CFString>(TEXT(\"Hello\"));\n\nif (Value.IsType\u003CFString>())\n{\n    const FString& Str = Value.Get\u003CFString>();\n}\n\n\u002F\u002F Visit — use explicit overloads; LexToString(V) fails when V is FString.\nVisit(TOverloaded{\n    [](int32  V) { UE_LOG(LogTemp, Log, TEXT(\"%d\"), V); },\n    [](float  V) { UE_LOG(LogTemp, Log, TEXT(\"%f\"), V); },\n    [](const FString& V) { UE_LOG(LogTemp, Log, TEXT(\"%s\"), *V); },\n}, Value);\n```\n\n---\n\n## Delegates\n\nSee [references\u002Fdelegate-patterns.md](references\u002Fdelegate-patterns.md) for all declaration macros and binding methods.\n\n### Choosing the Right Type\n\n| Type | Bindings | Blueprint | When to Use |\n|------|----------|-----------|-------------|\n| `DECLARE_DELEGATE` | 1 | No | Internal single-owner callback |\n| `DECLARE_MULTICAST_DELEGATE` | N | No | Internal multi-listener events |\n| `DECLARE_DYNAMIC_DELEGATE` | 1 | Yes | Blueprint-assignable single callback |\n| `DECLARE_DYNAMIC_MULTICAST_DELEGATE` | N | Yes | Blueprint-bindable events (most common) |\n\n### Declaration, Binding, Invocation\n\n```cpp\n\u002F\u002F File scope (before UCLASS)\nDECLARE_DELEGATE_OneParam(FOnItemPickedUp, AActor*);\nDECLARE_MULTICAST_DELEGATE_TwoParams(FOnHealthChanged, float, float);\nDECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnHealthChangedDynamic, float, CurrentHealth, float, MaxHealth);\n\nUCLASS()\nclass AMyActor : public AActor\n{\n    GENERATED_BODY()\npublic:\n    UPROPERTY(BlueprintAssignable, Category=\"Events\")\n    FOnHealthChangedDynamic OnHealthChanged;   \u002F\u002F Dynamic multicast in UPROPERTY\n};\n\n\u002F\u002F Static single delegate\nFOnItemPickedUp D;\nD.BindUObject(this, &AMyCharacter::HandlePickup);\nD.BindLambda([this](AActor* Item){ UE_LOG(LogTemp, Log, TEXT(\"%s\"), *Item->GetName()); });\nD.ExecuteIfBound(SomeActor);\n\u002F\u002F Multicast: add\u002Fbroadcast\u002Fremove\nFDelegateHandle H = HealthDelegate.AddUObject(this, &AMyHUD::OnHealthChanged);\nHealthDelegate.Broadcast(75.f, 100.f);\nHealthDelegate.Remove(H);\n\u002F\u002F Dynamic multicast\nOnHealthChanged.AddDynamic(this, &AMyCharacter::HandleHealthChange);\nOnHealthChanged.RemoveDynamic(this, &AMyCharacter::HandleHealthChange);\nOnHealthChanged.Broadcast(75.f, 100.f);\n```\n\n---\n\n## String Types\n\n| Type | Use For | Comparison | Mutable |\n|------|---------|-----------|---------|\n| `FName` | Identifiers, asset names, tags | O(1) integer | No |\n| `FString` | General-purpose strings, file paths | O(n) | Yes |\n| `FText` | Player-visible display strings | — | No |\n\n```cpp\n\u002F\u002F FName — global name table, case-insensitive O(1) compare\nFName Tag(\"WeaponTag_Rifle\");\nFString S = Tag.ToString();\nFName  N  = FName(*S);\n\n\u002F\u002F FString — heap string, Printf for formatting\nFString Msg = FString::Printf(TEXT(\"HP: %.1f\"), Health);\nUE_LOG(LogTemp, Log, TEXT(\"%s\"), *Msg);  \u002F\u002F * dereferences to TCHAR*\nint32 Num = FCString::Atoi(*FString(\"42\"));\n\n\u002F\u002F FText — localized display text\n\u002F\u002F LOCTEXT requires a namespace defined in the same translation unit:\n#define LOCTEXT_NAMESPACE \"MyGame\"\nFText Label = LOCTEXT(\"Key\", \"Assault Rifle\");\nFText Fmt   = FText::Format(LOCTEXT(\"HP\", \"HP: {0}\u002F{1}\"),\n                             FText::AsNumber(Cur), FText::AsNumber(Max));\n#undef LOCTEXT_NAMESPACE  \u002F\u002F Or: NSLOCTEXT(\"MyGame\", \"Key\", \"...\") without a define\n```\n\n**Conversion:** `Name.ToString()` → FString, `FName(*Str)` ← FString, `FText::FromString(Str)`, `Text.ToString()`.\n\n---\n\n## Memory & Garbage Collection\n\nUE's GC tracks every `UObject*` reachable from a root. Unreachable objects are destroyed.\n\n```cpp\n\u002F\u002F UE5: TObjectPtr\u003C> for UPROPERTY member UObject pointers\nUPROPERTY()\nTObjectPtr\u003CUStaticMeshComponent> MeshComp;       \u002F\u002F GC-tracked, lazy-load aware\n\u002F\u002F Without UPROPERTY — invisible to GC, pointer may dangle\nUMyObject* UnsafePtr;  \u002F\u002F BAD\n\u002F\u002F TWeakObjectPtr — non-owning, safe (becomes null after GC)\nTWeakObjectPtr\u003CAMyActor> WeakRef;\nif (WeakRef.IsValid()) { WeakRef->DoSomething(); }\n\u002F\u002F TSharedPtr\u002FTWeakPtr — for non-UObject plain C++ types ONLY\nTSharedPtr\u003CFMyData> Data = MakeShared\u003CFMyData>();\nTWeakPtr\u003CFMyData>   Weak = Data;\nif (TSharedPtr\u003CFMyData> Pinned = Weak.Pin()) { Pinned->Process(); }\n\u002F\u002F NEVER use TSharedPtr for UObject-derived types\n\u002F\u002F GC root: AddToRoot (use sparingly)\nUMyObject* Obj = NewObject\u003CUMyObject>();\nObj->AddToRoot();\n\u002F\u002F ...\nObj->RemoveFromRoot();\n\u002F\u002F FGCObject: preferred for non-UObject C++ classes holding UObject refs\n\u002F\u002F UE 5.3+: use TObjectPtr\u003C> — raw UObject* crashes with incremental GC.\nclass FMyManager : public FGCObject\n{\npublic:\n    virtual void AddReferencedObjects(FReferenceCollector& Collector) override\n    {\n        Collector.AddReferencedObject(ManagedObject);\n    }\n    virtual FString GetReferencerName() const override { return TEXT(\"FMyManager\"); }\nprivate:\n    TObjectPtr\u003CUMyObject> ManagedObject = nullptr;\n};\n```\n\n---\n\n## Logging\n\n```cpp\n\u002F\u002F MyGameLog.h \u002F .cpp\nDECLARE_LOG_CATEGORY_EXTERN(LogMyGame, Log, All);\nDEFINE_LOG_CATEGORY(LogMyGame);\n\n\u002F\u002F Single-file: DEFINE_LOG_CATEGORY_STATIC(LogLocal, Log, All);\n\nUE_LOG(LogMyGame, Log,     TEXT(\"Loaded: %s\"), *LevelName);\nUE_LOG(LogMyGame, Warning, TEXT(\"HP low: %.1f\"), Health);\nUE_LOG(LogMyGame, Error,   TEXT(\"Spawn failed: %s\"), *ClassName);\nUE_CLOG(Health \u003C 0.f, LogMyGame, Error, TEXT(\"Negative HP: %.1f\"), Health);\n```\n\n| Verbosity | Visible | When |\n|-----------|---------|------|\n| `Fatal` | Always | Crash-level |\n| `Error` | Always | Operation failed |\n| `Warning` | Always | Unexpected but recoverable |\n| `Log` | Non-shipping | Standard trace |\n| `Verbose` | `-LogCmds` | Fine-grained trace |\n\n---\n\n## Subsystems\n\nAuto-registered singletons — no manual `AddToRoot` needed.\n\n| Subsystem | Owner | Persists Level Load | Per Player |\n|-----------|-------|---------------------|------------|\n| `UGameInstanceSubsystem` | `UGameInstance` | Yes | No |\n| `UWorldSubsystem` | `UWorld` | No | No |\n| `ULocalPlayerSubsystem` | `ULocalPlayer` | Yes | Yes |\n| `UEngineSubsystem` | `UEngine` | Yes (whole session) | No |\n\n```cpp\nUCLASS()\nclass MYGAME_API UInventorySubsystem : public UGameInstanceSubsystem\n{\n    GENERATED_BODY()\npublic:\n    virtual void Initialize(FSubsystemCollectionBase& Collection) override;\n    virtual void Deinitialize() override;\n\n    UFUNCTION(BlueprintCallable) void AddItem(FName ItemID, int32 Count);\nprivate:\n    TMap\u003CFName, int32> Inventory;\n};\n\n\u002F\u002F Access — each subsystem type has a different accessor\nUInventorySubsystem* Inv = GetGameInstance()->GetSubsystem\u003CUInventorySubsystem>();\nUSpawnSubsystem*     Sp  = GetWorld()->GetSubsystem\u003CUSpawnSubsystem>();\nUUIStateSubsystem*   UI  = GetLocalPlayer()->GetSubsystem\u003CUUIStateSubsystem>();\nUMyEngineSubsystem*  ES  = GEngine->GetEngineSubsystem\u003CUMyEngineSubsystem>();\n```\n\nSubsystems have `Initialize()` and `Deinitialize()` -- override for setup\u002Fteardown. `UGameInstanceSubsystem` persists across map changes; `UWorldSubsystem` reinitializes per world. Call `GetSubsystem\u003CT>()` via the owning context (`GetGameInstance()`, `GetWorld()`, `GetLocalPlayer()`).\n\n---\n\n## Replicated Properties\n\nBoth `UPROPERTY` specifier AND `GetLifetimeReplicatedProps` are required:\n\n```cpp\nUPROPERTY(ReplicatedUsing = OnRep_Health)\nfloat Health;\n\nUFUNCTION()\nvoid OnRep_Health(); \u002F\u002F Called on clients when server updates Health\n\nvoid AMyActor::GetLifetimeReplicatedProps(TArray\u003CFLifetimeProperty>& OutProps) const\n{\n    Super::GetLifetimeReplicatedProps(OutProps);\n    DOREPLIFETIME_CONDITION(AMyActor, Health, COND_OwnerOnly);\n    \u002F\u002F COND_None, COND_OwnerOnly, COND_SkipOwner, COND_SimulatedOnly, COND_InitialOnly\n}\n```\n\n---\n\n## Conditional Compilation Guards\n\n```cpp\n#if WITH_EDITOR\n\u002F\u002F Editor-only properties — stripped from shipping builds\nUPROPERTY(EditAnywhere, Category=\"Debug\")\nbool bShowDebugSpheres = false;\n\nvirtual void PostEditChangeProperty(FPropertyChangedEvent& E) override;\n#endif\n\n#if !UE_BUILD_SHIPPING\n\u002F\u002F Available in Development + Debug, stripped from Shipping\nvoid DrawDebugInfo();\n#endif\n```\n\n---\n\n## Common Mistakes\n\n**Raw UObject* member without UPROPERTY — dangling pointer:**\n```cpp\nUMyObject* Obj;  \u002F\u002F BAD — GC invisible\nUPROPERTY() TObjectPtr\u003CUMyObject> Obj;  \u002F\u002F GOOD\n```\n\n**Modify TArray during ranged-for — undefined behavior:**\n```cpp\nfor (const AActor* A : Actors) { Actors.Remove(A); }  \u002F\u002F CRASH\nfor (int32 i = Actors.Num()-1; i >= 0; --i) { if (ShouldRemove(Actors[i])) Actors.RemoveAt(i); }\n```\n\n**TSharedPtr on a UObject — GC + refcount conflict:**\n```cpp\nTSharedPtr\u003CUMyObject> P = MakeShared\u003CUMyObject>();  \u002F\u002F BAD — leaks or double-free\nUPROPERTY() TObjectPtr\u003CUMyObject> P;                 \u002F\u002F GOOD\n```\n\n**Missing GetLifetimeReplicatedProps:**\n```cpp\nvoid AMyActor::GetLifetimeReplicatedProps(TArray\u003CFLifetimeProperty>& OutLifetimeProps) const\n{\n    Super::GetLifetimeReplicatedProps(OutLifetimeProps);\n    DOREPLIFETIME(AMyActor, ReplicatedHealth);\n    DOREPLIFETIME_CONDITION(AMyActor, TeamScore, COND_OwnerOnly);\n}\n```\n\n**GENERATED_USTRUCT_BODY() in UE5 structs — use GENERATED_BODY() instead.**\n\n**AddDynamic with a non-UFUNCTION — compile error or crash at runtime.**\n\n---\n\n## Related Skills\n\n- **ue-module-build-system** — Build.cs, module dependencies, include paths, PCH configuration\n- **ue-actor-component-architecture** — AActor\u002FUActorComponent lifecycle, spawning, tick groups, component setup\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fquodsoler\u002Funreal-engine-skills\u002Fue-cpp-foundations",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill ue-cpp-foundations",{"tool":40,"command":41},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill ue-cpp-foundations",{"tool":43,"command":44},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill ue-cpp-foundations","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fquodsoler\u002Funreal-engine-skills\u002Fue-cpp-foundations\u002FSKILL.md",true,[],[49,63,73,82,88,95],{"skillNo":50,"name":51,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":59,"publishedAt":21},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[54],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[60,61,62],"model","model hierarchy","model hierarchy skill",{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":69,"publishedAt":21},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[68],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[70,71,72],"MCP","zoom","zoom mcp",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":21},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[79,80,81,71],"sdk","zoom apps sdk","apps",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":21},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[84],{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":21},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[93],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[90],{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":21},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[97]]