[Unity] シンプルにボタンを作ってみる



Nプログラマです。

今回の内容は、とりあえずUGUIの機能でボタンを作ってみるという内容です。

まずは素直に作っていきましょう。

概要

作るものは、ボタンを押すとメッセージをコンソールに表示する、というものです。

こんな感じのレイアウトで、UGUIのButtonで作っていきます。

/img/article/2018/11/14/01.png
作成するメニューのボタンたち

ヒエラルキーの構造はこんな感じ。

/img/article/2018/11/14/02.png
メニューの下にぶらさがるボタンたち

Menuの下にボタンコンポーネント達がぶら下がっている構造です。

ソースコード

Editorディレクトリ

SampleInit.cs

ソースコードを開く

using UnityEditor;
using UnityEngine.UI;
using UnityEngine;

public class SampleInit
{
    [MenuItem("SampleTool/Init")]
    public static void CreateInit()
    {
        var goCanvas = GameObject.Find("Canvas");
        GameObject.DestroyImmediate(goCanvas);

        EditorApplication.ExecuteMenuItem("GameObject/UI/Button");
        var templateButton = GameObject.Find("Button"); // ExecuteMenuItemで作成されたボタン
        goCanvas = GameObject.Find("Canvas");
        // メニューゲームオブジェクトを作成
        var goMenu = new GameObject("Menu");
        goMenu.transform.SetParent(goCanvas.transform);
        goMenu.transform.localPosition = Vector3.zero;
        goMenu.AddComponent<Menu>();
        
        Vector2[] buttonPositions = {
            new Vector2(-200, 100),
            new Vector2(   0, 100),
            new Vector2( 200, 100),
            new Vector2(-200, 0),
            new Vector2(   0, 0),
            new Vector2( 200, 0),
        };
        for (int i = 0; i < buttonPositions.Length; i++)
        {
            var goButton = GameObject.Instantiate(templateButton, Vector3.zero, Quaternion.identity);
            var button = goButton.GetComponent<Button>();
            button.transform.SetParent(goMenu.transform);
            button.transform.localPosition = buttonPositions[i];

            button.name = "button" + i.ToString();
            var textComp = button.GetComponentInChildren<Text>();
            textComp.text = "button" + i.ToString();
        }
        
        GameObject.DestroyImmediate(templateButton); // コピー用オブジェクトを削除
    }
}

説明

Canvasゲームオブジェクトを削除するので、使用する時はサンプル用プロジェクトで試すようにお願い致します。

サンプルを使うため、シーン内のゲームオブジェクトやコンポーネントなどを設定する初期化スクリプトです。

使い方は、エディタ拡張によって表示されているUnityのメニューからSampleTool > Initをクリックします。

実行すると、概要のヒエラルキーの図にあるようにゲームオブジェクトが生成されます。

あとはインスペクタでButtonのOnClickの項目を設定すれば準備完了です。

ソースコードを開く

using UnityEngine;

public class Menu : MonoBehaviour
{
    public void OnClickMenu0()
    {
        Debug.Log("click menu 0");
    }

    public void OnClickMenu1()
    {
        Debug.Log("click menu 1");
    }

    public void OnClickMenu2()
    {
        Debug.Log("click menu 2");
    }

    public void OnClickMenu3()
    {
        Debug.Log("click menu 3");
    }

    public void OnClickMenu4()
    {
        Debug.Log("click menu 4");
    }

    public void OnClickMenu5()
    {
        Debug.Log("click menu 5");
    }
}

説明

ボタンが押された時に呼ばれるメソッドを定義しているクラスです。

それぞれ、コンソールにメッセージが表示されるというだけのシンプルな実装です。

これらのメソッドは、インスペクタの各Buttonコンポーネントで、OnClickにMenuがアタッチされたゲームオブジェクトと、呼び出すメソッドを登録することで呼び出されます。

/img/article/2018/11/14/03.png
各ボタンにOnClickの設定をする

実行結果

Unityで実行すると、ボタンが表示されます。

それぞれのボタンをクリックして、Consoleにそれぞれのボタンに対応した出力が表示されたらオッケーです。

表示されない時は、ボタンのOnClickの設定を確認してみてください。

考察

今の実装を見ていると、ボタンクリック専用のメソッドが多い感じがします。

ボタンが増えて来ると、ボタンの分だけメソッドがモリモリと増えてきて、メソッド名を考えるのも億劫になってきます。

OnClickだけにしたい!

というに思えてきたので、メソッドはOnClick一つにして、引数からどのボタンが渡されてきたのかを判定できるようにしたいですね。

まとめ

今回は、作りやすいボタンを作るための第一弾としてシンプルな作りで実装してみました。

要件を満たしていれば、このままの作りでもいいと思います。

次回は、これを改良してたくさんあるメソッドを一つにまとめる、という内容にしてみます。

それでは、このへんで。
バイナリー!



関連した記事