按钮与 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 之前,不会调用它的监听器,这样玩家就能看出当前哪些按钮可以使用。在手机上,你可以点按相同的按钮。
挑战
简单让电梯的“上”和“下”按钮正常工作。
- 在
Start()中,使用onClick.AddListener将upButton连接到GoUp(floor++),将downButton连接到GoDown(floor--)。 - 编写
ShowFloor(),在Start()中以及每次移动后调用:电梯的 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 分别绑定到让电梯移动一层的方法
}
}
打造真正的游戏中的所有课
自己练习: Unity 在线编辑器