현재 듣고있는곡
【Vocaloid】 Blood Teller 【Yuzuki Yukari】
지난 1주간 QT로 Easy composition을 만들고, 관련 서류를 적는다고 시간을 뺏기는 바람에, 유니티쪽에 시간을 많이 투자하지 못했다
그러니 빨리 빨리 이어서 개발하도록 하자
일단 지금은 사운드 매니저를 만들 계획이다
사운드 매니저는 오브젝트에 여러가지 음향 파일을 넣어두고 필요할때 꺼내는 방식으로 사용하는 것 같다
한번도 사용해본적이 없기에 새로운 공부가 될 것 같다
다만 사운드 매니저를 사용하지 않아도 되는 부분은 사용하지 않도록 노력해 보려한다
우선, 시작화면부터 만들어 가보자
카메라에 시작 bgm을 넣어주고 play on awake를 켜주면 알아서 재생되기에 필요가 없다
버튼을 누를때 효과음은 1개의 사운드를 공유하면 되기에 매니저를 사용하지 않아도 구현할 수 있다
이제 스크립트를 추가해주자
public AudioSource sound;
sound = GetComponent<AudioSource>();
이렇게 해주면 sound에 효과음이 담기게 된다
void on_start(){
sound.Play();
loading.SetActive(true);
}
void on_exit(){
sound.Play();
Application.Quit();
}
이 사운드를 버튼을 누를때 들리도록 세팅한다
시작 화면이 완성되었다
이제 플레이 scence에도 효과음들을 넣어보자
일단 눈앞에 보이는것이 몬스터이니 몬스터와 충돌했을때 효과음들을 넣어보자
똑같이 몬스터와 충돌시 생기는 효과용 오브젝트에 효과음을 넣어준 뒤
void Start()
{
sound.Play();
생성시 start에서 재생해준다
몬스터와 충돌시 효과음을 들을 수 있다
이렇게 매니저가 필요없는 부분들(2개 이상의 효과음이 필요한 부분들)은 빼고 전부 작업을 해준다
이렇게 작업하던 도중 문제가 생겼다
버튼의 경우 플레이어 오브젝트가 충돌하고 있을때 true가 되는데, 버튼을 누르는 경우, 바로 false가 되버려서 소리가 들리지 않는다
public void GoTo()
{
Sound = GetComponent<AudioSource>();
Sound.Play();
if(text_Manager.is_First == false)
text_M.GetComponent<text_manager>().DisplayNextSentence();
player.ismove = false;
C.isCameraActive = 4;
}
(하쿠레이 신사 진입 버튼 스크립트의 일부)
이제 이런 경우, 혹은 효과음을 여러개 사용할 경우를 위한 사운드 매니저를 만들어보자
대충 빈 오브젝트를 만들고 스크립트를 짜준다
public AudioSource Sound;
public AudioClip goto_reimu;
public string sound_name;
오디오 소스와 오디오 클립을 만들어준다. 지금은 하쿠레이 신사 진입 버튼 효과음을 추가할것이니 클립 명을 적당히 지어준다
그리고 클립을 지정할 string을 만든다
void Playsound(){
switch(sound_name){
case "hakurei":
Sound.clip = goto_reimu;
break;
}
Sound.Play();
}
추가로 함수를 만들어 sound_name에 따라 효과음을 다르게 나오게 한다
여기에 사용하게 편하게 싱글톤을 넣어주면 이렇게 된다
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Soundmanager : MonoBehaviour
{
private static Soundmanager instance;
public static Soundmanager Instance
{
get
{
if (instance == null)
{
GameObject singletonObject = new GameObject();
instance = singletonObject.AddComponent<Soundmanager>();
singletonObject.name = typeof(Soundmanager).ToString() + " (Singleton)";
DontDestroyOnLoad(singletonObject);
}
return instance;
}
}
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else if (instance != this)
{
Destroy(gameObject);
}
}
public AudioSource Sound;
public AudioClip goto_reimu;
public string sound_name;
public void Playsound(string n){
sound_name = n;
switch(sound_name){
case "hakurei":
Sound.clip = goto_reimu;
break;
}
Sound.Play();
}
}
이후 사용할때는 다른 스크립트에서도
Soundmanager.Instance.Playsound("talk");
이런식으로 사용할 수 있다
싱글톤 만세!