다양한 기록

Parrying Sword #53 : [사운드][프로그래밍] bgm과 효과음 본문

유니티 엔진/Parrying Sowrd

Parrying Sword #53 : [사운드][프로그래밍] bgm과 효과음

라구넹 2024. 1. 30. 05:08

저번 게시글에서는 직접 작곡을 해서 bgm을 넣으려고 했던 것 같은데,

하다 보니 도저히 안될 것 같아서 결국 유니티 에셋 스토어에서 받아서 쓰기로 했습니다.

 

https://assetstore.unity.com/ko

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

사용한 에셋들은 다음과 같습니다.

 

NOVA SOUND : Free Fireworks - Fire FX - Nova Sound

MGWSOUNDDESIGN : Grenade Sound FX

GWRITERSTUDIO : Monster SFX - 111518

INSPECTORJ SOUND EFFECTS : Wooden Fence Destruction (Free Sample Pack)

EDOARDO GIGANTE : Sword Sound Pack

ESCALONAMUSIC.COM : Action RPG Music Free

 

    public void onBurstSound()
    {
        burstSoundController.playClip();
    }

    public void onBreathSound()
    {
        breathSoundController.playClipWithStartTime(0.2f);
    }

    public void onRoarSound()
    {
        roarSoundController.playClipWithStartTime(0.1f);
    }

    public void onNormalSound()
    {
        normalSoundController.playClipWithStartTime(0.2f);
    }

    public void onCompletionSound()
    {
        completionSoundController.playClip();
    }

받은 에셋들의 경우, 효과음은 이런 식으로 오디오 각 객체들의 행동에 연결해 둡니다.

 

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

public class FadeSound : MonoBehaviour
{
    // BGM에 붙여서 사용
    private float minV = 0.0f;
    private float maxV;
    private float speed;
    private AudioSource audioSource;
    public FadeState fadeState = FadeState.FADEIN;

    private void Awake()
    {
        maxV = SaveData.SoundBGMVolume;
        speed = (maxV - minV) / 300.0f;
        audioSource = GetComponent<AudioSource>();
    }

    private void Start()
    {
        if( fadeState == FadeState.NON )
        {
            audioSource.volume = SaveData.SoundBGMVolume;
        }
        else if( fadeState == FadeState.FADEIN )
        {
            audioSource.volume = 0.0f;
        }
    }

    private void Update()
    {
        if (!audioSource.isPlaying) return;
        //Debug.Log(audioSource.volume);
        switch (fadeState)
        {
            case FadeState.FADEIN:
                audioSource.volume += speed;
                if (audioSource.volume > maxV )
                {
                    audioSource.volume = maxV;
                    fadeState = FadeState.NON;
                }
                break;

            case FadeState.FADEOUT:
                audioSource.volume -= speed;
                if( audioSource.volume < minV )
                {
                    audioSource.volume = minV;
                    fadeState = FadeState.NON;
                }
                break;
        }
    }

    public void fadeIn()
    {
        fadeState = FadeState.FADEIN;
    }

    public void fadeOut()
    {
        fadeState = FadeState.FADEOUT;
    }

}

 

bgm의 경우 페이드인, 페이드아웃 처리를 해줍니다.

 

public override void buttonLeft()
    {
        if (now == 0)
        {
            soundBGMVolume -= 1;
            if (soundBGMVolume < 0.0f) soundBGMVolume = 0;
            SaveData.SoundBGMVolume = ((float)soundBGMVolume / 10);
            bgmText.text = soundBGMVolume.ToString();
            soundBGMController.updateVolume();
        }
        else if (now == 1)
        {
            soundSEVolume -= 1;
            if (soundSEVolume < 0) soundSEVolume = 0;
            SaveData.SoundSEVolume = ((float)soundSEVolume / 10);
            seText.text = soundSEVolume.ToString();
            soundSEController.updateVolume();
            soundSEController.playClip();
        }
    }

 

이 코드는 메인 메뉴의 옵션에 해당하는 코드의 일부입니다.

옵저버 패턴 비슷하게 응용해서, 옵션에서 볼륨을 바꾸면 등록된 개체의 데이터를 업데이트 시키는 방식입니다.

 

 public void updateVolume()
    {
        if (isBGM)
        {
            audioSource.volume = SaveData.SoundBGMVolume;
        }
        else
        {
            audioSource.volume = SaveData.SoundSEVolume;
        }
        //Debug.Log(audioSource.volume);
    }

 

이게 등록된 개체의 업데이트 메소드입니다.

 

 

bgm이나 효과음이 어떻게 적용되었는지 영상을 찍어오고 싶기는 한데,

맥북은 컴퓨터 내의 소리 녹음이 따로 방법을 쓰지 않고 기본으로는 불가능한 관계로 올리지 못하여 아쉽습니다.