본문 바로가기
게임 개발/유니티 게임 개발 일지

#20 BGM, 효과음 적용하기

by FlowTree 2020. 8. 20.
반응형

1.게임 BGM, 효과음 준비

게임 플레이 시 BGM과 효과음이 없으면 밋밋하고 적절한 BGM은 반복 플레이의 지루함을 완화해주고 플레이를 더 즐겁게 해준다. 적절한 효과음이 있으면 행동에 대한 피드백을 전달해주어 타격감도 느껴지게 해준다.

 

적절한 BGM을 찾는데 그리 시간이 걸리진 않았다. 예전에 게임 스쿨에서 게임 개발할 때 알게된 SHK님의 무료 BGM을 이용하여 저작권 무료 BGM을 쉽게 구할 수 있었다. 제공해주시는 무료 BGM들을 들어보며 게임에 잘 어울리는 좋은 BGM들을 찾을 수 있었다.

 

생각보다 고생한 건 효과음 찾기였다. freesound.org와 유니티 에셋 스토어에서 찾는데 원하는 효과음이 생각보다 없었다. 그래도 계속해서 구글링하며 적절한 효과음을 간신히 찾아낼 수 있었다. 전체적으로 에셋 스토어에서 효과음을 먼저 찾고 부족한 부분은 인터넷에서 "원하는 효과음 이름 sfx"(ice magic sfx 등)를 검색해서 찾았다. 의외로 유튜브에서도 저작권 무료 효과음을 찾을 수 있었다.

 

몇몇 효과음은 편집이 필요해서 audacity 프로그램으로 소리 음량을 키우거나 길이를 줄였다.

 

#SHK님 유튜브

https://www.youtube.com/user/soundholick

#CCO

https://creativecommons.org/publicdomain/zero/1.0/deed.ko

#freesound.org

https://freesound.org/

#audacity 무료 오디오 편집 프로그램

https://www.audacityteam.org/

#Maoudamashii 알만툴 스타일의 bgm, 효과음이 많다. 아쉽게도 내가 원하던 효과음은 없어서 사용하지 않았다.
maoudamashii.jokersounds.com/music_rule.html


2.화면 별 BGM, 효과음 기획의도

2.1.타이틀 화면 BGM

  • 게임의 주인공 세난이 첫 모험을 떠나기 때문에 기대감에 부푼 느낌과 활기차고 앞으로 나아가는 듯한 느낌을 주고 싶었다.
  • 밝은 분위기, 경쾌한 리듬감

 

2.2.메인 화면 BGM

  • 주로 반복 플레이, 속도감있는 전투이기 때문에 BGM이 느리거나 너무 평화롭기보다는 좀 빠른 리듬감, 신나길 원했다.
  • 기승전결이 뚜렷한 멜로디는 감성을 자극하지만 반복적으로 들으면 좀 피로해진다. 그래서 적절하게 루프가 되고 너무 강하지 않는 멜로디의 bgm을 찾고자 했다. 레퍼런스로 반복 플레이 시 bgm도 좋으면서 듣는 피로감이 덜했던 건 테일즈위버bgm이 적절한 것 같았다.
  • 경쾌한, 빠른 리듬감, 강하지 않은 멜로디, 자연스러운 루프
  • 원래는 하나의 메인 화면 bgm을 구하려고 했으나 너무 하나만 들으면 쉽게 지루해지니까 비슷한 느낌의 bgm을 더 찾았고 최종 4개의 bgm을 선별했다. 

 

2.3.사망 화면 BGM

  • 죽었다. 슬프다의 느낌을 전달해주기 위해서 잔잔한 느낌의 bgm을 선별했다.
  • 경쾌하게 사망했어요~ 라는 느낌의 bgm은 유니티 에셋 스토어에 있으나 분위기가 잘 어울리지 않았다.

 

2.4.몬스터 효과음

  • 공격 시 효과음을 재생하여 몬스터가 공격 중이다. 라는 피드백을 플레이어에게 알려주기
  • 타입 별 몬스터의 공격 방법과 최대한 어울리는 효과음을 재생하기

 

2.5.플레이어 효과음

  • 플레이어가 전투 시 중요한 정보인 피격, 사망 상태를 적절한 효과음으로 알려주기
  • 플레이어가 스킬을 사용하는 재미(= 소리를 이용한 타격감?)를 제공하기
  • 플레이어가 성공적으로 스킬을 사용했음을 알려주는 기능

 

#여담) SHK님 만세! 감사합니다!


3.BGM, 효과음 리스트

3.1.BGM 리스트

사용될 화면 사운드 구분 사운드 이름 주소
타이틀 화면 BGM

Infinite Rebirth

www.youtube.com/watch?v=pCEaDZZ_S4A&list=PLQkRq92hSCyvzghkHyfWBMv7_BT29FuL8&index=20
메인 화면 BGM

Endless Challenge

