Carrot
본문 바로가기
Unity/멋쟁이사자처럼 부트캠프

[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(16일차) - UI 활용 및 C# 기초 학습(8)

by 독기품은토끼 2025. 6. 5.
✅ 오늘의 학습 목표
1. Game Over / Input Field 구현
2. 도어락 UI 구현
3. C# 기초 학습 (8) - 반복문

1. Cat

1. 게임오버 구현

게임 인트로를 구현했으니 이제 게임 오버도 구현 고고!

 

1.1. 오브젝트

  • 빈 게임 오브젝트를 생성하고, 그 하위에 게임 오버 애니메이션을 구현해 줄 이미지를 생성한다.
  • 이미지의 알파값을 0으로 설정하고, 화면에 모두 확장될 수 있도록 스트레치를 적용해 준다.
  • 애니메이션을 생성해서 2초 구간에 알파값을 255로 수정해 준다.

1.2. 코드

using UnityEngine;

public class ColliderEvent : MonoBehaviour
{
    // 게임 오버 UI
    public GameObject fadeUI;

    private void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            // 게임 오버 UI
            fadeUI.SetActive(true);

            Debug.Log("Game Over");
        }
    }
}

 

고양이 오브젝트가 파이프에 닿으면 게임을 종료시키기 위해서

지금 만든 Fade 오브젝트를 활성화시켜준다.

 

1.3. 유니티 에디터

 

콜라이더 이벤트 스크립트에 Fade 이미지를 넣어주고,

fade 이미지는 게임 시작 시 보이지 않아야 하니까 비활성화해준다.

 

2. 고양이 이름

기존에 고양이 이름표를 만들었었는데, 고양이 이름을 수동으로 '검은 고양이'라고 입력을 해주었었다.

이걸 이제 사용자 입력 값으로 바꿔보자!

 

2.1. 오브젝트

 

이 기능을 구현하기 위해서 UI - Input Field를 사용해 줄 것이다.

 

 

해당 UI를 생성하면 Text Area가 함께 생성되는데 그 기능들은 아래와 같다.

  • Placeholder - 입력 유도 텍스트 (안내 문구)
  • Text - 사용자 입력을 받는 텍스트

 

Input Field 오브젝트를 선택하고

인스펙터 창 아래로 내리다 보면 Input Field Setting에서 글자수를 제한을 할 수 있다.

 

2.2. 코드 

🥕 예행 작업
Script 생성 (UIManager)
using TMPro;
using UnityEngine;
using UnityEngine.UI;

namespace Cat
{
    public class UIManager : MonoBehaviour
    {
        public TMP_InputField inputField;
        public TextMeshProUGUI nameTextUI;

        public Button startButton;

        public void OnStartButton()
        {
            bool isNoText = inputField.text == "";

            if (isNoText)
            {
                Debug.Log("입력된 텍스트 없음");
                startButton.interactable = false;
            }
            else
            {	
            	Debug.Log($"{nameTextUI.text} 입력");
                startButton.interactable = true;
                nameTextUI.text = inputField.text;
            }
        }
    }
}

 

 

사용자가 입력한 텍스트가 고양이 오브젝트의 이름표에 반영되어야 하므로 각각의 오브젝트를 알맞게 지정해 준다.

 

 

그리고 버튼이 캔버스의 UIManager에 접근해서

버튼을 클릭했을 때 해당 OnStartButton() 메소드(이벤트)가 실행되도록 설정해 주었다.

 

 

Intro 오브젝트는 비활성화되어있고, Intro 오브젝트 안에 Button이 있어서 에러가 발생할 수 있으므로 메서드의 실행 순서를 수정해 주었다.

 

2.3. 보완 작업

OnClick 메서드가 많아지면 관리가 어려워질 수 있으니 이 부분도 Manager을 통해서 관리해 보자

using TMPro;
using UnityEngine;
using UnityEngine.UI;

namespace Cat
{
    public class UIManager : MonoBehaviour
    {
        public GameObject playObj;
        public GameObject introUI;

        public TMP_InputField inputField;
        public TextMeshProUGUI nameTextUI;

        public Button startButton;

        void Start()
        {
            // 유니티 인스펙터 창에서 넣지 않고 코드로 넣어주는 방법
            startButton.onClick.AddListener(OnStartButton);
        }

        public void OnStartButton()
        {
            bool isNoText = inputField.text == "";

            if (isNoText)
            {
                Debug.Log("입력된 텍스트 없음");
                // startButton.interactable = false;
            }
            else
            {
                playObj.SetActive(true);
                introUI.SetActive(false);

                // startButton.interactable = true;
                Debug.Log($"{nameTextUI.text} 입력");
                nameTextUI.text = inputField.text;
            }
        }
    }
}

 

