Communitygithub.com

unity-technologies/localization

Configura e configura a Localização do Unity, incluindo locales, tabelas de String/Asset, suporte a fontes CJK e fluxos de trabalho do Addressables. Use quando o usuário quiser adicionar idiomas a um projeto, traduzir texto da UI, suportar idiomas asiáticos (CJK) com fontes TMP, ou mencionar i18n, l10n, suporte multilíngue ou fazer um jogo suportar vários idiomas.

O que é localization?

Este skill descreve a configuração completa do sistema de Localização do Unity, um processo essencial para qualquer jogo ou aplicação que precise suportar múltiplos idiomas. Ele abrange desde a instalação e verificação do pacote `com.unity.localization` até a criação e ativação de Locales (como inglês, francês, alemão) e a gestão de tabelas de String e Asset. O guia enfatiza o uso de práticas robustas, como a verificação do pacote pelo `packages-lock.json` (evitando erros silenciosos), a ativação correta via `LocalizationEditorSettings`, e a atenção para não confundir os mecanismos de pré-visualização no Editor (Scene Controls) com a alternância de locale em tempo de execução (`LocalizationSettings.SelectedLocale`), evitando códigos manuais que possam quebrar o sistema. Um ponto central para desenvolvedores de jogos com foco em Ásia é a seção sobre suporte a fontes CJK, que recomenda especificamente o uso de troca de fontes por Asset Table para cada localidade, em vez de TMP Fallback Fonts, que são considerados menos confiáveis. O skill é prático e direto, fornecendo snippets de código C# seguros e validados para evitar erros comuns, como nomes totalmente qualificados (`UnityEngine.UI.GraphicRaycaster`) para evitar conflitos de namespace, e a garantia de que o Editor seja notificado após modificações nas tabelas com `EditorUtility.SetDirty`.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/unity-technologies/skills/tree/main/skills/localization

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Este guia abrange a configuração e a personalização da localização no Unity, incluindo locais, tabelas de String e Asset, integração com Addressables e suporte a fontes CJK por meio de tabelas de Asset.

0. Verificação da Instalação do Pacote

Antes de qualquer outra coisa, verifique se o pacote de Localização está instalado. Muitas APIs deste skill falharão silenciosamente ou gerarão erros confusos se o pacote não estiver presente.

  1. Verifique lendo o projeto, não perguntando ao Gerenciador de Pacotes. Procure por com.unity.localization no Packages/packages-lock.json. Esse arquivo registra o que o Unity realmente resolveu, é JSON simples e sua leitura não precisa do Editor nem de chamada assíncrona. (Packages/manifest.json apenas registra o que foi solicitado, então verifique o arquivo de bloqueio.)
  2. Instale se estiver faltando: UnityEditor.PackageManager.Client.Add("com.unity.localization").
  3. Aguarde corretamente. Client.Add e Client.List são assíncronos: eles retornam uma solicitação que ainda está InProgress quando a chamada retorna, portanto, ler o resultado na mesma instrução não lhe diz nada. Não faça busy-wait em IsCompleted; isso bloqueia a thread principal em que você está rodando. Em vez disso, retorne após disparar a instalação e, em seguida, consulte packages-lock.json em uma chamada posterior até que o ID apareça. A instalação também aciona uma reinicialização do domínio, então espere que a primeira ou duas consultas falhem; uma instalação nova geralmente resolve em alguns segundos.
  4. Confirme se os tipos foram realmente carregados antes de usá-los, já que o arquivo de bloqueio pode ser gravado antes que os assemblies estejam prontos:
    var t = System.Type.GetType(
        "UnityEngine.Localization.Settings.LocalizationSettings, Unity.Localization");
    return t != null ? "ready" : "not loaded yet";
    
    Prossiga apenas quando isso retornar ready.

1. Configurações de Localização e Locais