www.youtube.com/watch?v=M7FIMltbBYU&list=PLQkRq92hSCyvzghkHyfWBMv7_BT29FuL8&index=113
메인 화면 BGM

4th Space

www.youtube.com/watch?v=sFKpdBcDJm0&list=PLQkRq92hSCyvzghkHyfWBMv7_BT29FuL8&index=91
메인 화면 BGM

Battle Arena

www.youtube.com/watch?v=8GxZcn7WmjI&list=PLQkRq92hSCyvzghkHyfWBMv7_BT29FuL8&index=61
메인 화면 BGM

T-SERIAL.27

www.youtube.com/watch?v=3F-RXXtiWko&list=PLQkRq92hSCyvzghkHyfWBMv7_BT29FuL8&index=17

 

3.2.효과음 리스트

오브젝트 구분 사운드 구분  사운드 용도 설명
근접형 AI 효과음 근접형 AI의 근접 공격 효과음 -스켈레톤이 웃는 소리를 원했으나 없어서 좀비가 소리치는 소리로 대체함
원거리형 AI 효과음 원거리형 AI의 마법구 날아가는 효과음 -마법구의 외형이 어둠마법느낌이라서
낮게 슈우웅하고 날아가는 소리
원거리형 AI 효과음 원거리형 AI의 마법구 폭발 효과음 -마법구가 오브젝트와 충돌했을 때 스~퐉하는 폭발음
-원거리형 AI의 효과음은 유니티 에셋에서 dark magic 효과음이 적절해서 그걸 사용함  
순간 이동형 AI 효과음 순간 이동형 AI의 근접 공격 효과음  -공격할 때마 음침한 유령 소리를 원했는데 유니티 에셋에서 유령이 웃는 소리가 꽤 괜찮아서 사용함
매직 미사일 효과음 매직 미사일이 날아가는 효과음 -매직 미사일을 발사했을 때 슈우웅하고 날아가는 소리, 바람을 가르는 소리
매직 미사일 효과음 매직 미사일 폭발 효과음 -매직 미사일이 오브젝트와 충돌했을 때 챙하고 폭발하는 소리를 원했으나
찾을 수가 없었다.
-Maoudamashii사이트의 얼음 마법 효과음이 그나마 괜찮았지만 마음에 안들어서 구글링으로 얼음 깨지는 효과음을 찾아서 사용했다.  
파이어볼 효과음 파이어볼 날아가는 효과음 -파이어볼을 발사할 때 궤적을 그리면서 날아가는데 탄도미사일의 슈우우우웅 소리 느낌의 효과음
파이어볼 효과음 파이어볼 폭발 소리 -오브젝트와 충돌 시 쿠왕~ 하고 폭발하는 효과음
라이트닝스트라이크 효과음 체인라이트닝 발사 효과음 -하나의 낙뢰가 날카롭게 내리치는 효과음
라이트닝스트라이크 효과음 라이트닝 스트라이크 효과음 -일반적인 낙뢰 소리인데, 낙뢰 여러개가 쿠쾅하고 내리치는 효과음 
순간이동 효과음 순간이동 시 효과음 -순간이동 이펙트가 플레이어를 빛으로 휘감는데 이것과 어울리게 위잉, 휘잉하는 효과음
플레이어 효과음 플레이어 피격 시 효과음 -플레이어가 피격 당했을 경우 "윽"
 하며 피격 상태를 알려준다.
플레이어 효과음 플레이어 사망 시 효과음 -플레이어가 사망했을 경우 "으악"하며 사망 상태를 알려준다.

4.bgm 재생 기능

4.1.메인화면 랜덤 bgm 재생 기능

게임을 플레이할 때 매번 동일한 bgm만 재생되면 오래 플레이할수록 지루해진다. 게임을 시작할 때 플레이어 위치, 장애물 배치가 매번 달라지기도 하니 bgm도 매번 똑같은 것보다 몇 개의 BGM을 랜덤하게 재생하면 새롭게 플레이하는 느낌을 줄 수 있을 것 같다. 처음에는 동일한 bgm 반복 재생 3회가 적당하다고 생각해서 테스트 플레이를 해봤다.

 

하지만 2회까진 괜찮았으나 3회가 되니 금방 질려졌다. 모든 bgm 평균 재생 시간은 2분인데 2회가 적절했으니 동일한 bgm은 4분 정도가 적절한 재생 횟수인 것 같다. 생각해보니 가요들의 평균 재생시간은 3분~4분이니까 이게 딱 적당해서 이정도 길이로 하는 것이었나? 게임 bgm도 4분이 넘어가는 경우는 거의 없는 듯하다. 게임의 예상 플레이 시간에 어울리는 재생 시간을 정하면 좋을 듯하다. 아마도 내 게임의 경우 1 웨이브 시 평균 2~4분이 걸리니 bgm 2회 듣는게 1싸이클로 잘 어울려서 그런건가? 흠흠...

 

