Core types & containers
Unreal ships its own containers, string types, and math types. Use them, not std:::
they integrate with UObject reflection, serialization, allocators, and garbage collection.
Mixing in std::string or std::vector causes friction and these types won't serialize
or reflect correctly.
When to use this skill
- Storing collections: choose
TArray/TMap/TSet over std::vector/std::map/std::set.
- String work: pick
FString (mutable), FName (identifier), or FText (user-facing / localized).
- 3D math:
FVector, FRotator, FQuat, FTransform, and FMath helpers.
- Reaching for
std::optional, std::variant, or std::tuple: use TOptional, TVariant, TTuple.
- Thread-safe producer/consumer:
TQueue over a locked TArray.
Containers at a glance
| Type |
Use for |
Key property |
TArray<T> |
dynamic array (default container) |
contiguous, owning, serializable |
TMap<K,V> |
key→value |
hashed, unique keys, O(1) avg lookup |
TSet<T> |
unique set |
hashed, O(1) avg membership test |
TQueue<T> |
FIFO, cross-thread |
lock-free SPSC/MPSC |
TArrayView<T> |
non-owning read-only window |
zero-copy; pass over contiguous data |
TArray<T, TInlineAllocator<N>> |
small array, avoid heap |
N elements on stack, spills to heap |
TArray — the default container
TArray<FVector> Waypoints;
Waypoints.Reserve(64); // pre-size; avoids reallocations
Waypoints.Emplace(100.0, 200.0, 0.0); // construct in-place; prefer over Add
Waypoints.Emplace(300.0, 400.0, 0.0);
for (const FVector& W : Waypoints) { /* ... */ }
// Predicate removal — no iterator invalidation
Waypoints.RemoveAll([](const FVector& V){ return V.Z < 0.0; });
// O(1) removal when order doesn't matter
Waypoints.RemoveAtSwap(0);
// Sort with a predicate
Waypoints.Sort([](const FVector& A, const FVector& B){ return A.X < B.X; });
GC rule: a TArray of UObject pointers stored as a member must be a UPROPERTY():
UPROPERTY()
TArray<TObjectPtr<AActor>> Spawned; // GC keeps entries alive
TMap
TMap<FName, int32> Scores;
Scores.Reserve(32);
Scores.Add(TEXT("Alice"), 10);
// Idiomatic lookup — returns V* (null if missing)
if (int32* S = Scores.Find(TEXT("Alice")))
(*S)++;
// Insert or get existing
int32& BobScore = Scores.FindOrAdd(TEXT("Bob")); // inserts 0 if absent
// Iterate pairs
for (const TPair<FName, int32>& P : Scores)
UE_LOG(LogGame, Log, TEXT("%s=%d"), *P.Key.ToString(), P.Value);
TSet
TSet<FName> Visited;
Visited.Add(TEXT("Level_A")); // no-op if already present
bool bSeen = Visited.Contains(TEXT("Level_A")); // O(1)
Visited.Remove(TEXT("Level_A"));
TQueue (thread-safe FIFO)
TQueue<FHitResult> PendingHits; // SPSC by default
PendingHits.Enqueue(Hit); // producer (can be off game thread)
FHitResult Out;
while (PendingHits.Dequeue(Out)) // consumer (game thread)
ProcessHit(Out);
See references/containers.md for TArrayView, allocators,
iteration patterns, and GC/UPROPERTY rules.
Strings: choose the right type
| Type |
Mutable? |
Purpose |
Compare cost |
FName |
no |
identifiers, keys, asset names, bone/socket names |
O(1), case-insensitive |
FString |
yes |
runtime build/parse/format; not for player-facing text |
O(n) |
FText |
n/a |
localized user-facing text |
use EqualTo() not == |
FName Socket = TEXT("hand_r"); // interned identifier
FString Path = FString::Printf(TEXT("/Game/%s"), *Map); // runtime manipulation
FText Label = NSLOCTEXT("UI", "Start", "Start Game"); // localized display
FText HpText = FText::Format(
NSLOCTEXT("UI", "HpFmt", "HP: {0}/{1}"),
FText::AsNumber(Hp), FText::AsNumber(MaxHp));
Key conversions
FString S = Name.ToString(); // FName → FString
FName N = FName(*SomeFString); // FString → FName (case-insensitive; lossy)
FText T = FText::FromString(S); // FString → FText (not localizable; debug only)
bool bSame = TextA.EqualTo(TextB); // FText equality — never operator==
TStringBuilder — efficient string building
Prefer TStringBuilder<N> over repeated += on FString. The N-character stack buffer
avoids heap allocation for most outputs.
TStringBuilder<256> B;
B << TEXT("Actor=") << *Actor->GetName();
B.Appendf(TEXT(" X=%.1f"), Loc.X);
FString Result(B);
TStringBuilder<N> is the alias defined at Containers/StringFwd.h:32 for
TStringBuilderWithBuffer<TCHAR, N> (Misc/StringBuilder.h:496).
See references/strings-and-text.md for the full
conversion matrix, FStringView, string tables, encoding rules, and NSLOCTEXT vs
LOCTEXT.
Math types (UE5 = double precision everywhere)
All primary math types are double in UE5 (Large World Coordinates). Float variants
(FVector3f, FQuat4f, etc.) exist for rendering/physics payloads.
| Type |
Meaning |
FVector |
3D point/direction (double X,Y,Z); TVector<double> |
FRotator |
pitch/yaw/roll in degrees; intuitive but prone to gimbal lock |
FQuat |
quaternion; compose/interpolate rotations without gimbal lock |
FTransform |
location + rotation + scale; the actor/component transform |
FVector2D, FVector4 |
2D and 4D variants |
FMatrix |
4×4 double matrix |
FBox, FBoxSphereBounds |
axis-aligned bounds, sphere bounds |
FIntVector, FIntPoint |
integer vector/point |
FVector Loc = Actor->GetActorLocation();
FVector Fwd = Actor->GetActorForwardVector();
double Dist = FVector::Dist(A, B); // Dist:1017
FQuat Q = Actor->GetActorQuat();
FQuat Rot = FQuat(FVector::UpVector, FMath::DegreesToRadians(45.0));
FQuat Comp = Q * Rot; // compose: apply Q then Rot
FQuat Blended = FQuat::Slerp(Q, Target, Alpha); // smooth interpolation
FTransform T = Actor->GetActorTransform();
FVector LocalPt = T.InverseTransformPosition(WorldPt);
// FMath helpers
float Clamped = FMath::Clamp(Val, 0.f, 1.f);
float Lerped = FMath::Lerp(A, B, Alpha);
float Smoothed = FMath::FInterpTo(Current, Target, DeltaTime, Speed);
Gimbal-lock rule: use FRotator for editor-facing properties and single-axis tweaks;
use FQuat whenever composing or interpolating multiple rotations in code.
See references/math-types.md for per-type APIs, LWC pitfalls,
FMath reference, and version notes.
Utility types
// TOptional<T> — maybe-a-value, no heap
TOptional<FHitResult> MaybeHit = DoTrace(Start, End);
if (MaybeHit.IsSet())
Process(MaybeHit.GetValue());
// TVariant<A,B,...> — type-safe discriminated union
using FGameEvent = TVariant<FPickupEvent, FDamageEvent>;
FGameEvent Ev;
Ev.Set<FPickupEvent>({Actor});
if (FPickupEvent* P = Ev.TryGet<FPickupEvent>()) { /* ... */ }
// TTuple<A,B,...> — heterogeneous fixed-size tuple
TTuple<FString, int32> NameScore = MakeTuple(TEXT("Alice"), 100);
FString Name = NameScore.Get<0>();
int32 Score = NameScore.Get<1>();
// TPair<K,V> — produced by TMap iteration
for (const TPair<FName, int32>& P : ScoreMap) { /* P.Key, P.Value */ }
See references/utility-types.md for usage rules, Get vs
TryGet, C++17 structured bindings, and when to prefer a named struct over TTuple.
Gotchas
std::string/std::vector in UE C++ — avoid; they skip reflection/serialization
and don't interact with GC. Use FString/TArray.
- Missing
TEXT() around literals — produces narrow char*; implicit conversion may
silently mangle non-ASCII characters.
TMap::Find returns a pointer (null if absent) — always null-check before
dereferencing. operator[] asserts if the key is missing.
- Holding a pointer into a
TArray across an Add — Add may reallocate;
previously obtained GetData() pointers or element references are then invalid.
FName is case-insensitive — FName("Hand_R") == FName("hand_r"); never use it
where case matters.
FText equality is EqualTo(), not == — operator== compares internal identity,
not display strings.
FVector components are double — assigning .X to a float variable narrows.
Use (float)V.X explicitly when interfacing with float-only APIs.
- Composing rotations with
FRotator + — does not produce correct multi-axis results;
use FQuat multiplication instead.
TOptional::GetValue() on an unset optional — runtime check failure; call IsSet()
first, or use Get(DefaultValue).
TQueue is not iterable — it is write-only from the producer side and dequeue-only
from the consumer side; no Num() or range-for.
Version notes
- UE5+: All primary math types are
double (Large World Coordinates / LWC). Float
variants (FVector3f, FRotator3f, FTransform3f, FQuat4f) exist for rendering
and physics payloads; do not mix with double variants without explicit conversion.
- UE 5.3:
TWriteToString<N> deprecated; use TStringBuilder<N>.
- UE 5.5+:
TSet may internally use TCompactSet; the public API is unchanged.
References & source material
Engine source (UE 5.8, under Engine/Source/Runtime/Core/Public/):
Containers/Array.h:767 — TArray<T> template class; Contains:1757, Reserve:3268,
Sort:3654.
Containers/Map.h (via Map.h.inl) — TMap<K,V>; uses sparse-array + hash bucket
backing.
Containers/Set.h — TSet<T>.
Containers/Queue.h:47 — TQueue<T>, Enqueue:123, Dequeue:80, IsEmpty:206.
Containers/ArrayView.h — TArrayView<T>.
Containers/ContainerAllocationPolicies.h:1328 — TInlineAllocator; :1530 — TFixedAllocator.
Containers/StaticArray.h:25 — TStaticArray<T,N>.
Containers/UnrealString.h (impl in UnrealString.h.inl:58) — FString; Printf:1376,
Format:1418, FromInt:1992.
Containers/StringFwd.h:23 — FStringBuilderBase; :32 — TStringBuilder<N> alias.
Misc/StringBuilder.h:78 — TStringBuilderBase; Append:238, Appendf:407.
UObject/NameTypes.h:631 — FName; ToString:697.
Internationalization/Text.h:406 — FText; Format:675, FromString:520,
EqualTo:599, AsNumber:428.
Misc/Optional.h:47 — TOptional<T>; IsSet:359, GetValue:370, Get:407.
Misc/TVariant.h:42 — TVariant<T,Ts...>; IsType:124, Get:132, TryGet:160.
Templates/Tuple.h:531 — TTuple<...>; MakeTuple:45, Get<N>():245.
Math/MathFwd.h:47 — type aliases: FVector, FQuat:50, FTransform:53, FRotator:57.
Math/Vector.h:50 — TVector<T>; Dist:1015, DotProduct:263, CrossProduct:238,
GetSafeNormal:647, Normalize:630.
Math/Quat.h:38 — TQuat<T>; Slerp:658, MakeFromEuler:374.
Math/TransformVectorized.h:61 — TTransform<T>; GetLocation:599, GetScale3D:1237,
TransformPosition:562, InverseTransformPosition:567.
Math/UnrealMathUtility.h — FMath; Clamp:592, Lerp:1123, FInterpTo:1509,
FInterpConstantTo:1490, RandRange:289.
Official docs (UE 5.8):
Deep-dive references in this skill:
- references/containers.md —
TArray allocators, TQueue,
TArrayView, iteration patterns, GC/UPROPERTY rules.
- references/strings-and-text.md — full conversion matrix,
TStringBuilder, FStringView, string tables, NSLOCTEXT vs LOCTEXT, encoding.
- references/math-types.md — per-type APIs, LWC/double pitfalls,
FMath reference, FQuat composition convention.
- references/utility-types.md —
TOptional, TVariant,
TTuple, TPair, selection guide.
1---2name: ue-core-types-and-containers3description: Core types & containers4---56# Core types & containers78Unreal ships its own containers, string types, and math types. Use them, not `std::`:9they integrate with UObject reflection, serialization, allocators, and garbage collection.10Mixing in `std::string` or `std::vector` causes friction and these types won't serialize11or reflect correctly.1213## When to use this skill1415- Storing collections: choose `TArray`/`TMap`/`TSet` over `std::vector`/`std::map`/`std::set`.16- String work: pick `FString` (mutable), `FName` (identifier), or `FText` (user-facing / localized).17- 3D math: `FVector`, `FRotator`, `FQuat`, `FTransform`, and `FMath` helpers.18- Reaching for `std::optional`, `std::variant`, or `std::tuple`: use `TOptional`, `TVariant`, `TTuple`.19- Thread-safe producer/consumer: `TQueue` over a locked `TArray`.2021## Containers at a glance2223| Type | Use for | Key property |24|---|---|---|25| `TArray<T>` | dynamic array (default container) | contiguous, owning, serializable |26| `TMap<K,V>` | key→value | hashed, unique keys, O(1) avg lookup |27| `TSet<T>` | unique set | hashed, O(1) avg membership test |28| `TQueue<T>` | FIFO, cross-thread | lock-free SPSC/MPSC |29| `TArrayView<T>` | non-owning read-only window | zero-copy; pass over contiguous data |30| `TArray<T, TInlineAllocator<N>>` | small array, avoid heap | N elements on stack, spills to heap |3132### TArray — the default container3334```cpp35TArray<FVector> Waypoints;36Waypoints.Reserve(64); // pre-size; avoids reallocations37Waypoints.Emplace(100.0, 200.0, 0.0); // construct in-place; prefer over Add38Waypoints.Emplace(300.0, 400.0, 0.0);3940for (const FVector& W : Waypoints) { /* ... */ }4142// Predicate removal — no iterator invalidation43Waypoints.RemoveAll([](const FVector& V){ return V.Z < 0.0; });4445// O(1) removal when order doesn't matter46Waypoints.RemoveAtSwap(0);4748// Sort with a predicate49Waypoints.Sort([](const FVector& A, const FVector& B){ return A.X < B.X; });50```5152**GC rule:** a `TArray` of `UObject` pointers stored as a member must be a `UPROPERTY()`:53```cpp54UPROPERTY()55TArray<TObjectPtr<AActor>> Spawned; // GC keeps entries alive56```5758### TMap5960```cpp61TMap<FName, int32> Scores;62Scores.Reserve(32);63Scores.Add(TEXT("Alice"), 10);6465// Idiomatic lookup — returns V* (null if missing)66if (int32* S = Scores.Find(TEXT("Alice")))67 (*S)++;6869// Insert or get existing70int32& BobScore = Scores.FindOrAdd(TEXT("Bob")); // inserts 0 if absent7172// Iterate pairs73for (const TPair<FName, int32>& P : Scores)74 UE_LOG(LogGame, Log, TEXT("%s=%d"), *P.Key.ToString(), P.Value);75```7677### TSet7879```cpp80TSet<FName> Visited;81Visited.Add(TEXT("Level_A")); // no-op if already present82bool bSeen = Visited.Contains(TEXT("Level_A")); // O(1)83Visited.Remove(TEXT("Level_A"));84```8586### TQueue (thread-safe FIFO)8788```cpp89TQueue<FHitResult> PendingHits; // SPSC by default90PendingHits.Enqueue(Hit); // producer (can be off game thread)9192FHitResult Out;93while (PendingHits.Dequeue(Out)) // consumer (game thread)94 ProcessHit(Out);95```9697See [references/containers.md](references/containers.md) for `TArrayView`, allocators,98iteration patterns, and GC/UPROPERTY rules.99100## Strings: choose the right type101102| Type | Mutable? | Purpose | Compare cost |103|---|---|---|---|104| `FName` | no | identifiers, keys, asset names, bone/socket names | O(1), case-insensitive |105| `FString` | yes | runtime build/parse/format; not for player-facing text | O(n) |106| `FText` | n/a | **localized user-facing text** | use `EqualTo()` not `==` |107108```cpp109FName Socket = TEXT("hand_r"); // interned identifier110FString Path = FString::Printf(TEXT("/Game/%s"), *Map); // runtime manipulation111FText Label = NSLOCTEXT("UI", "Start", "Start Game"); // localized display112FText HpText = FText::Format(113 NSLOCTEXT("UI", "HpFmt", "HP: {0}/{1}"),114 FText::AsNumber(Hp), FText::AsNumber(MaxHp));115```116117### Key conversions118119```cpp120FString S = Name.ToString(); // FName → FString121FName N = FName(*SomeFString); // FString → FName (case-insensitive; lossy)122FText T = FText::FromString(S); // FString → FText (not localizable; debug only)123bool bSame = TextA.EqualTo(TextB); // FText equality — never operator==124```125126### TStringBuilder — efficient string building127128Prefer `TStringBuilder<N>` over repeated `+=` on `FString`. The N-character stack buffer129avoids heap allocation for most outputs.130131```cpp132TStringBuilder<256> B;133B << TEXT("Actor=") << *Actor->GetName();134B.Appendf(TEXT(" X=%.1f"), Loc.X);135FString Result(B);136```137138`TStringBuilder<N>` is the alias defined at `Containers/StringFwd.h`:32 for139`TStringBuilderWithBuffer<TCHAR, N>` (`Misc/StringBuilder.h`:496).140141See [references/strings-and-text.md](references/strings-and-text.md) for the full142conversion matrix, `FStringView`, string tables, encoding rules, and `NSLOCTEXT` vs143`LOCTEXT`.144145## Math types (UE5 = double precision everywhere)146147All primary math types are `double` in UE5 (Large World Coordinates). Float variants148(`FVector3f`, `FQuat4f`, etc.) exist for rendering/physics payloads.149150| Type | Meaning |151|---|---|152| `FVector` | 3D point/direction (`double X,Y,Z`); `TVector<double>` |153| `FRotator` | pitch/yaw/roll in degrees; intuitive but prone to gimbal lock |154| `FQuat` | quaternion; compose/interpolate rotations without gimbal lock |155| `FTransform` | location + rotation + scale; the actor/component transform |156| `FVector2D`, `FVector4` | 2D and 4D variants |157| `FMatrix` | 4×4 double matrix |158| `FBox`, `FBoxSphereBounds` | axis-aligned bounds, sphere bounds |159| `FIntVector`, `FIntPoint` | integer vector/point |160161```cpp162FVector Loc = Actor->GetActorLocation();163FVector Fwd = Actor->GetActorForwardVector();164double Dist = FVector::Dist(A, B); // Dist:1017165166FQuat Q = Actor->GetActorQuat();167FQuat Rot = FQuat(FVector::UpVector, FMath::DegreesToRadians(45.0));168FQuat Comp = Q * Rot; // compose: apply Q then Rot169170FQuat Blended = FQuat::Slerp(Q, Target, Alpha); // smooth interpolation171172FTransform T = Actor->GetActorTransform();173FVector LocalPt = T.InverseTransformPosition(WorldPt);174175// FMath helpers176float Clamped = FMath::Clamp(Val, 0.f, 1.f);177float Lerped = FMath::Lerp(A, B, Alpha);178float Smoothed = FMath::FInterpTo(Current, Target, DeltaTime, Speed);179```180181**Gimbal-lock rule:** use `FRotator` for editor-facing properties and single-axis tweaks;182use `FQuat` whenever composing or interpolating multiple rotations in code.183184See [references/math-types.md](references/math-types.md) for per-type APIs, LWC pitfalls,185`FMath` reference, and version notes.186187## Utility types188189```cpp190// TOptional<T> — maybe-a-value, no heap191TOptional<FHitResult> MaybeHit = DoTrace(Start, End);192if (MaybeHit.IsSet())193 Process(MaybeHit.GetValue());194195// TVariant<A,B,...> — type-safe discriminated union196using FGameEvent = TVariant<FPickupEvent, FDamageEvent>;197FGameEvent Ev;198Ev.Set<FPickupEvent>({Actor});199if (FPickupEvent* P = Ev.TryGet<FPickupEvent>()) { /* ... */ }200201// TTuple<A,B,...> — heterogeneous fixed-size tuple202TTuple<FString, int32> NameScore = MakeTuple(TEXT("Alice"), 100);203FString Name = NameScore.Get<0>();204int32 Score = NameScore.Get<1>();205206// TPair<K,V> — produced by TMap iteration207for (const TPair<FName, int32>& P : ScoreMap) { /* P.Key, P.Value */ }208```209210See [references/utility-types.md](references/utility-types.md) for usage rules, `Get` vs211`TryGet`, C++17 structured bindings, and when to prefer a named struct over `TTuple`.212213## Gotchas214215- **`std::string`/`std::vector` in UE C++** — avoid; they skip reflection/serialization216 and don't interact with GC. Use `FString`/`TArray`.217- **Missing `TEXT()`** around literals — produces narrow `char*`; implicit conversion may218 silently mangle non-ASCII characters.219- **`TMap::Find` returns a pointer** (null if absent) — always null-check before220 dereferencing. `operator[]` asserts if the key is missing.221- **Holding a pointer into a `TArray` across an `Add`** — `Add` may reallocate;222 previously obtained `GetData()` pointers or element references are then invalid.223- **`FName` is case-insensitive** — `FName("Hand_R") == FName("hand_r")`; never use it224 where case matters.225- **`FText` equality is `EqualTo()`**, not `==` — `operator==` compares internal identity,226 not display strings.227- **`FVector` components are `double`** — assigning `.X` to a `float` variable narrows.228 Use `(float)V.X` explicitly when interfacing with float-only APIs.229- **Composing rotations with `FRotator +`** — does not produce correct multi-axis results;230 use `FQuat` multiplication instead.231- **`TOptional::GetValue()` on an unset optional** — runtime check failure; call `IsSet()`232 first, or use `Get(DefaultValue)`.233- **`TQueue` is not iterable** — it is write-only from the producer side and dequeue-only234 from the consumer side; no `Num()` or range-for.235236## Version notes237238- **UE5+:** All primary math types are `double` (Large World Coordinates / LWC). Float239 variants (`FVector3f`, `FRotator3f`, `FTransform3f`, `FQuat4f`) exist for rendering240 and physics payloads; do not mix with double variants without explicit conversion.241- **UE 5.3:** `TWriteToString<N>` deprecated; use `TStringBuilder<N>`.242- **UE 5.5+:** `TSet` may internally use `TCompactSet`; the public API is unchanged.243244## References & source material245246Engine source (UE 5.8, under `Engine/Source/Runtime/Core/Public/`):247- `Containers/Array.h`:767 — `TArray<T>` template class; `Contains`:1757, `Reserve`:3268,248 `Sort`:3654.249- `Containers/Map.h` (via `Map.h.inl`) — `TMap<K,V>`; uses sparse-array + hash bucket250 backing.251- `Containers/Set.h` — `TSet<T>`.252- `Containers/Queue.h`:47 — `TQueue<T>`, `Enqueue`:123, `Dequeue`:80, `IsEmpty`:206.253- `Containers/ArrayView.h` — `TArrayView<T>`.254- `Containers/ContainerAllocationPolicies.h`:1328 — `TInlineAllocator`; :1530 — `TFixedAllocator`.255- `Containers/StaticArray.h`:25 — `TStaticArray<T,N>`.256- `Containers/UnrealString.h` (impl in `UnrealString.h.inl`:58) — `FString`; `Printf`:1376,257 `Format`:1418, `FromInt`:1992.258- `Containers/StringFwd.h`:23 — `FStringBuilderBase`; :32 — `TStringBuilder<N>` alias.259- `Misc/StringBuilder.h`:78 — `TStringBuilderBase`; `Append`:238, `Appendf`:407.260- `UObject/NameTypes.h`:631 — `FName`; `ToString`:697.261- `Internationalization/Text.h`:406 — `FText`; `Format`:675, `FromString`:520,262 `EqualTo`:599, `AsNumber`:428.263- `Misc/Optional.h`:47 — `TOptional<T>`; `IsSet`:359, `GetValue`:370, `Get`:407.264- `Misc/TVariant.h`:42 — `TVariant<T,Ts...>`; `IsType`:124, `Get`:132, `TryGet`:160.265- `Templates/Tuple.h`:531 — `TTuple<...>`; `MakeTuple`:45, `Get<N>()`:245.266- `Math/MathFwd.h`:47 — type aliases: `FVector`, `FQuat`:50, `FTransform`:53, `FRotator`:57.267- `Math/Vector.h`:50 — `TVector<T>`; `Dist`:1015, `DotProduct`:263, `CrossProduct`:238,268 `GetSafeNormal`:647, `Normalize`:630.269- `Math/Quat.h`:38 — `TQuat<T>`; `Slerp`:658, `MakeFromEuler`:374.270- `Math/TransformVectorized.h`:61 — `TTransform<T>`; `GetLocation`:599, `GetScale3D`:1237,271 `TransformPosition`:562, `InverseTransformPosition`:567.272- `Math/UnrealMathUtility.h` — `FMath`; `Clamp`:592, `Lerp`:1123, `FInterpTo`:1509,273 `FInterpConstantTo`:1490, `RandRange`:289.274275Official docs (UE 5.8):276- Containers overview — <https://dev.epicgames.com/documentation/unreal-engine/containers-in-unreal-engine>277- TArray — <https://dev.epicgames.com/documentation/unreal-engine/array-containers-in-unreal-engine>278- TMap — <https://dev.epicgames.com/documentation/unreal-engine/map-containers-in-unreal-engine>279- TSet — <https://dev.epicgames.com/documentation/unreal-engine/set-containers-in-unreal-engine>280- String Handling — <https://dev.epicgames.com/documentation/unreal-engine/string-handling-in-unreal-engine>281282Deep-dive references in this skill:283- [references/containers.md](references/containers.md) — `TArray` allocators, `TQueue`,284 `TArrayView`, iteration patterns, GC/UPROPERTY rules.285- [references/strings-and-text.md](references/strings-and-text.md) — full conversion matrix,286 `TStringBuilder`, `FStringView`, string tables, `NSLOCTEXT` vs `LOCTEXT`, encoding.287- [references/math-types.md](references/math-types.md) — per-type APIs, LWC/double pitfalls,288 `FMath` reference, `FQuat` composition convention.289- [references/utility-types.md](references/utility-types.md) — `TOptional`, `TVariant`,290 `TTuple`, `TPair`, selection guide.