2d-pixel-perfect
Sets up, diagnoses, and fixes pixel perfect 2D rendering with PixelPerfectCamera in URP or Built-in. Use when a retro-style or…
Sets up and configures Unity Localization, including locales, String and Asset Tables, and CJK fonts. Use when the user asks to add languages, translate UI text, or mentions i18n or multilingual support.
$ npx -y skills add unity-technologies/skills --skill localization --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/localizationContext preview
The summary Claude sees to decide when to auto-load this skill.
Sets up and configures Unity Localization, including locales, String and Asset Tables, and CJK fonts. Use when the user asks to add languages, translate UI text, or mentions i18n or multilingual support.
name: localization description: Sets up and configures Unity Localization, including locales, String and Asset Tables, and CJK fonts. Use when the user asks to add languages, translate UI text, or mentions i18n or multilingual support.
This guide covers setting up and configuring Unity Localization, including locales, String and Asset Tables, Addressables integration, and CJK font support via Asset Tables.
Before doing anything else, verify that the Localization package is installed. Many APIs in this skill will fail silently or throw confusing errors if the package isn't present.
1. **Check by reading the project, not by asking the Package Manager.** Look for `com.unity.localization` in **`Packages/packages-lock.json`**. That file records what Unity actually resolved, it is plain JSON, and reading it needs no Editor and no async call. (`Packages/manifest.json` only records what was *requested*, so check the lock file.) 2. **Install if missing:** `UnityEditor.PackageManager.Client.Add("com.unity.localization")`. 3. **Wait properly.** `Client.Add` and `Client.List` are **asynchronous**: they return a request that is still `InProgress` when the call returns, so reading the result in the same statement tells you nothing. Do not busy-wait on `IsCompleted` either; that blocks the main thread you are running on. Instead, return after firing the install, then **poll `packages-lock.json` in a later call** until the id appears. Installation also triggers a domain reload, so expect the first poll or two to fail; a fresh install typically resolves in a few seconds. 4. **Confirm the types are actually loaded** before using them, since the lock file can be written before the assemblies are ready:
var t = System.Type.GetType(
"UnityEngine.Localization.Settings.LocalizationSettings, Unity.Localization");
return t != null ? "ready" : "not loaded yet";Only proceed once that returns `ready`.
If `LocalizationEditorSettings.ActiveLocalizationSettings` is null, you must find or create it: 1. **Find:** Use `AssetDatabase.FindAssets("t:LocalizationSettings", new[] { "Assets" })`. If found, load the first one and assign it to `LocalizationEditorSettings.ActiveLocalizationSettings`.
read-only packages, so it can return an asset from a package and you end up pointing the project at something you cannot edit. This applies to every `FindAssets` call in this skill. 2. **Create:** If not found, create a new instance and save it to `Assets/Localization/LocalizationSettings.asset`. Use `ScriptableObject.CreateInstance<LocalizationSettings>()` followed by `AssetDatabase.CreateAsset()`. 3. **Activate:** Set `LocalizationEditorSettings.ActiveLocalizationSettings = settings`. 4. **Locales:** Ensure locales (en, fr, de, etc.) exist. Create them if missing and add them to settings using `LocalizationEditorSettings.AddLocale(locale)`.
Programmatic changes to String or Asset tables require notification to the Editor. Always create the required asset tables, unless there is already an existing one in the project.
When populating tables from a dataset, match by `Locale.Identifier.Code` explicitly. The order of `GetLocales()` is not guaranteed to match your input data array — assuming it does will cause silent data mismatches that are very hard to debug. For **Asset Tables**, use the GUID of the asset: `table.GetEntry(sharedId) ?? table.AddEntry(sharedId, guid);`.
After any modification (adding keys, updating values), notify the Editor so it can refresh its internal state. Skipping this will leave the Editor showing stale data until the next reimport. 1. Call `EditorUtility.SetDirty(collection)`, `EditorUtility.SetDirty(collection.SharedData)`, on each modified `Table`. 2. **Unity 6+ Notification:** `LocalizationEditorSettings.EditorEvents.RaiseCollectionModified(sender, collection);` 3. Always call `AssetDatabase.SaveAssets()` at the end.
different mechanisms, and conflating them is why locale switching often ends up hand-rolled.
(`Window > Asset Management > Localization Scene Controls`). This is Editor-only. It is not a runtime feature, so it is not the answer when the game itself needs a language setting.
supported entry point, and everything bound through `LocalizeStringEvent` updates from it.
Localization Settings asset. `SpecificLocaleSelector` is the one that forces a chosen locale; the default chain otherwise picks up the system language.
it sets `SelectedLocale` and lets the package propagate the change. What is forbidden is a debug drop
A collection of reusable AI agent skills for Unity workflows. Compatible with Claude Code, GitHub Copilot, Cursor, Cline, and 50+ other agents.
Sets up, diagnoses, and fixes pixel perfect 2D rendering with PixelPerfectCamera in URP or Built-in. Use when a retro-style or…
Imports 3D models and point clouds with Asset Transformer Toolkit (formerly Pixyz), and creates, edits, and runs RuleSets,…
Routes Audio Sources into existing Audio Mixer Groups, classifying each source by what it plays. Use when the user asks about…
Builds node-based Editor tools with Unity Graph Toolkit (GTK) on Unity 6.6+: graphs, nodes, ports and validation, State Machine…
Builds and operates live games with Unity Services. Use when the user asks about backend or live-ops features such as player…
Creates and fixes Unity 2D physics in both systems, 2D Physics Core and the legacy Rigidbody 2D system. Use when the user asks…