Help us understand the problem. What is going on with this article?

[基礎知識]uGUIの操作時に処理を実行する方法

基本

とりあえず動かすための方法。
本当にとりあえず動かすためなので、設計的なヤバさは無視する。

実装

  1. 実装したい処理を持つ関数を作成。
Sample.cs
using UnityEngine;

public class Sample : MonoBehaviour
{
    // 必ずpublicにする
    public void Action()
    {
        Debug.Log("アクションが発生しました", this);  
    }
}

 
2. 作成したコンポーネントを、シーン内のゲームオブジェクトにアタッチします。
今回はあえて Button とは別のゲームオブジェクトにアタッチしています。
スクリーンショット 2018-11-28 21.39.05.png
3. 関数を呼び出す側に、関数を登録するエリアを作ります。
今回は Button なので Button(Script) 内の OnClick() の欄になります。
スクリーンショット 2018-11-28 21.45.37.png
4. 2 でコンポーネントをアタッチしたゲームオブジェクトを、3 で作成したエリアの None(Object) にドラッグ&ドロップします。
スクリーンショット 2018-11-28 21.45.48.png
5. 今設定した場所の右にある No Function と書いてある項目をクリックし、その中から呼び出したい関数を選択します。
スクリーンショット 2018-11-28 21.45.56.png

実行

今回の場合、以下のような文がConsoleタブに表示されればよい。

スクリーンショット 2018-11-28 22.10.17.png

応用

基本的な実装の他にも可能な設定方法。

応用1 引数つきの関数を、値を指定して実行する

引数つきの関数を登録することもできる。

Sample.cs
using UnityEngine;

public class Sample : MonoBehaviour
{
    public void Action( string value )
    {
        Debug.Log(value, this);
    }
}

先ほどと同じ関数名で、引数に string型 の値を設定できる関数を作成。
同じ手順で登録しようとすると、今回は()内に string と書かれた関数が表示される。
スクリーンショット 2018-11-28 22.30.58.png
選択すると関数名の下に、引数と同じ型の値を入れられる枠ができる。
スクリーンショット 2018-11-28 22.31.08.png
枠に適当な値を設定し実行する事で、関数に値を渡すことができる。
スクリーンショット 2018-11-28 22.31.21.png
スクリーンショット 2018-11-28 22.49.08.png

応用2 各コンポーネントのもつ Value を渡して実行する

Toggle や Slider といった一部のコンポーネントは何かしらの型の Value を持っているものがあります。
それらの型と一致する引数をもった関数を登録する事で、それぞれのコンポーネントが持つ Value を関数に渡して実行することができます。
今回は Slider を使用して確認します。

Slider(Script) を見ると Button 同様、関数を登録できる場所があります。
Button の時は OnClick() であったのに対し、 Slider は OnValueChanged( Single ) と引数部に型が書かれています。
※ Single とは float の事をさします。float は Single のエイリアス(別名)です。

スクリーンショット 2018-11-28 23.05.47.png

この引数部の型と同じ引数の型を持った関数を作り、登録しようとすると、選択項目に特殊な欄が出てきます。

Sample.cs
public class Sample : MonoBehaviour
{
    public void Action( float value )
    {
        Debug.Log(value, this);
    }
}

スクリーンショット 2018-11-28 23.13.53.png
先ほどまでとは違い、関数名に () がついていません。
こちらを選択することで、引数に Slider のもつ Value を渡すことができます。
スクリーンショット 2018-11-28 23.22.16.png
※Slider の設定をデフォルトのまま実行した場合の実行結果。

応用3 スクリプト上から実装する

ここまで紹介した方法では、関数をpublicにしないといけない。
しかし設計的にヤバい時もあるため、privateな関数か、ラムダ式で処理を渡したい場合もある。

Sample.cs
using UnityEngine.UI;    // UI関連コンポーネントを使うのに必要

public class Sample : MonoBehaviour
{
    [SerializeField]
    private Button _button;

    void Start()
    {
        // privateな関数を渡す場合
        _button.onClick.AddListener(OnClickAction);

        // ラムダ式で渡す場合
        _button.onClick.AddListener(() => Debug.Log("ラムダ式"));
    }

    private void OnClickAction(){ Debug.Log("privateなメソッド"); }
}

この方法には幾つかのメリットがある。
1. 1つのゲームオブジェクトで管理が出来るようになるため、エディタ上で設定する手間が減る。
2. UIに割り当てた処理を、実行中に変更したり、増やしたりできる。
3. 基礎~応用2までの事は全部これで出来る。
4. 関数の名前を考える手間が減る。(ラムダ式の場合)
他の書き方もあるが正直面倒臭いし、宗教戦争が始まるので手間が増えたり、少々見づらくなったりするので、2つだけ紹介した。

補足

  • C# 7に対応していれば、ローカル関数も使用可能。
  • デフォルトで Runtime Only と書かれている場所は、どのタイミングで呼ばれるかの設定をする場所。
    • Off
      実行されない。
    • Editor And Runtime
      シーン実行時、またはシーン未実行時に Value を書き換えたとき。
    • Runtime Only
      シーン実行時のみ。

実行確認環境

  • Unity [2018.2.17f1 以上]
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away