Se LocalizationEditorSettings.ActiveLocalizationSettings for nulo, você deve encontrar ou criá-lo:

  1. Encontrar: Use AssetDatabase.FindAssets("t:LocalizationSettings", new[] { "Assets" }). Se encontrado, carregue o primeiro e atribua-o a LocalizationEditorSettings.ActiveLocalizationSettings.
    • Sempre passe as pastas de pesquisa. Um FindAssets sem escopo pesquisa todo o projeto, incluindo pacotes somente leitura, então pode retornar um ativo de um pacote e você acaba apontando o projeto para algo que não pode editar. Isso se aplica a toda chamada FindAssets neste skill.
  2. Criar: Se não encontrado, crie uma nova instância e salve-a em Assets/Localization/LocalizationSettings.asset. Use ScriptableObject.CreateInstance<LocalizationSettings>() seguido por AssetDatabase.CreateAsset().
  3. Ativar: Defina LocalizationEditorSettings.ActiveLocalizationSettings = settings.
  4. Locais: Garanta que os locais (en, fr, de, etc.) existam. Crie-os se estiverem faltando e adicione-os às configurações usando LocalizationEditorSettings.AddLocale(locale).

2. Modificando Tabelas de Localização

Alterações programáticas em tabelas de String ou Asset exigem notificação ao Editor. Sempre crie as tabelas de ativos necessárias, a menos que já exista uma no projeto.

Padrão de População Seguro

Ao popular tabelas a partir de um conjunto de dados, corresponda pelo Locale.Identifier.Code explicitamente. A ordem de GetLocales() não é garantida para corresponder ao seu array de dados de entrada — supor que corresponderá causará incompatibilidades de dados silenciosas que são muito difíceis de depurar. Para Tabelas de Asset, use o GUID do ativo: table.GetEntry(sharedId) ?? table.AddEntry(sharedId, guid);.

Atualização e Notificação

Após qualquer modificação (adicionar chaves, atualizar valores), notifique o Editor para que ele possa atualizar seu estado interno. Pular isso deixará o Editor mostrando dados obsoletos até a próxima reimportação.

  1. Chame EditorUtility.SetDirty(collection), EditorUtility.SetDirty(collection.SharedData), em cada Table modificada.
  2. Notificação Unity 6+: LocalizationEditorSettings.EditorEvents.RaiseCollectionModified(sender, collection);
  3. Sempre chame AssetDatabase.SaveAssets() no final.

3. Localização e Layout da UI

Namespacing e Conflitos

  • Sempre qualifique os nomes: Use UnityEngine.UI.Image, UnityEngine.UI.VerticalLayoutGroup, UnityEngine.UI.ScrollRect, UnityEngine.UI.Mask, UnityEngine.UI.CanvasScaler, UnityEngine.UI.GraphicRaycaster, UnityEngine.UI.ContentSizeFitter, UnityEngine.UI.LayoutRebuilder, etc.
  • UnityEngine.UI é tanto um namespace quanto um contêiner de classe, então nomes não qualificados produzem CS0118 (namespace usado como um tipo). A qualificação completa evita isso inteiramente.
  • Instância Única: Sempre verifique GameObject.Find("YourCanvasName") e destrua o antigo antes de criar um novo.
  • Troca de local: use o pacote e mantenha visualização e tempo de execução separados. Estes são dois mecanismos diferentes, e confundi-los é a razão pela qual a troca de local geralmente acaba sendo feita manualmente.
    • Para visualizar um local durante a criação, use a janela Localization Scene Controls (Window > Asset Management > Localization Scene Controls). Isso é apenas para o Editor. Não é um recurso de tempo de execução, então não é a resposta quando o próprio jogo precisa de uma configuração de idioma.
    • Para trocar o local em tempo de execução, atribua LocalizationSettings.SelectedLocale. Esse é o ponto de entrada suportado, e tudo vinculado por meio de LocalizeStringEvent é atualizado a partir dele.
    • Para fixar em qual local o jogo inicia, configure um seletor de local de inicialização no ativo Localization Settings. SpecificLocaleSelector é o que força um local escolhido; a cadeia padrão, caso contrário, captura o idioma do sistema.
    • NUNCA gerencie o estado do local manualmente. Um menu de idioma real no jogo é aceitável e esperado, desde que defina SelectedLocale e deixe o pacote propagar a mudança. O que é proibido é um menu ou dropdown de depuração que rastreie sua própria variável "idioma atual", troque strings por conta própria ou contorne o pacote, porque nada mais no projeto o seguirá.

