使用環境
Unity 2020.3.17f1
Windows 10
目標
InputFieldに入力した文字列が指定した文字列と一致したときに特定の画像を表示する。
そして数秒後にシーンをアンロードする。
困った点
- 画像が表示できない
- 画像を表示しようとするとInputFieldの画像の操作がなされてしまう
- 正解した瞬間に画面が切り替えるのを防ぐため、コルーチンで数秒待機させようとするも0秒で終了してしまう
- 他のオブジェクトのスクリプトの関数を呼び出せない
1の解決法
SpriteRenderer型を使用して、enabled
で表示非表示を切り替えた。
2の解決法
初めは画像をInputFieldにアタッチしていたのを、1つのオブジェクトとしてヒエラルキーのルートに設置した。その流れで画像表示に関するコードを新しいファイルに書き直した。
3の解決法
Invoke
関数を使用した。
4の解決法
オブジェクトをアタッチして、GetComponent
関数でスクリプトのデータを取得した。
コード例
以下はこの記事に関係のある部分だけ抜粋したものである。
コメントの(n)が関連した問題を示している。
正誤判定
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Judge : MonoBehaviour
{
private InputField _inputField;
// 答え
string answerStr = "トマト";
// 画像表示関数呼び出し用 (4)
CurrectSprite _current;
public GameObject _obj;
// 画像を表示してからシーンが遷移するまでの待機時間 (3)
float waitTime = 1.5f;
private void Start()
{
_inputField = GetComponent<InputField>();
_inputField.Select();
// (4)
_current = _obj.GetComponent<CurrectSprite>();
}
/// <summary>
/// テキスト取得
/// </summary>
public void GetText()
{
// 正解していたら
if (isCorrect())
{
// 正解画像を表示 (1)
_current.PrintCorrectImage();
// このシーンを閉じる (3)
Invoke("UnloadThisScene", waitTime);
}
}
/// <summary>
/// 正誤判定
/// </summary>
bool isCorrect()
{
if (answerStr == _inputField.text || answerStringKana == _inputField.text)
return true;
else
return false;
}
// (3)
void UnloadThisScene()
{
SceneManager.UnloadSceneAsync(1);
}
}
画像表示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CurrectSprite : MonoBehaviour
{
SpriteRenderer _renderer;
private void Start()
{
if (!TryGetComponent(out _renderer)) return;
_renderer.enabled = false;
}
public void PrintCorrectImage()
{
_renderer.enabled = true;
}
}
感想
これらの問題を解決するためにAI(phindや Chat GPT)を使用したらスムーズに解決することができた。AIをうまく使いこなせるようになると成長も早いだろうなと改めて思った。