본문 바로가기
게임 개발 일지/내일배움캠프 TIL

배경음악 종료하기 / 다시 시작 버튼 만들기

by 빛하_ 2023. 11. 2.

 

 

 

 

오늘의 학습 키워드

 

 

오늘의 목표!

기존에 사용한 르탄이 대신, 내가 좋아하는 모코코를 넣어 [모코코를 찾아라!] 게임으로 변신시키기.

 

1. 카드 이미지 바꾸기

Assets_Resources 에 있는 르탄이 파일을 삭제하고 내가 선정한 mokoko 사진 8개를 추가했다.

resources 변경에 따라

 - StartScene_Canvas 의 이미지 및 애니메이션 변경

 

 - MainScene_cards 의 이미지 및 애니메이션 변경

 

리소스 하나만 바꾸려고 해도 기존에 적용한 크기, 애니메이션 등을 수정하는 작업이 필요하다.

 

 

2. 효과음 변경 및 추가

 

기존에 match 시 나오는 효과음을 '기분 좋은 향기' 효과음으로 변경했다.

 

match 가 아닐 때 AudioClip wrong 을 재생시키도록 추가했다.

// gameManager.cs

   public AudioClip wrong;
   
   ...
   
   {
       public void isMatched()
       ...
               else
        {
            audioSource.PlayOneShot(wrong);

            firstCard.GetComponent<card>().closeCard();
            secondCard.GetComponent<card>().closeCard();
        }
        
   }

 

 

 

3. 게임이 끝나면 배경음악도 종료시키기

가장 어려웠던 오늘의 숙제.

 

<문제 상황>

게임이 종료되었는데도 배경음악이 멈추지 않음.

 

<내가 생각한 Logic>

// gameManager.cs
void GameEnd () 에
GetComponent<AudioSource>().Stop();  를 넣기

 

결과 : 전혀 나아지지 않음. 튜터님께 도움 요청!!

 

<튜터님과 함께한 Logic>

 

1) audioManager.cs 에 public void GameEnd()를 선언해서 gameManager.cs 가 부를 수 있도록 한다.

// audioManager.cs

    public AudioSource audioSource;
    public AudioClip bgmusic;
    
    {
    ...
    
        public void GameEnd()
     {
        audioSource.clip = bgmusic;
        audioSource.Stop();
     }
    }

 

 

2) 게임 종료되는 시점에 AudioEnd 발동

  gameManager.cs_void Update_if (limit < 0) 부분에 AudioEnd(); 삽입

 

3) void GameEnd() 와 void AudioEnd() 삽입

// gameManager.cs

   void GameEnd()
   {
       Time.timeScale = 0.0f;
       endTxt.SetActive(true);
       AudioEnd();
   }

   void AudioEnd()
   {
       audioManager am = audioManager.GetComponent<audioManager>();
       am.GameEnd();
   
   }

 

여기서 배운 사실!

void GameEnd 에서 AudioEnd가 필요하기 때문에

audioManager 를 am 이라고 붙이고 GetComponent를 사용해 불러온 다음 GameEnd를 실행시켜준다.

 

* 아직 헷갈리는 것은 (어떤 상황에서 변수를 정의해야 하는지, 어떤 상황에서 pull-push가 되는 건지)

  이 알고리즘에 대해서는 더 공부가 필요하다.

 

 

 

4. panel "리트?" 를 누르면 게임 다시 시작하기 (다시 30초부터 시작) 

<문제 상황>

panel "리트?" 를 눌러도 게임음악은 나오는데 시간이 30초로 돌아오지 않았다.

 

gameManager.cs에 float limit 선언 후 limit 를 이용해 void Update에 게임 시간을 적용시켰기 때문에

restart 했을 때 시간 표시에 오류가 난 것 같다.

 

<해결 방법>

// gameManager.cs

void Start() 아래 initGame(); 을 넣어주고
void initGame() 을 새로 만들어
Time.timescale = 1.0f;
limit = 30.0f 로 설정해주었다.

작동이 잘 된다!

 

 

5. 제한 시간이 10초가 되면 빨간색으로 바꾸기

<처음 생각한 Logic>

// gameManager.cs 에

  public Text timeText; 
  timeText.text = "<color=#FF0000>"+"timeTxt"+"</color>";
이렇게 입력했더니 전혀 실행되지 않았다.

 

<Logic>

timeTxt 가 MainScene_Canvas 아래에 있기 때문에 GameObject로 불러올 수 있겠다는 생각

// gameManager.cs

    public GameObject timeTxt;
    
     void Update()
 {
     limit -= Time.deltaTime;

     if (limit <= 10)
     {
         GameObject.Find("timeTxt").GetComponent<Text>().color = Color.red;
     }
     
     ...
 }

 

이후 Unity의 gameManager에게 timeTxt를 먹여주니 완성되었다!

 

 

 

 

 

오늘의 회고

 

게임 소스 하나를 변경하는 데에도 시간과 노력, 집중력이 필요함을 알게 되었다.

적절한 이미지, 음악, 폰트와 UI 색상 등 고려할 것이 매우 많았다.

게임 전체적인 그림을 그리고 나니 script 수정할 생각에 정신이 아득해졌다.

하지만 배운 내용을 살피면서 붙여넣기도 해보고 수정하면서 충돌이 나면 튜터님께 질문하는 등

여러가지로 부딪혀보면서 완성한 게임이다.

너무 어려워서 막힌 순간에 도와주신 튜터님께 감사하다.

 

이번 게임 프로젝트로 C#과 Unity의 기본 기능에 대해 공부할 수 있었다.

스크립트를 열어서 함수를 보는 순간 어지럽다가도 유니티를 실행해서 버그가 고쳐지면 완치되는..

왕초보 개발자가 코딩에 스며드는 희망찬 첫걸음이 아닌가 싶다. (..?)

 

배포할 생각이 전혀 없는! 개인 학습용으로 만들었기에

모코코 이모티콘 제작자님과 스마일게이트알피지 선생님들께서 허락해주실 거라고 믿습니다!!! 사랑해요♥

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글