【Unity】オブジェクト指向を使ういいこと

オブジェクト指向を学ぶのに一番いいのは、いろいろなパターンでメリットを感じることです
今回は、UnityのUIテキスト表示をサンプルにとって確かめてみましょう
意外と知らず知らずのうちに使っているかもしれませんよ

オブジェクト指向を使わない場合

シーン構成

スコア(UI)切り替えのためのスクリプトコンポーネント追加

スコア(UI)表示オブジェクト

スクリプト

シミュレートとして、1キーを押したら1.12が表示され、2キーを押したら2.23が表示されるようにしています

using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            float point = 1.12f;
            GameObject.Find("Score").GetComponent<Text>().text = point.ToString();
        }

        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            float point = 2.23f;
            GameObject.Find("Score").GetComponent<Text>().text = point.ToString();
        }
    }
}

解説

もし、キーボードの「1」が押されたときという条件式です

if (Input.GetKeyDown(KeyCode.Alpha1))

シーン上のScoreオブジェクトにアタッチされているTextコンポーネントのtextプロパティの値を指します
(難しいと感じられる方は、スコアの表示のところを指すと思ってもらうだけでいいです)

GameObject.Find("Score").GetComponent<Text>().text

表示を変更したいとします

さあ、ここで表示の変更をしたいと考えたとします
変更は、このままの小数表示から小数1桁までの表示に変えたいとします

point.ToString();

これを次のようにすれば、小数1桁として表示してくれます

 $"{point:F1}";

全体の変更は、2箇所ですね
パッとみて変更箇所もわかるし、別に数秒で終わるのでこれでもいいように思います
これはシミュレーションなので短く書いていますが、これが複数の箇所、また複数のスクリプトにあった場合、どうでしょうか?検索で探して変更しますか?目で探しますか?テストはどうしますか?
今後、追加変更したいときも同じことを繰り返しますか?

では、オブジェクト指向にした場合をみていきましょう

オブジェクト指向を使った場合

シーン構成

スコア(UI)表示オブジェクト

表示のためのスクリプトを追加します

スクリプト

Testスクリプトの変更をします
直接、UIのテキストを表示しているところをScore表示用のスクリプトのメソッドを呼び出しているところに注目してください

using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            float point = 1.12f;
            GameObject.Find("Score").GetComponent<ScoreViewer>().View(point);
        }

        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            float point = 2.23f;
            GameObject.Find("Score").GetComponent<ScoreViewer>().View(point);
        }
    }
}

UI表示用のスクリプトを追加します
ViewメソッドはUIのテキスト表示を担っていますが、ここで小数点以下の表示桁数を決めています

using UnityEngine;
using UnityEngine.UI;

public class ScoreViewer : MonoBehaviour
{
    public void View(float score)
    {
        GetComponent<Text>().text = $"{score:F1}";
    }
}

表示を変更したいとします

どうでしょうか
前と同じように小数点の表示桁数を変更したいとき、ScoreViewerスクリプトを変更すればいいですね
Unityではスクリプトと呼んでいますが、C#のクラスから作成されるインスタンスを使っているのです

どこがオブジェクト指向だったの?

C#的に考えますね
ScoreViewerクラスを追加しましたね。このクラス名からもわかるように「スコアを表示する」お仕事だけをさせているクラスになります。言い換えるとスコアを表示するために必要とする情報、振る舞いだけを記述するようにします
メリットとして、スコアの表示関係の変更や修正をしたいとき、このファイルだけを確認すればいいということが挙げられますね。時短にもなりますし、他のファイルへの影響がありませんね。

今回は一例ですが、このようにいつも考えることによって、1つのクラスに何でもかんでも詰め込むことがなくなって、頭が混乱しなくなります。特にいろいろなことをさせたいアプリを作る場合、大切なことですね。
オブジェクト指向を使わないでも動作はするでしょう。1回ポッキリのアプリならそれでもいい場合もありますが、膨らませたい(拡張したい。いろいろ機能を追加したい)場合には、闇雲に作っていくと、混乱し出してやる気もなくなります。オブジェクト指向は、必要とする機能をバラバラに作って、それらを組み合わせて全体を構成する手法と言えるでしょう
オブジェクト指向を使って楽にコードを書くようにしましょう

クラス図

おまけ

コード

Unityの場合、コードは次のように記述すると良いでしょう
GameObject.FindとGetComponentはアウトレット接続で登録できます

using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField]
    ScoreViewer scoreViewer;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            float point = 1.12f;
            scoreViewer.View(point);
        }

        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            float point = 2.23f;
            scoreViewer.View(point);
        }
    }
}
using UnityEngine;
using UnityEngine.UI;

public class ScoreViewer : MonoBehaviour
{
    [SerializeField]
    Text scoreText;

    public void View(float score)
    {
        scoreText.text = $"{score:F1}";
    }
}

シーン構成

アウトレット接続は、ドラッグ&ドロップで登録することを指します

C#,UI,Unity

Posted by hidepon