Parrying Sword #53 : [사운드][프로그래밍] bgm과 효과음
저번 게시글에서는 직접 작곡을 해서 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이나 효과음이 어떻게 적용되었는지 영상을 찍어오고 싶기는 한데,
맥북은 컴퓨터 내의 소리 녹음이 따로 방법을 쓰지 않고 기본으로는 불가능한 관계로 올리지 못하여 아쉽습니다.