A maioria dos jogos usa localização baseada em chave, ou seja, é necessária uma chave para descrever um texto específico, mas eu ofereço uma opção melhor, embora essa opção não seja adequada para quem tem dublagem em jogos, é mais fácil através de uma chave.
O que é uma chave e por que é necessário
A chave, ou melhor, a palavra-chave, é a palavra pela qual será determinado qual texto é necessário e, em seguida, a pesquisa pelo idioma selecionado já está em andamento. Um exemplo de palavra-chave:
scene_Escape_from_jail_Ethan_dialog_with_Mary_3 , sim, a chave ficará assim se o seu jogo tiver muitas cenas, um grande enredo. Sugiro que imediatamente escreva uma frase em um dos idiomas, geralmente o inglês ou aquele em que o programador é fluente. A propósito, como todas as frases do idioma atual e do idioma principal estarão na RAM, será mais produtivo do que obter cada vez que o arquivo for utilizado, para jogos grandes, você poderá modificar levemente o arquivo para cada cena.
Como tudo será organizado
Nas ações descritas abaixo, será usada a classe Lang estática, na qual todas as pesquisas por palavras / frases serão realizadas. Vamos declarar uma classe conectando as bibliotecas que precisamos:
using UnityEngine; using System.Collections.Generic;
E assim, não podemos ficar sem uma biblioteca padrão, já que obteremos o arquivo dos recursos, podemos baixá-lo de qualquer maneira conveniente, mas é mais conveniente e prático. São necessárias bibliotecas do sistema para conectar a lista, dicionário e trabalhar com arquivos do editor. A biblioteca UnityEditor é necessária apenas para atualizar o arquivo durante o primeiro registro da frase, porque Após uma rápida reinicialização, todas as frases nem sempre serão carregadas, mas com a ajuda desta biblioteca, podemos resolver esse problema. A classe armazena dois campos estáticos, sejam os nomes do arquivo; no nosso caso, o caminho é uma pasta com recursos e pode haver qualquer nome do arquivo.
Agora você precisa adicionar listas para armazenar tudo o que é usado pelo idioma e pelo dicionário.
private static int LangIndex;
O campo LangIndex manterá o índice do idioma atual em relação ao registro no arquivo. Na lista de idiomas - todos os idiomas usados no arquivo serão gravados. O dicionário armazenará todas as frases no idioma principal e no idioma atual.
É necessário adicionar a inicialização dos campos descritos acima da classe.
Código public static bool isStarting
Ele usará imediatamente a diretiva interna para que não execute ações desnecessárias após a compilação do aplicativo. A chamada para Lang.Starting (...) deve ser algo como isto:
#if !UNITY_EDITOR Lang.Starting(LANGUAGE); #else Lang.Starting(LANGUAGE, SystemLanguage.English, SystemLanguage.Russian, SystemLanguage.Ukrainian); #endif private static int FindIndexLanguage(SystemLanguage _language)
A chamada durante a reprodução no editor deve conter dois parâmetros principais, é isso que frases de idioma devem ser traduzidas agora e qual idioma será usado como idioma principal; todos os outros parâmetros são os parâmetros de idioma que devem estar contidos no arquivo; esses parâmetros são necessários apenas durante o primeiro lançamento, quando o arquivo ainda não foi criado (e não é necessário excluí-lo posteriormente), caso contrário, se você precisar adicionar algum idioma, copie tudo do arquivo, exclua o arquivo e execute novamente o código no editor ou adicione você mesmo ao arquivo.
O código acima usa o
método SystemLanguageParse (...) , que simplesmente converte os nomes de idiomas do tipo de seqüência de caracteres em SystemLanguage (esse método será menor).
Vamos nos debruçar sobre o método add:
#if UNITY_EDITOR private static void Add(string AddString)
Como esse método será usado apenas ao iniciar a partir do editor, podemos usar com segurança o utilitário do sistema para substituir o arquivo, bem como atualizar os arquivos alterados para o editor usando o método Refresh (). Entre essas ações, uma frase é simplesmente adicionada ao dicionário, para se proteger de regravar na mesma sessão.
A propósito, esqueci de dizer que as frases serão armazenadas em um arquivo .csv, o que nos permitirá traduzir confortavelmente frases para o Excele. Agora precisamos adicionar um método que seja bom para nós, o que nos permitirá alterar o idioma:
public static void ChangeLanguage(SystemLanguage _language)
Então, chegamos ao método mais importante, que pega a frase no idioma principal e a publica no usuário certo:
public static string Phrase(string DefaultPhrase)
Esse método simplesmente pega uma frase no idioma principal e, em seguida, repete tudo o que está no dicionário, encontrando tal frase por chave, nos fornece os valores dessa chave, que é uma frase no idioma de que precisamos. Você pode usar este método com uma linha de código simples:
string str = Lang.Phrase("Hello world");
Agora a frase no idioma que precisamos entrará na string str, se de repente ela estiver ausente, a frase especificada nos parâmetros, ou seja, Hello world, cairá.
Este método pode ser melhorado um pouco, para que você possa usar argumentos para preencher:
public static string Phrase(string DefaultPhrase, params string[] args)
Agora, esse método pode ser chamado como antes:
string str = Lang.Phrase("Hello world");
Mas agora nosso método formatou a saída, indicando parâmetros separados por vírgulas:
string str = Lang.Phrase("Hello {0} from {1}", "world", "habr");
Traduções de frases
Como escrevi acima, o arquivo usa extensões .csv que permitem fazer tudo no Excel, mas não tão simples, o problema do C-sharpe e do Excel é que eles entendem o alfabeto cirílico em codificação diferente, o Excel entende apenas a codificação UTF-8-BOM ou aquele que nosso YaP não entende, devemos usar apenas UTF-8 nele, mesmo que o editor unitário compreenda UTF-8-BOM, no código existem duas palavras idênticas em codificações diferentes (UTF-8 e UTF-8- BOM) não será igual, o que levará à adição constante de palavras idênticas ao nosso arquivo.
Podemos
codificar arquivos usando o
NotePad ++ gratuito baixando-o de fora. site. A edição de um arquivo não trará nenhum problema; para adicionar uma única palavra, você pode até usar um editor de texto, o mesmo bloco de notas ou mesmo nosso ambiente de programação.
Código final using UnityEngine; using System.Collections.Generic;
O principal a lembrar: UTF-8-BOM - para trabalhar no Excel, UTF-8 para trabalhar com código, não se esqueça.