이렇게 코드를 수정해 준 후 각 오브젝트를 지정해 주면 OnClick 메서드에 계속 추가할 필요 없이

스크립트를 통해서 조정이 가능하다.

 

기존 OnClick 메소들은 모두 Off 시켜줘야 원하는 대로 작동되니 참고바람!

 

2.4. 결과

 

텍스트를 입력하지 않으면 게임이 시작되지 않고

텍스트가 입력되면 게임이 시작되고 입력한 값이 고양이 이름표에 잘 반영되는 것을 확인할 수 있다.

 

2. Door Lock

UI를 통해서 도어락을 만들어보자.

 

1. 오브젝트

 

기존에 만들었던 DoorAnimation 씬을 열은 후

캔버스를 생성하여 도어락 UI를 만든다.

 

 

도어락은 일정한 간격으로 버튼이 있으니 Grid Layout Group 컴포넌트를 활용해서 버튼을 균일하게 배치해 보자

나는 왼쪽 상단을 기준으로 패딩값을 조절해 주었고, 열을 기준으로 3칸 이상 배치되지 않도록 Constraint를 설정해 주었다.

 

 

그런데 그리드 레이아웃 그룹 컴포넌트를 이용하면 버튼의 크기를 조절할 수 없다.

그래서 Enter 버튼은 Keypad Group 자식으로 생성하지 않고 [image] Backgroud 자식으로 생성해 주면 된다.

버튼 배치는 인스펙터 창에서 조절해 준다.

 

2. 코드

🥕 예행 작업
Script 생성 (NumberKeyPad)
using UnityEngine;

public class NumberKeyPad : MonoBehaviour
{
    public string password;
    public string keyPadNumber; // 입력한 숫자

    public void OnInputNumber(string numString)
    {

    }

    public void OnCheckNumber()
    {
        
    }
}

 

우선 함수를 두 개 생성해 주고 해당 스크립트를 Canvas에 적용시켜 준다.

 

 

[OnClick() 메서드 추가]

  • 0~9 버튼 : OnInputNumber
  • Enter 버튼 : OnCheckNumber

 

그리고 각 버튼마다 입력값을 추적하기 위해서 버튼 숫자에 맞게 Input 값을 넣어준다.

 

Tip⭐ Alt 누른 채로 토글을 클릭하면 전부 다 펼치거나 접을 수 있다.

 

비밀번호가 맞았을 때에만 문이 열리도록 하기 위해서 기존에 만든 door 스크립트를 수정해 준다

using UnityEngine;

public class DoorEvent2 : MonoBehaviour
{
    private Animator animator;

    // 도어락
    public GameObject doorLockUI;

    public string openKey;
    public string closeKey;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            doorLockUI.SetActive(true);
            // animator.SetTrigger(openKey);
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            doorLockUI.SetActive(false);
            // animator.SetTrigger(closeKey);
        }
    }
}

 

캐릭터가 다가가면 door Lock이라는 오브젝트가 활성화되도록 설정해 주었다.

이제 애니메이션은 비밀번호가 맞았을 때에만 수행되어야 하므로 NumberKeyPad에서 구현해 줄 것이다.

 

using UnityEngine;

public class NumberKeyPad : MonoBehaviour
{
    public Animator doorAnim;
    public GameObject doorLock;

    public string password;
    public string keyPadNumber; // 입력한 숫자

    public void OnInputNumber(string numString)
    {
        keyPadNumber += numString;

        Debug.Log($"{numString} 입력되었습니다.\n전체 입력 : {keyPadNumber}");
    }

    public void OnCheckNumber()
    {
        if (keyPadNumber == password)
        {
            Debug.Log("문 열림");

            doorAnim.SetTrigger("Door Open");
            
            doorLock.SetActive(false);
        }
        else
        {
            Debug.Log("비밀번호 오류");
        }
    }
}

 

Animator 추가 후 열리고 닫힐 문을 지정해 주고

비밀번호가 맞았을 때에는 키패드가 사라져야 하니 Door Lock라는 오브젝트를 생성 후 Door Lock (키패드 UI)를 지정해 주었다.

 

 

비밀번호가 맞으면 키패드가 사라지고 문이 열리는 것을 확인할 수 있다!

 

3. Mouse Event

🥕 예행 작업
1. Scene 생성 (Study Loop)
2. Script 생성 (ObjectMouseEvent)

 

