Menu
CoddyTech

按钮与 onClick

本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 6 课,共 60 课。

GameObject > UI > Button - TextMeshPro 会添加一个按钮:一个可点击的图像、一个 Button 组件,以及一个用作标签的 Text (TMP) 子对象。Button 的 onClick 是一个事件,也就是一个方法列表,点击后松开时会调用列表中的方法。脚本会通过 AddListener 将自己的方法添加到列表中,并在 Start() 中添加一次。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,并传入它的返回值。由于它没有返回值,因此无法编译:参数 1:无法将类型 'void' 转换为 'UnityEngine.Events.UnityAction'。监听器不接受参数,并返回 void。如果在 Update() 中添加,同一个方法就会每帧再次加入列表,点击一次就会响几百次。只有点击按钮本身才算点击,而 Input.GetMouseButtonDown(0) 在任意位置被点击时都会为 true。

按钮的 interactable 属性决定它是否可以使用。bellButton.interactable = false; 会让按钮显示为禁用颜色,并且在它被设回 true 之前,不会调用它的监听器,这样玩家就能看出当前哪些按钮可以使用。在手机上,你可以点按相同的按钮。

challenge icon

挑战

简单

让电梯的“上”和“下”按钮正常工作。

  1. 在 Start() 中,使用 onClick.AddListener 将 upButton 连接到 GoUp(floor++),将 downButton 连接到 GoDown(floor--)。
  2. 编写 ShowFloor(),在 Start() 中以及每次移动后调用:电梯的 y 坐标为 floor * floorHeight,而 floorText 显示 Floor: 2。
  3. 当楼层低于 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 分别绑定到让电梯移动一层的方法
    }
}

打造真正的游戏中的所有课

自己练习: Unity 在线编辑器