4.2.사망 화면 bgm 재생 기능

플레이어가 사망 시 사망 화면UI를 출력하는데 UI만 있는 것보다 당신은 사망했습니다. 슬프네요. 라는 느낌을 주고 싶어서 잔잔하고 슬픈 bgm을 추가하기로 했다.

 

4.3.규칙

랜덤 bgm 재생 규칙

  • 메인화면에서 최초 게임 시작 시 랜덤 bgm을 선택하기
  • 랜덤 bgm 선택: 0 ~ 랜덤bgm개수 중 임의의 숫자를 선택하기
  • 메인 화면 bgm 재생: 배열에 등록한 bgm 중 선택된 숫자와 동일한 인덱스의 bgm을 재생하기
  • 재생 횟수 검사: 선택된 bgm이 2회 재생됐을 경우 다시 랜덤 bgm을 선택하기
  • 플레이어가 사망하지 않았다면 위의 과정을 반복하기

사망 화면 bgm 재생 규칙

  • 플레이어가 사망 시 재생 중인 bgm을 중지한다.
  • 사망 화면 bgm(deathBgm)을 1회 재생한다.
  • 사망 화면 bgm은 루프하지 않는다.
    - 사망 화면 bgm 길이가 길어서 루프 안해도 충분
    - 플레이어가 버튼 터치만 하면 빠르게 재시작을 할 수 있어서 루프하지 않는다.
    - (PlayOneShot 기능 사용해봄)

5.구현 과정

5.1.타이틀 화면

1.타이틀 화면에서는 별도의 스크립트 없이 오디오 소스 컴포넌트를 이용해서 bgm을 재생한다.

2.오디오 리스너 컴포넌트가 있는 Main Camera 오브젝트에 Audio Source 컴포넌트 할당하기

3.타이틀 화면에서 재생할 타이틀 화면 bgm을 AudioClip에 할당하기

4.Play On Awake 체크(게임 시작 시 오디오 클립 재생)

5.타이틀 화면 bgm 반복 재생을 위해 Loop 체크하기

 

5.2.메인 화면

1.Main Camera에 Audio Source 컴포넌트 할당

2.bgm 재생을 제어할 Sound Manager 스크립트 할당

3.Sound Manager 컴포넌트에 재생할 bgm 개수 설정, bgm들을 할당하기

 

SoundManager 스크립트

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundManager : MonoBehaviour
{
    public AudioClip[] mainBgm;
    public AudioClip deathBgm;

    public AudioSource audioSource;

    private int playingCount;
    private int bgmNumber;

    private bool isGameover = false;

    void Start()
    {
        audioSource = GetComponent<AudioSource>();
        audioSource.playOnAwake = true;
        audioSource.volume = 0.4f;
        //재생할 bgm 번호 선택하고 재생하기
        SelectRandomBGM();

        //audioSource.volume = 1.0f; //0.0f ~ 1.0f사이의 숫자로 볼륨을 조절

        //audioSource.mute = false; //오디오 음소거

        //audioSource.Stop(); //오디오 멈추기


        //audioSource.priority = 0;
        //씬안에 모든 오디오소스중 현재 오디오 소스의 우선순위를 정한다.
        // 0 : 최우선, 256 : 최하, 128 : 기본값


        //플레이어 캐릭터의 사망 이벤트 발생 시 사망BGM 재생 메소드 실행
        FindObjectOfType<PlayerStats>().onDeath += PlayDeadBgm;
    }

    void Update()
    {
        PlayTwoTimes();
    }

    //bgm은 2번 실행한다.
    void PlayTwoTimes()
    {
        if (playingCount < 2 && !audioSource.isPlaying && !isGameover)
        {
            audioSource.Play();
            playingCount++;
            Debug.Log(playingCount + "재생 횟수");
        }

        // bgm을 2번 재생했다면, 횟수 초기화 0으로, 그리고 새로운 bgm 선택하기
        else if (playingCount >= 2 && !audioSource.isPlaying)
        {
            playingCount = 0;
            SelectRandomBGM();
            Debug.Log(playingCount + "재생 횟수");
        }

    }

    void SelectRandomBGM()
    {
        bgmNumber = Random.Range(0, mainBgm.Length);

        //선택한 bgm audioSource.clip에 등록하기
        audioSource.clip = mainBgm[bgmNumber];

        //오디오 재생
        audioSource.Play();
        playingCount++;
        Debug.Log(playingCount + "재생 횟수");
    }

    void PlayDeathBgm()
    {
        //기존 bgm 중지
        audioSource.Stop();

        audioSource.volume = 1f;

        //사망 Bgm 재생, PlayOneShot은 무조건 한 번만 재생됨 루프 안됨
        audioSource.PlayOneShot(deathBgm);

        isGameover = true;
    }

}

 

반응형

댓글