해당 글은 유튜버 골드메탈님의 강의를 기반으로 작성되었습니다.
이번 강의에서는 사운드 시스템과 옵션 시스템을 구현해보았습니다.
먼저 'SoundManager'라는 이름으로 빈 오브젝트를 생성한 뒤, 이것의 자식 오브젝트로 빈 오브젝트를 하나 더 생성하고 'Audio Source' 컴포넌트를 추가하여 Audio Clip을 'BGM'으로 지정해줍니다. 이름은 'BGM Player'라고 지정해줍니다.
이후 BGM Player 오브젝트를 복사하여 이름을 'Sfx Player'로 변경한 뒤, 아래와 같이 설정해줍니다.
다음으로 Script를 생성하여 이름을 'SoundManager'로 설정하고 위에서 만들었던 두 개의 Player 오브젝트 객체의 Audio Souce 컴포넌트를 가져옵니다.
AudioSource bgm_player;
AudioSource sfx_player;
void Awake()
{
bgm_player = GameObject.Find("BGM Player").GetComponent<AudioSource>();
sfx_player = GameObject.Find("Sfx Player").GetComponent<AudioSource>();
}
이후 새로운 변수와 PlaySound() 함수를 추가하여줍니다.
public class SoundManager : MonoBehaviour
{
public AudioClip[] audio_clips;
...
public void PlaySound(string type)
{
int index = 0;
switch (type) {
case "Touch": index = 0; break;
case "Grow": index = 1; break;
case "Sell": index = 2; break;
case "Buy": index = 3; break;
case "Unlock": index = 4; break;
case "Fail": index = 5; break;
case "Button": index = 6; break;
case "Pause In": index = 7; break;
case "Pause Out": index = 8; break;
case "Clear": index = 9; break;
}
sfx_player.clip = audio_clips[index];
sfx_player.Play();
}
}
유니티 프로그램으로 돌아가 audio_clips 배열에 사운드를 저장시켜줍니다.
이제 각 상황에 따라 알맞은 Sound를 플레이 시키기 위해 코드를 추가하겠습니다.
먼저 SoundManager 스크립트에 다음의 코드를 추가합니다.
public static SoundManager instance;
void Awake()
{
instance = this;
...
}
이렇게 하면 instance 변수를 사용하여 SoundManager의 PlaySound() 함수에 쉽게 접근할 수 있습니다.
우선 젤리 클릭에 따라 'Touch' 사운드를 플레이하기 위해 Jelly 스크립트에 코드를 추가합니다.
void OnMouseDown()
{
...
SoundManager.instance.PlaySound("Touch");
}
나머지 사운드들도 마찬가지로 상황에 맞게 플레이 되도록 적당한 위치에서 SoundManager.instance.PlaySound("Type Name"); 을 사용하여 Play 시켜주었습니다.
다음으로 Option Panel의 UI를 구축하고 기능을 구현해보겠습니다.
먼저 강의 영상을 따라하여 다음과 같은 인터페이스를 구축해줍니다.
이제 실제 로직을 구현해보도록 하겠습니다.
먼저 슬라이더의 값에 따라 효과음과 배경음의 크기가 조절될 수 있도록 해보겠습니다.
SoundManager 스크립트 내에 Slider 객체 변수를 만들고 초기화 한 후, 함수를 추가합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SoundManager : MonoBehaviour
{
public Slider bgm_slider;
public Slider sfx_slider;
...
void Awake()
{
...
bgm_slider = bgm_slider.GetComponent<Slider>();
sfx_slider = sfx_slider.GetComponent<Slider>();
bgm_slider.onValueChanged.AddListener(ChangeBgmSound);
sfx_slider.onValueChanged.AddListener(ChangeSfxSound);
}
...
void ChangeBgmSound(float value)
{
bgm_player.volume = value;
}
void ChangeSfxSound(float value)
{
sfx_player.volume = value;
}
}
onValueChanged를 통해 슬라이더의 값이 변경되었을 때 발생될 이벤트를 지정할 수 있습니다. 이때 지정된 함수는 float형 매개변수(변경된 값)를 하나 받아와야 합니다.
이후 조절한 볼륨의 크기가 게임을 껏다 켜도 유지될 수 있도록 DataManager에 코드를 추가해주었습니다.
public class SaveData
{
...
public float bgm_vol;
public float sfx_vol;
}
public void JsonLoad()
{
...
if (!File.Exists(path)) {
...
}
else {
...
if(save_data != null) {
...
SoundManager.instance.bgm_slider.value = save_data.bgm_vol;
SoundManager.instance.sfx_slider.value = save_data.sfx_vol;
}
}
}
public void JsonSave()
{
...
save_data.bgm_vol = SoundManager.instance.bgm_slider.value;
save_data.sfx_vol = SoundManager.instance.sfx_slider.value;
...
}
다음으로 계속하기 버튼과 나가기 버튼의 기능을 구현해보겠습니다.
우선 계속하기 버튼을 누를 경우 옵션 창을 벗어나고 다시 게임 화면으로 돌아와야 합니다.
때문에 GameManager의 Option() 함수를 호출해주기만 하면 그만이기 때문에 Option() 함수를 public으로 지정해준 뒤 Resume Button의 OnClick() 함수를 Option() 함수로 지정해줍니다.
이제 나가기 버튼을 누를 경우 게임을 종료시키기 위해 기존에 사용하였던 OnApplicationQuit() 함수를 변경해줍니다.
public void Exit()
{
data_manager.JsonSave();
SoundManager.instance.PlaySound("Pause Out");
Application.Quit();
}
이후 Exit Button의 OnClick() 함수로 Exit()를 지정해줍니다.
참고로 유니티 프로그램 내에선 Application.Quit() 함수가 작동하지 않는 것이 정상입니다.
이후 게임을 실행하여 모든 기능이 정상적으로 작동하는지 확인합니다.
'📌 etc > Unity 2D Raising Jelly Game' 카테고리의 다른 글
[Unity / C#] 2D 젤리 키우기 게임 - 8. 업그레이드 시스템 구현 (2) | 2022.03.27 |
---|---|
[Unity / C#] 2D 젤리 키우기 게임 - 7. 구매 시스템 만들기 (3) | 2022.03.27 |
[Unity / C#] 2D 젤리 키우기 게임 - 6. 해금 시스템 만들기 (0) | 2022.03.26 |
[Unity / C#] 2D 젤리 키우기 게임 - 5. UI 창 구축하기 (0) | 2022.03.23 |
[Unity / C#] 2D 젤리 키우기 게임 - 4. 젤리 판매 기능 구현 (0) | 2022.03.22 |