ボタンとonClick
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 6/60。
GameObject > UI > Button - TextMeshProを追加すると、ボタンが作成されます。クリックするためのImage、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に戻すまでリスナーは呼び出されません。これにより、プレイヤーは今どのボタンが使えるのかを確認できます。スマートフォンでは、同じボタンをタップします。
チャレンジ
簡単リフトの「上へ」ボタンと「下へ」ボタンを動作させましょう。
Start()で、onClick.AddListenerを使ってupButtonをGoUp(floor++)に、downButtonをGoDown(floor--)に結び付けます。Start()内と移動のたびに呼び出すShowFloor()を書きます。リフトのy座標はfloor * floorHeightで、floorTextにはFloor: 2と表示されます。- 「上へ」ボタンは
topFloorより下の階で、「下へ」ボタンは0より上の階で操作できます。
「プレイ」を押すと、最上階で「上へ」ボタンが灰色になります。その後、「確認」を押します。
自分で試してみよう
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階分移動させるメソッドに紐付ける
}
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド