본문 바로가기

Unity 개발 공부

[내일배움캠프] 10일차 공통과제 오목 - 메인메뉴 (25.04.03)

오목 게임의 시작화면을 기획하고, 코드를 간략하게 짜보았다.

기획: 진안

  1. 앱을 실행하면 최상단에 게임 이름
  2. 매칭하기 버튼을 누르면 매칭중… 버튼으로 바뀌며 상대를 찾는다. 상대를 찾으면 인게임 scene으로 넘어간다.
  3. 매칭중… 버튼을 한번더 누르면 매칭하기 버튼으로 바뀌며 매칭이 취소된다.
  4. 스킬관리 버튼을 누르면 스킬관리 Scene으로 넘어간다.
  5. 종료버튼을 누르면 앱이 종료된다.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;

public class MainSceneManager : MonoBehaviour
{
    [SerializeField] private Text gameTitleText;
    //SerializeField는 private 필드여도 인스펙터 창에서 설정가능하게만든다. 각 필드를 선언
    [SerializeField] private Button matchButton;
    [SerializeField] private Button skillButton;
    [SerializeField] private Button exitButton;

    private bool isMatching = false;
    // 매칭상태를 끄고키는 스위치처럼 쓸 변수 선언 후 꺼진상태로 할당.
    private Coroutine matchingCoroutine;
    // 코루틴 타입의 matchingCouroutine 이라는 변수를 선언하여, 
    // 해당 변수가 코루틴으로 진행할 함수를 시작, 멈출 수 있게 만든다.

    void Start()
    {
        gameTitleText.text = "Super 스킬 오목"; // 게임 제목
        matchButton.onClick.AddListener(OnMatchButtonClicked); 
        // 해당 버튼 누를시 OnMatchButtonClicked라는 함수 호출
        // AddListener의 경우 UI 의 상호작용 이벤트들에(onClick 같은) 접근하여
        // 소괄호 안의 매개변수를 호출한다. 여기서는 함수 호출 
        skillButton.onClick.AddListener(OnSkillButtonClicked);
        exitButton.onClick.AddListener(OnExitButtonClicked);
    }

    private void OnMatchButtonClicked() // 매칭버튼 메서드
    {
        if (!isMatching) // 매칭스위치가 꺼져있다면,
        {
            // 매칭 시작: 버튼 텍스트 변경 및 코루틴 시작
            isMatching = true; // 매칭스위치 상태전환
            matchButton.GetComponentInChildren<Text>().text = "매칭중…"; 
            //matchButton이라는 버튼객체의 자식 객체의 컴포넌트 Text 항목을 찾아서 .text로 접근
            //"매칭하기" -> "매칭중..." 으로 수정해버림
            matchingCoroutine = StartCoroutine(WaitAndLoadInGame());
            //코루틴 변수 matchingCoroutine은 WaitAndLoadInGame이라는 메서드를 실행한다.
        }
        else // 매칭스위치가 켜져있다면
        {
            // 매칭 취소: 상태 초기화 및 버튼 텍스트 원복
            isMatching = false; // 매칭스위치 상태전환
            matchButton.GetComponentInChildren<Text>().text = "매칭하기";
            if (matchingCoroutine != null) 
            // 매칭코루틴이라는 코루틴변수가 할당이 되어있다면, 즉 매칭중이라면
            {
                StopCoroutine(matchingCoroutine); // 매칭코루틴 정지한다.
                matchingCoroutine = null; // 비어있는 기본값을 할당한다.
            }
        }
    }

    private IEnumerator WaitAndLoadInGame() //  IEnumerator 타입의 코루틴 함수
    {
        // 매칭 진행을 보여주기 위해 3초 대기 (예시) 실제로는 서버의 매칭 로직에 따라서 제작할것.
        yield return new WaitForSeconds(3f);

        // 매칭이 완료되었고, 취소되지 않은 경우에만 씬 전환
        if (isMatching)
        {
            SceneManager.LoadScene("BattleScene"); // 배틀씬으로 넘어가기.
        }
    }

    private void OnSkillButtonClicked() // 스킬버튼을 누르면 호출하기로되어있는 메서드
    {
        SceneManager.LoadScene("SkillScene"); // 스킬관리페이지로
    }

    private void OnExitButtonClicked() // 종료버튼을 누르면 호출하기로 되어있는 메서드
    {
        Application.Quit(); // 종료
    }
}