Eventos de String Localizados (Vinculação Robusta)

  • Verifique o Tipo de Componente: Identifique se o alvo é TextMeshPro ou o legado UnityEngine.UI.Text.

  • Vincule Corretamente: adicione o componente público UnityEngine.Localization.Components.LocalizeStringEvent e conecte-o você mesmo — defina StringReference para a entrada da tabela e, em seguida, adicione um ouvinte OnUpdateString que atribua o valor ao componente de texto (TMP_Text.text para TextMeshPro, UnityEngine.UI.Text.text para Text legado).

    Não reflita em UnityEditor.Localization.Plugins.TMPro.LocalizeComponent_TMPro ou seu equivalente UGUI. Esses são internal (medido no Localization 1.5.12), então acessá-los significa contornar o controle de acesso para alcançar uma API sobre a qual a Unity não faz nenhum compromisso de estabilidade — ela pode mudar ou desaparecer em qualquer versão do pacote. LocalizeStringEvent é público e faz o mesmo trabalho com a fiação explicitamente definida.

  • Reconstrução de Layout: Após definir texto localizado ou popular uma lista, chame UnityEngine.UI.LayoutRebuilder.ForceRebuildLayoutImmediate(parentTransform) para garantir que as dimensões sejam atualizadas.

4. Suporte a Fontes para Idiomas Asiáticos (CJK)

Evite TMP Fallback Fonts para locais CJK. Use a Troca de Fontes por Tabela de Asset para cada local específico — fallbacks são não confiáveis e difíceis de depurar quando glifos estão faltando.

Pré-requisito: Recursos Essenciais do TMP devem ser importados

Verifique isso antes de tocar em qualquer API TMP. Em um projeto que nunca os importou, TMP_Settings.instance é null e as chamadas TMP falham com um simples NullReferenceException que não nomeia nada útil. TMP_FontAsset.CreateFontAsset é um deles, então a criação da fonte morre na primeira linha com um erro.

Individual skills in this repo

This repo contains 9 individual skills — each has its own dedicated page.

unity-technologies/2d-pixel-perfect

Sets up, diagnoses, and fixes pixel perfect 2D rendering in Unity projects. Use when working on any retro-style or pixel art 2D game.

unity-technologies/audio-setup-mixers

Scans the scene and audio assets to appropriately route Audio Sources into existing Audio Mixer Groups, classifying each source by what it plays. Use when the user asks about cleaning up mixer assignments, routing audio through a mixer, or which group a sound belongs in. Creating mixers and groups, and setting volumes, are not automated — the skill inventories what exists and asks the user to add anything missing.

unity-technologies/build-live-game

Build and operate a live game using Unity Services. Use when the user needs to implement, connect, or debug backend-driven features — battle passes, achievements, player progression, cloud saves, leaderboards, matchmaking, virtual economies, server-authoritative logic, anti-cheat, player accounts and authentication, remote configuration, feature flags, A/B testing, analytics, or cloud resource deployment. Triggers on live-ops, live service, backend, server authority, cloud code, cloud save, remote config, player data, retention, monetization loop, season pass, ranking, multiplayer sessions, lobbies, or any Unity Services integration.

unity-technologies/generate-editor-search-query

