김김김의 게임개발
  • 유니티 게임개발 - 게임 개발 심화 팀 과제 #3
    2023년 10월 17일 21시 39분 19초에 업로드 된 글입니다.
    작성자: noun06

    메모리 게임을 토대로 새로운 미니 게임을 구현하였다. 이 게임은 플레이어가 버튼 패턴을 따라 클릭하는 게임이다. 플레이어가 선택한 버튼 순서를 추적하는 리스트를 선언하고 플레이어가 버튼을 클릭할 때 호출되는 AddToPlayerSequenceList를 통해 버튼 id를 받아와서 리스트에 추가한다. 그 다음 실제 게임에서의 패턴과 플레이어의 패턴을 비교하여 성공 혹은 실패를 판정한다. 성공했을 때는 점수를 올리고 다음 라운드를 시작하는 메서드를 호출하여 게임을 지속한다. 

    using System.Collections;
    using System.Collections.Generic;
    using TMPro;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class MemoryGameManager : MonoBehaviour
    {
        //[SerializeField] private List<AudioClip> buttonSoundsList;
        [SerializeField] private Sprite normalSprite;
        [SerializeField] private Sprite highlightSprite;
        [SerializeField] private List<Button> clickableButtons;
        //[SerializeField] private AudioClip loseSound;
        //[SerializeField] private AudioSource audioSource;
        [SerializeField] private CanvasGroup buttons;
        [SerializeField] private Button startButton;
        [SerializeField] private TextMeshProUGUI scoreText;
    
        private List<int> playerTaskList = new List<int>();
        private List<int> playerSequenceList = new List<int>();
    
        private float highlightDuration = 0.1f;
        private int score = 0;
    
        private void Awake()
        {
            ResetButtonImages();
            UpdateUI();
        }
    
        public void AddToPlayerSequenceList(int buttonID)
        {
            playerSequenceList.Add(buttonID);
            StartCoroutine(HighlightButton(buttonID));
    
            int minLength = Mathf.Min(playerTaskList.Count, playerSequenceList.Count);
            for (int i = 0; i < minLength; i++)
            {
                if (playerTaskList[i] != playerSequenceList[i])
                {
                    StartCoroutine(PlayerLost());
                    return;
                }
            }
    
            if (playerSequenceList.Count == playerTaskList.Count)
            {
                ScoreRound();
                StartCoroutine(StartNextRound());
            }
        }
    
        private void ScoreRound()
        {
            score++;
            UpdateUI();
        }
    
        private void UpdateUI()
        {
            scoreText.text = score.ToString();
        }
    
        private IEnumerator HighlightButton(int buttonID)
        {
            clickableButtons[buttonID].image.sprite = highlightSprite;
            //audioSource.PlayOneShot(buttonSoundsList[buttonID]);
            yield return new WaitForSeconds(highlightDuration);
            clickableButtons[buttonID].image.sprite = normalSprite;
            yield return new WaitForSeconds(1f);
        }
    
        private IEnumerator PlayerLost()
        {
            //audioSource.PlayOneShot(loseSound);
            playerSequenceList.Clear();
            playerTaskList.Clear();
            yield return new WaitForSeconds(2f);
            startButton.gameObject.SetActive(true);
            buttons.interactable = false;
        }
    
        private IEnumerator StartNextRound()
        {
            playerSequenceList.Clear();
            buttons.interactable = false;
            yield return new WaitForSeconds(1f);
    
            int newPattern = Random.Range(0, 4);
            playerTaskList.Add(newPattern);
    
            for (int i = 0; i < playerTaskList.Count; i++)
            {
                int index = playerTaskList[i];
                yield return StartCoroutine(HighlightButton(index));
            }
    
            buttons.interactable = true;
        }
    
        private void ResetButtonImages()
        {
            foreach (var button in clickableButtons)
            {
                button.image.sprite = normalSprite;
            }
        }
    
        public void StartGame()
        {
            score = 0;
            UpdateUI();
            StartCoroutine(StartNextRound());
            startButton.gameObject.SetActive(false);
        }
    }

    댓글