마우스 위치에 따른 유니티 동작을 확인해보려고 한다.

using UnityEngine;

public class ObjectMouseEvent : MonoBehaviour
{
    void OnMouseEnter()
    {
        Debug.Log("Mouse Enter");
    }

    void OnMouseOver()
    {
        Debug.Log("Mouse Over");
    }

    void OnMouseDown()
    {
        Debug.Log("Mouse Down");
    }

    void OnMouseDrag()
    {
        Debug.Log(Input.mousePosition);
        Debug.Log("Mouse Drag");
    }

    void OnMouseUp()
    {
        Debug.Log("Mouse Up");
    }

    void OnMouseUpAsButton()
    {
        Debug.Log("Mouse UpAsButton");
    }

    void OnMouseExit()
    {
        Debug.Log("Mouse Exit");
    }
}

 

큐브 오브젝트를 생성한 후 위 스크립트를 적용시켜 준 후 각 메서드가 무엇을 의미하는지 확인해 보자

메소드 이름 동작
OnMouseEnter() 마우스 커서가 오브젝트 위로 처음 들어왔을 때 한 번 호출됨
OnMouseOver() 마우스가 오브젝트 위에 계속 머무는 동안 매 프레임 호출됨
OnMouseDown() 오브젝트 위에서 마우스 버튼을 누르는 순간 호출됨
OnMouseDrag() 마우스를 누른 채 움직일 때 호출됨 (드래그 상태)
OnMouseUp() 오브젝트 위에서 마우스를 눌렀다가 뗐을 때 호출됨
OnMouseUpAsButton() 마우스를 눌렀다가 뗐을 때, 누른 위치와 뗀 위치가 모두 오브젝트 위에 있을 경우에만 호출됨 (즉, 클릭과 비슷한 조건)
OnMouseExit() 마우스 커서가 오브젝트 영역에서 벗어났을 때 한 번 호출됨

 

 

유니티 버전 때문에 Mouse 메서드가 입력되지 않을 수 있다.

이럴 때에는 Project Settings > Player > Other Settings > Active Input Handling 값을 Both로 변경해 주면 된다

 

4. 반복문

우리가 반복문을 한 번도 안 해봤던가? 암튼 반복문 기초에 대해 학습하기로 한다.

 

1. While

조건이 성립하는 동안 계속 실행하는 문법

using UnityEngine;

public class WhileLoop : MonoBehaviour
{
    public int count = 0;

    void Start()
    {
        while (count < 10)
        {
            count++;
            Debug.Log(count);
        }
    }
}

 

 

쏘 큐트한 코드.. 

// 무한 반복문
While (true)

 

2.  do - while

조건이 성립하지 않아도 do - while 문은 한번 실행된다.

using UnityEngine;

public class WhileLoop : MonoBehaviour
{
    public int count = 8;

    void Start()
    {
        do
        {
            count++;
            Debug.Log(count);
        }
        while (count < 7);
    }
}

 

 

3. Break

반복문을 빠져나오는 기능

using UnityEngine;

public class WhileLoop : MonoBehaviour
{
    private int count = 0;

    void Start()
    {
        while (count < 10)
        {
            count++;
            Debug.Log(count);

            if (count == 5)
            {
                break;
            }
        }
    }
}

 

 

4. Continue

코드의 흐름을 다음 반복문의 시작 위치로 이동하는 기능

using UnityEngine;

public class WhileLoop : MonoBehaviour
{
    private int count = 0;

    void Start()
    {
        while (count < 10)
        {
            count++;

            if (count == 5)
            {
                continue;
            }

            Debug.Log(count);
        }
    }
}

 

 

continue에 의해서 count가 5일 때, Debug.Log 명령어가 실행되지 않고

다시 While 반복문의 시작 위치로 이동됨

 

4.1. 369 게임

using UnityEngine;

public class WhileLoop : MonoBehaviour
{
    private int count = 0;

    void Start()
    {
        while (count <= 10)
        {
            count++;

            if (count % 3 == 0)
            {
                Debug.Log("박수 짝!");
                continue;
            }

            Debug.Log(count);
        }
    }
}

 

 

 


 

 

이번주는 월, 화, 금 휴무라 2번만 수업을 들었다.. 완전 신나!!

연휴 때 밤낮이 좀 바뀌어버리는 바람에 수업 내내 좀 많이 졸아버렸는데 다행히 잘 따라간 거 같다..

 

이번주 또 푹 쉬고 담주부터 아좌좌 힘내봅시당!!