버튼과 onClick
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 6번째.
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()에서 추가하면 같은 메서드가 매 프레임마다 목록에 다시 추가되어 클릭 한 번에 수백 번 울립니다. 클릭은 버튼 자체에서만 인식되지만, Input.GetMouseButtonDown(0)은 어디서든 클릭하면 true가 됩니다.
버튼의 interactable은 버튼을 사용할 수 있는지 결정합니다. bellButton.interactable = false;로 설정하면 Disabled Color로 색이 바뀌고, 다시 true로 설정할 때까지 리스너가 호출되지 않으므로 플레이어는 현재 어떤 버튼이 작동하는지 알 수 있습니다. 휴대폰에서는 같은 버튼을 탭합니다.
챌린지
쉬움타워의 엘리베이터에는 위로 및 아래로 버튼이 있습니다. Lift.cs를 작성하세요(씬에서 upButton, downButton, floorText를 연결합니다).
Start()에서upButton을 엘리베이터를 한 층 올리는 메서드에 연결하고,downButton을 한 층 내리는 메서드에 연결하세요.- 층은 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을 엘리베이터를 한 층 이동시키는 메서드에 연결합니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.