김김김의 게임개발
  • Unity 게임 개발 #7 - 카드 매칭 게임<Teammate-Cardgame> 3
    2023년 08월 08일 20시 55분 43초에 업로드 된 글입니다.
    작성자: noun06

    유니티를 사용하여 개발한 카드 맞추기 게임입니다. 팀 미니 프로젝트로 진행하였습니다.


    1. 오디오 조절하기

    • 슬라이더 컴포넌트의 On Value Changed 리스트에 SetMusicVolume()함수를 넣어서 특정 음량의 크기를 조정.
    //AudioManager.cs
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class AudioManager : MonoBehaviour
    {
        public AudioClip bgmusic;
        public AudioSource audioSource;
        public AudioClip start;
    
        void Start()
        {
            audioSource.PlayOneShot(start);
            audioSource.clip = bgmusic;
            audioSource.Play();
        }
    
        public void SetMusicVolume(float volume) //slider 오브젝트의 value를 오디오의 volume과 연동
        {
            audioSource.volume = volume;
        }
    }

     

    2. 보너스 시간 추가 및 감소

    • 매칭에 성공했을 때 제한 시간을 추가해주고, 매칭에 실패했을 때 제한 시간을 줄이는 시스템.
    • 감소하거나 추가되었을 때 잠깐 타이머 색상을 변경하여 가시성 향상.
    //gameManager.cs
    
        public void isMatched()
        {
            string firstCardImage = firstCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
            string secondCardImage = secondCard.transform.Find("front").GetComponent<SpriteRenderer>().sprite.name;
    
            if (firstCardImage == secondCardImage)
            {
                //...
                addTime(); //매치 성공 시 시간 추가
            }
            else
            {
                 //...
                if (time >= 10.0f) //시간이 10초 이상 일 때만 동작하게하여 난이도 조절
                {
                    ReduceTime(); //매치 실패 시 시간 감소
                }
            }
    		//...
        }
    
        void ChangeTimerColor()
        {
            GameObject.Find("timeText").GetComponent<Text>().color = Color.red;
        }
    
        void ReduceTime() //매칭 실패 시 시간 감소, 타이머 색상 변경
        {
            time -= 2f;
            GameObject.Find("timeText").GetComponent<Text>().color = Color.gray;
            StartCoroutine("ReturnTimerColorCoroutine");
        }
    
        void addTime() //매칭 성공 시 시간 증가, 타이머 색상 변경
        {
            time += 2f;
            GameObject.Find("timeText").GetComponent<Text>().color = Color.yellow;
            StartCoroutine("ReturnTimerColorCoroutine");
        }
    
        private IEnumerator ReturnTimerColorCoroutine()//타이머 색상 원상태로 변경
        {
            yield return new WaitForSeconds(0.5f);
            GameObject.Find("timeText").GetComponent<Text>().color = Color.black;
        }
    
       //...
    }

     

    3. 일시 정지 및 씬 매니징 개선

    • 여러 군데로 흩어져있는 불필요한 스크립트를 없애고 하나의 씬매니져 스크립트로 관리.
    • 게임 플레이 도중 일시 정지, 시간 정지 / 게임 재개.
    • 시작 화면에서 게임 종료 버튼, 오디오 옵션 창 추가와 전반적인 게임 UI 1차 수정.
    //sceneManager.cs
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class sceneManager : MonoBehaviour
    {
        public static bool GamePause = true;
    
        public GameObject pauseMenuCanvas;
        public GameObject optionMenuCanvas;
    
        public void Resume() //게임 재개
        {
            pauseMenuCanvas.SetActive(false);
            Time.timeScale = 1f;
            GamePause = false;
        }
    
        public void Pause() //게임 일시정지
        {
            pauseMenuCanvas.SetActive(true);
            Time.timeScale = 0f;
            GamePause = true;
        }
    
        public void optionMenu() //옵션창 활성화
        {
            optionMenuCanvas.SetActive(true);
        }
    
        public void optionMenuExit() //옵션창 비활성화
        {
            optionMenuCanvas.SetActive(false);
        }
    
        public void startGame() //게임 씬 진입
        {
            SceneManager.LoadScene("MainScene");
        }
    
        public void enterStartMenu() //처음 씬 진입
        {
            SceneManager.LoadScene("StartScene");
        }
    
        public void exitGame() //게임 종료
        {
    #if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false; //유니티 상에서 PLAY 중지
    #else
            Application.Quit(); //빌드 시 동작
    #endif
        }
    }

     

    <결과물>

     

     

    댓글