簡単にセリフの言語を切り替えてみます。言語設定は保存できるようにします。
まず、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"; // 文字を表示