버튼과 onClick
Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 60개 중 6번째.
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을 즉시 호출하고 반환값을 전달하려 하지만, Ring은 아무것도 반환하지 않으므로 컴파일되지 않습니다. 오류: Argument 1: cannot convert from 'void' to 'UnityEngine.Events.UnityAction'. 리스너는 매개변수를 받지 않고 void를 반환합니다. Update()에서 추가하면 같은 메서드가 매 프레임마다 목록에 다시 추가되어 클릭 한 번에 수백 번 벨이 울립니다. 클릭은 버튼 자체에서만 인식되지만, Input.GetMouseButtonDown(0)은 어디서든 클릭하면 true가 됩니다.
버튼의 interactable은 버튼을 사용할 수 있는지 결정합니다. bellButton.interactable = false;로 설정하면 버튼이 비활성화 색으로 바뀌고, 다시 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을 리프트를 한 층 이동시키는 메서드에 연결합니다
}
}
실제 게임 만들기의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드