Menu
CoddyTech

람다

Coddy Unity 여정의 실제 게임 만들기 섹션에 포함된 레슨. 56개 중 7번째.

AddListener는 매개변수가 없는 메서드를 받습니다. 클릭 시 색상을 받는 Paint(Color.red)를 호출하려면 메서드를 그 자리에서 작성합니다: () => Paint(Color.red). 이것은 이름이 없는 메서드인 람다입니다. ()에는 매개변수가 들어가며, 여기서는 매개변수가 없습니다. => 뒤에는 본문이 옵니다. 문 하나이거나 여러 문을 위한 { } 블록입니다:

public Button redButton;
public Button blueButton;
public Button resetButton;
public Renderer lamp;
private int changes;

void Start()
{
    redButton.onClick.AddListener(() => Paint(Color.red));
    blueButton.onClick.AddListener(() => Paint(Color.blue));
    resetButton.onClick.AddListener(() =>
    {
        changes = 0;
        lamp.material.color = Color.white;
    });
}

void Paint(Color color)
{
    lamp.material.color = color;
    changes++;
}

하나의 Paint 메서드가 두 색상 버튼 모두에서 사용되며, 각 람다는 각자의 색상을 전달합니다. 람다는 사용하는 변수를 캡처합니다. 변수의 값을 복사하는 것이 아니라 실행될 때 그 값을 읽습니다. 재설정 람다는 Start()가 끝나고 한참 뒤에도 클릭할 때마다 필드 changes를 설정합니다.

이 때문에 반복문에서 문제가 생길 수 있습니다. swatches[i].onClick.AddListener(() => Paint(colors[i]));에서는 모든 람다가 같은 i를 캡처하고, 누군가 클릭할 때쯤이면 반복문이 끝나 i는 colors.Length와 같아집니다. 따라서 모든 색상 견본에서 IndexOutOfRangeException이 발생합니다. 반복문 안에서 선언한 변수는 반복할 때마다 새로 만들어지므로, i를 그 변수에 복사한 뒤 복사본을 캡처합니다:

for (int i = 0; i < swatches.Length; i++)
{
    int index = i;
    swatches[i].onClick.AddListener(() => Paint(colors[index]));
}
challenge icon

챌린지

쉬움

금고는 세 자리 코드로 열립니다. Keypad.cs에는 화면에 표시된 코드에 숫자를 추가하고, 세 자리가 입력되면 문을 열거나 Wrong을 표시하는 Press(int digit)와 지금까지 입력한 내용을 표시하는 ShowCode()가 이미 있습니다. Start()에서 버튼을 연결하세요:

  • keys에는 순서대로 네 개의 숫자 버튼이 들어 있습니다. keys[0]은 1, keys[1]은 2, keys[2]는 3, keys[3]은 4를 입력합니다. for 루프에서 각 버튼을 Press를 호출하는 람다로 연결하세요.
  • clearButton은 하나의 람다로 지금까지 입력한 코드(entered)를 비우고 ShowCode()로 표시합니다.

코드는 312입니다. 플레이를 눌러 금고를 연 다음 확인을 누르세요.

직접 해보기

using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class Keypad : MonoBehaviour
{
    public Button[] keys;
    public Button clearButton;
    public TMP_Text codeText;
    public GameObject door;
    public string secret = "312";
    private string entered = "";

    void Start()
    {
        ShowCode();
        // 각 키를 해당 숫자를 인자로 전달하는 Press에 연결하고, clearButton을 코드 지우기 기능에 연결합니다
    }

    void Press(int digit)
    {
        entered += digit;
        ShowCode();
        if (entered.Length == 3)
        {
            if (entered == secret)
            {
                door.SetActive(false);
                codeText.text = "Open";
            }
            else
            {
                codeText.text = "Wrong";
            }
            entered = "";
        }
    }

    void ShowCode()
    {
        codeText.text = "Code: " + entered;
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

실제 게임 만들기의 모든 레슨