[Unity][2D-Game] Suika-Game (6)

suhan0304·2023년 11월 18일
0

유니티 - Suika Game

목록 보기
6/8
post-thumbnail

Review

  • 게임 매니저에 점수 시스템을 추가하였다.
  • 경계선에 접촉된 시간에 따라 게임오버가 실행되도록 구현하였다.
  • 게임 매니저에서 게임 오버를 호출 시 장면에 있는 모든 동글을 Hide 시키고 이펙트가 실행되도록 구현하였다.

강의영상 (6) - 사운드 시스템


개발

배경 음악

BGM Player라는 이름으로 Audio Source 오브젝트를 하나 생성해준 후 BGM 오디오 클립을 드래그드랍으로 초기화 해준다.

  • Volume을 0.1로 설정한다.
  • Play On Awake를 체크해준다.
  • Loop는 실행해준다.

BGM 시작을 스크립트 상에서 진행하기 위해 자동 시작 비활성화 및 BGM은 계속 반복되어야 하므로 루프 활성화

이제 게임 매니저에 bgmPlayer 변수를 선언한 후 인스펙터에서 초기화 해준다.

GameManager.cs

public AudioSource bgmPlayer;

private void Start()
{
    bgmPlayer.Play();
    NextDongle();
}

효과음 관리

배경음과 동일하게 SFX Player라는 이름으로 Audio Source 오브젝트를 생성해준다.

  • Volume을 0.3으로 설정한다.
  • Play On Awake를 체크해준다.

이제 Ctrl + D로 SFX Player를 총 세 개 만들어준다.

효과음을 하나의 Audio Source로 실행하면 AudioClip을 교체하면 재생 중인 음원은 짤리는 문제가 발생한다.

이제 게임 매니저에 오디오 소스가 담길 배열 변수, 효과음을이 담길 배열 변수, 다음에 실행될 오디오를 가리킬 변수를 선언한다.

enum 형으로 효과음들을 선언해서 오타로 인해 발생하는 문제를 미연에 방지한다.

GameManager.cs

public AudioSource bgmPlayer;
public AudioSource[] sfxPlayer;
public AudioClip[] sfxClip; //여러 효과음들이 담길 변수
public enum Sfx { LevelUp, Next, Attach, Button, Over };
int sfxCursor; //다음에 재생할 AudioSource를 가리킬 변수

public void SfxPlay(Sfx type)
{
    switch(type)
    {
        case Sfx.LevelUp:
            sfxPlayer[sfxCursor].clip = sfxClip[Random.Range(0, 3)]; //레벨업은 소리가 3개라서 랜덤하게 실행
            break;
        case Sfx.Next:
            sfxPlayer[sfxCursor].clip = sfxClip[3];
            break;
        case Sfx.Attach:
            sfxPlayer[sfxCursor].clip = sfxClip[4];
            break;
        case Sfx.Button:
            sfxPlayer[sfxCursor].clip = sfxClip[5];
            break;
        case Sfx.Over:
            sfxPlayer[sfxCursor].clip = sfxClip[6];
            break;
    }

    sfxPlayer[sfxCursor].Play(); //재생시킬 AudioClip이 들어간 Audio Source를 실행

    sfxCursor = (sfxCursor + 1) % sfxPlayer.Length; //계속해서 3개의 오디오 소스를 순환하도록 구현
}

효과음 배치

이제 각각의 효과음들이 필요한 상황에 실행되도록 로직을 구현한다.

  • LevelUpRoutine
manager.SfxPlay(GameManager.Sfx.LevelUp);
  • NextDongle
SfxPlay(Sfx.Next);
  • GameOverRoutine
yield return new WaitForSeconds(1f);

SfxPlay(Sfx.Over);

Attach 효과음은 사물에 부딪힐때 재생되도록 구현한다.

Dongle.cs

void OnCollisionEnter2D(Collision2D collision)
{
    StartCoroutine(AttachRoutine());
}

IEnumerator AttachRoutine() //충돌음 제한을 위한 코루틴
{
    if(isAttach) //이미 충돌음을 실행했다면 
        yield break;    //코루틴을 탈출한다.

    isAttach = true;
    manager.SfxPlay(GameManager.Sfx.Attach);

    yield return new WaitForSeconds(0.2f); //0.2f 동안 다른 충돌은 무시

    isAttach = false;
}

yield break : 코루틴을 탈출하기 위한 함수


결과물

gif에는 효과음 첨부가 불가능해서 생략한다.

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글