ボタンとonClick
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 6/56。
GameObject > UI > Button - TextMeshProはボタンを追加します。クリックする画像、Buttonコンポーネント、ラベル用のText (TMP)子オブジェクトです。ButtonのonClickはイベントで、ボタン上でクリックを離したときに呼び出すメソッドのリストです。スクリプトはStart()で一度、AddListenerを使って独自のメソッドをそのリストに追加します。ButtonはUnityEngine.UI名前空間にあります。
using UnityEngine;
using UnityEngine.UI;
public class Doorbell : MonoBehaviour
{
public Button bellButton;
private int rings;
void Start()
{
bellButton.onClick.AddListener(Ring);
}
void Ring()
{
rings++;
Debug.Log("Ding! " + rings);
}
}AddListener(Ring)は、括弧を付けずにメソッド自体を渡します。AddListener(Ring())ではRingをすぐに呼び出して、その戻り値を渡そうとしますが、戻り値は何もないためコンパイルできません。Argument 1: cannot convert from 'void' to 'UnityEngine.Events.UnityAction'。リスナーはパラメーターを取らず、voidを返します。Update()で追加すると、同じメソッドが毎フレームリストに再追加され、1回クリックしただけで何百回も鳴ります。クリックとして認識されるのはボタン自体の上でのクリックだけですが、Input.GetMouseButtonDown(0)はどこをクリックしてもtrueになります。
ボタンのinteractableは、ボタンを使えるかどうかを決めます。bellButton.interactable = false;にするとDisabled Colorで色が変わり、trueに戻すまでリスナーは呼び出されません。これにより、プレイヤーは今どのボタンが使えるかを確認できます。スマートフォンでは、同じボタンをタップします。
チャレンジ
簡単塔のリフトには、上ボタンと下ボタンがあります。Lift.csを作成します(シーンではupButton、downButton、floorTextがリンクされています):
Start()で、upButtonをリフトを1階上げるメソッドに、downButtonをリフトを1階下げるメソッドに接続します。- 階数は0から
topFloor(3)までです。リフトは y = 階数 xfloorHeight(3)の位置にあるため、2階では y は6です。xとzはそのままです。 - 開始時から、
floorTextに階数がFloor: 2のように表示されます。 - 最上階では上ボタンが操作できず、0階では下ボタンが操作できません。
Playを押し、最上階まで行って戻ってから、Checkを押します。
自分で試してみよう
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Lift : MonoBehaviour
{
public Button upButton;
public Button downButton;
public TMP_Text floorText;
public int topFloor = 3;
public float floorHeight = 3f;
private int floor;
void Start()
{
// upButtonとdownButtonを、エレベーターを1階分移動させるメソッドに紐付ける
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。