【Unity】簡単にセリフを表示して言語を切り替える

投稿者: | 2020-09-08

簡単にセリフの言語を切り替えてみます。言語設定は保存できるようにします。

まず、2つの空のゲームオブジェクトにそれぞれ新規のスクリプトを付けて、ドロップダウンとボタンを一つずつ、テキストを2つ作りました。テキストの一つはドロップダウンの上に表示しました。

片方のスクリプトで言語設定を切り替えて、それをボタンやテキストに反映します。

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;


public class SettingsTest : MonoBehaviour
{

    public static int language;
    [SerializeField] Text text;
    [SerializeField] Dropdown dropdown;
    [SerializeField] Text buttonText;


    // Start is called before the first frame update
    void Start()
    {
        language = PlayerPrefs.GetInt("LANGUAGE", 0); // 保存した値を取得
        text.text = language == 0 ? "言語" : "Language"; // 言語によって表示を変える
        dropdown.value = language; // ドロップダウンを切り替える
        buttonText.text = language == 0 ? "再読み込み" : "Reload"; // 言語によって表示を変える
    }

    // 言語を変える
    public void ChangeLanguage(int value)
    {
        language = value;
        text.text = language == 0 ? "言語" : "Language"; // 言語によって表示を変える
        buttonText.text = language == 0 ? "再読み込み" : "Reload"; 
    }

    // 言語を保存する
    void SaveLanguage()
    {
        PlayerPrefs.SetInt("LANGUAGE", language); // 値をセット
        PlayerPrefs.Save(); // 保存
    }

    public void LoadScene()
    {
        SaveLanguage();
        SceneManager.LoadScene("Serif");

    }
}

まず言語を整数で管理するためのpublicな静的メンバ変数を作ります。0を日本語、1を英語にしました。開始時に、保存した値をPlayerPrefs.GetIntで取得します。何も保存されていないときは第2引数の値が入ります。

そして、取得した値によってテキストとドロップダウンを切り替えます。

text.text = language == 0 ? "言語" : "Language"; // 言語によって表示を変える
dropdown.value = language; // ドロップダウンを切り替える
buttonText.text = language == 0 ? "再読み込み" : "Reload"; // 言語によって表示を変える

言語を切り替えるメソッドを作って、ドロップダウンの値を変えたときに呼ばれるようにします。

メソッドを選ぶドロップダウンには、引数を入力できるものとできないものがあります。

引数を入力できないものを選んで、ドロップダウンで選択された値が渡されるようにし、その値を使って静的変数の値やテキストの表示を切り替えます。

    // 言語を変える
    public void ChangeLanguage(int value)
    {
        language = value;
        text.text = language == 0 ? "言語" : "Language"; // 言語によって表示を変える
        buttonText.text = language == 0 ? "再読み込み" : "Reload"; 
    }

ボタンを押すとシーンの再読み込みをします。

このときに言語の値を保存するので、シーンが始めからになっても言語は変わりません。

// 言語を保存する
void SaveLanguage()
{
    PlayerPrefs.SetInt("LANGUAGE", language); // 値をセット
    PlayerPrefs.Save(); // 保存
}

public void LoadScene()
{
    SaveLanguage();
    SceneManager.LoadScene("Serif");

}

もう片方のスクリプトでは、コルーチンを使ってセリフを表示します。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class SerifTest : MonoBehaviour
{

    [SerializeField] Text serifText;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine("Serif");
    }

    IEnumerator Serif()
    {
        WaitForSeconds wait1 = new WaitForSeconds(1f);

        while (true)
        {
            serifText.text = SettingsTest.language == 0 ? "こんにちは" : "Hello"; // 文字を表示

            yield return wait1; // 1秒待つ
            serifText.text = ""; // 文字を消す
            yield return wait1; // 1秒待つ

            serifText.text = SettingsTest.language == 0 ? "お久しぶりです" : "Long time no see!"; // 文字を表示

            yield return wait1; // 1秒待つ
            serifText.text = ""; // 文字を消す
            yield return wait1; // 1秒待つ

            serifText.text = SettingsTest.language == 0 ? "さようなら" : "Bye"; // 文字を表示

            yield return wait1; // 1秒待つ
            serifText.text = ""; // 文字を消す
            yield return wait1; // 1秒待つ
        }
    }
}

コルーチンの中で待ち時間を作るときに、newをたくさん使うと重くなるそうなので、変数に入れて使いまわしています。

セリフを表示するときは、ボタン等の表示を切り替えるときのように、言語の値によって内容を変えています。

serifText.text = SettingsTest.language == 0 ? "こんにちは" : "Hello"; // 文字を表示

コメントを残す

メールアドレスが公開されることはありません。