Generates Unity Search / Quick Search queries and opens the Unity Search window for read-only Unity Editor asset or scene-object lookup requests. Always use when the user asks to find, search, show, locate, filter, look up, query, or list concrete assets or scene objects in the current project or scene, even if Unity Search is not named. Covers materials, textures, prefabs, scenes, scripts, shaders, GameObjects, components, Lights, Cameras, UI objects, labels, paths, references, selected or named assets, and asset types. Also use when the user explicitly mentions Unity Search, Quick Search, Search window, open Search, or asks what Unity Search query to use. Do not use for general project overview, project structure, folder-purpose summaries, gameplay/system explanations, how-to programming questions, web search, repository text search, build logs, package installation, menu or settings search, modifying results, or non-Unity filesystem search unless the user explicitly asks to use Unity Search.

unity-technologies/implement-in-app-purchases

Implement, configure, and debug Unity In-App Purchases (IAP) — store connection, product catalog, consumable/non-consumable/subscription purchases, two-step pending-confirm flow, receipt validation, entitlement checking, restore transactions, Apple extensions (promotional purchases, Ask-to-Buy, code redemption), and Google Play extensions (subscription upgrade/downgrade), D2C Capabilities(direct to customer), 3rd party payment provider (Stripe/Coda) via Unity IAP/Unity Cloud. Use when the user needs to add, modify, debug, or migrate from native Android/iOS billing, 3rd party packages(RevenueCat/Adapty/Essential Kit/Unipay supported) to IAP. Triggers on microtransactions (MTX), monetization, real-money purchases, store purchases, buying items, support D2C, purchase via Stripe/Coda, migrate from native billing(Google's BillingClient or Apple's StoreKit/SKPaymentQueue/SKProduct)/RevenueCat/Adapty/EssentialKit/Unipay.

unity-technologies/initialize-ai-navigation

Sets up and configures the Unity AI Navigation system — NavMesh surfaces, NavMesh agents, obstacles, links, modifiers, areas and costs. Use when creating walkable navigation meshes, adding pathfinding agents, setting up patrol routes, configuring obstacle avoidance and carving, connecting separate NavMeshes with links, coupling navigation with animation, or troubleshooting navigation issues.

unity-technologies/levelplay-unity-integration

Integrates the LevelPlay Mediation SDK via the Ads Mediation UPM package. Use when a developer asks about adding ads to a Unity game, implementing rewarded, interstitial, or banner ads, setting up ad mediation, configuring ad networks, installing or updating the Ads Mediation package, troubleshooting LevelPlay namespace errors, resolving Android gradle or iOS CocoaPods dependency issues for ads, configuring ATT or privacy settings for ad compliance, tracking impression-level revenue (ILRD), initializing the LevelPlay SDK, or setting up ad unit IDs. Also use when a developer wants to monetize their Unity game with ads, asks how to get started with LevelPlay, ads, or mediation, or needs help with any part of the LevelPlay integration workflow including platform-specific setup for iOS or Android. Also use when upgrading the LevelPlay or IronSource SDK version, migrating from deprecated IronSource.Agent APIs, or migrating a game from Unity Ads to LevelPlay.

unity-technologies/manage-sprite-atlas

Manage SpriteAtlas using prebuild pipeline with IPreprocessBuildWithReport (DEFAULT approach). Use it to configure master atlases, variant atlases, texture settings, packing settings, and platform-specific configurations. Use when the user asks about creating sprite atlases, optimizing sprites, configuring atlas settings, adding sprites to atlases, creating variant atlases, implementing automated atlas generation, or runtime sprite atlas access. Always use prebuild approach unless user explicitly requests manual authoring.

unity-technologies/migrate-birp-to-urp

Plans, executes, and troubleshoots Unity projects moving from the Built-in Render Pipeline (BiRP/BIRP/Built-in RP) to the Universal Render Pipeline (URP). Use when the user asks to upgrade, convert, switch, or migrate a project, scene, material, or shader to URP/Universal Render Pipeline; fix pink or magenta materials after URP; convert Built-in materials/shaders; move a 2D project to URP 2D; review lighting, quality, post-processing, baked lightmaps, or reflection probes after URP; or diagnose visual problems after a render-pipeline migration.

Habilidades Relacionadas