unity-20: SoundManager
배경음, 효과음을 다룬다 배경음은 한 개의 사운드만, 효과음은 다중 사운드 가능
배경은 Audio Source가 하나면되고 효과음은 효과음당 각각 Audio Source를 가져야한다.
스크립트 생성(SoundManager) gameobject생성(SoundManager)
- add component(Audio Source)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundManager : MonoBehaviour
{
static SoundManager _unique;
public enum eBGMType
{
TITLE = 0,
INGAME
};
public enum eEFFType
{
BUTTON = 0,
FLY,
HIT,
DIE,
SCORE
}
public AudioClip[] _bgmClips;
public AudioClip[] _effClips;
AudioSource _bgmPlayer;
void Awake() {
_unique = this;
DontDestroyOnLoad(gameObject);
_bgmPlayer = GetComponent<AudioSource>();
}
public static SoundManager _instance
{
get { return _unique; }
}
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void PlayBGMSound(eBGMType type, float vol, bool loop)
{
_bgmPlayer.clip = _bgmClips[(int)type];
_bgmPlayer.volume = vol;
_bgmPlayer.loop = loop;
_bgmPlayer.Play();
}
public void PlayeEFFSound(eEFFType type, float vol, bool loop)
{
GameObject go = new GameObject("EffectSound");
go.transform.parent = transform;
AudioSource effSoundPlayer = go.AddComponent<AudioSource>();
effSoundPlayer.clip = _effClips[(int)type];
effSoundPlayer.volume = vol;
effSoundPlayer.loop = loop;
effSoundPlayer.Play();
Destroy(go, 5);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneControlmng : MonoBehaviour
{
static SceneControlmng _unique;
public enum eLoaddingState
{
none = 0,
start,
ing,
end
}
AsyncOperation _loadProc;
eLoaddingState _noewLoadState = eLoaddingState.none;
static public SceneControlmng _instance
{
get { return _unique; }
}
void Awake()
{
_unique= this;
DontDestroyOnLoad(gameObject);
StartTitle();
}
void LateUpdate()
{
if (_loadProc != null)
{
if (_loadProc.isDone)
{
_noewLoadState = eLoaddingState.ing;
// 로딩 바 계산.
//_loadProc.progress;
return;
}
else
{
_loadProc = null;
_noewLoadState = eLoaddingState.end;
}
}
}
public void StartTitle()
{
SoundManager._instance.PlayBGMSound(SoundManager.eBGMType.TITLE, 0.3f, true);
_noewLoadState = eLoaddingState.start;
_loadProc = SceneManager.LoadSceneAsync("TitleScene");
}
public void StartIngame()
{
SoundManager._instance.PlayBGMSound(SoundManager.eBGMType.INGAME, 0.3f, true);
_noewLoadState = eLoaddingState.start;
_loadProc = SceneManager.LoadSceneAsync("IngameScene");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IngameManager : MonoBehaviour
{
public enum eGameState
{
Ready = 0,
Start,
Play,
Enndding,
Result
}
public MessageWnd _wndMsg;
eGameState _currentGameState = 0;
bool _isClear = false;
float _timeCheck = 0;
static IngameManager _unique;
public static IngameManager _Instance
{ get { return _unique; } }
public eGameState _nowGameState
{
get { return _currentGameState; }
}
private void Awake()
{
_unique= this;
}
void Start()
{
//ReadyGame(); 임시
}
void Update()
{
switch(_currentGameState)
{
//case eGameState:
// ReadyGame();
// break;
case eGameState.Ready:
_timeCheck += Time.deltaTime;
if (_timeCheck >= 5)
StartGame();
break;
case eGameState.Start:
_timeCheck += Time.deltaTime;
if (_timeCheck >= 1)
PlayGame();
break;
}
if (Input.GetButton("Cancel"))
{
//SceneControlmng._instance.StartTitle();
EndGame(true);
}
}
public void ReadyGame()
{
_currentGameState = eGameState.Ready;
_wndMsg.gameObject.SetActive(true);
_wndMsg.SettingText("Ready");
}
public void StartGame()
{
_currentGameState = eGameState.Start;
_wndMsg.gameObject.SetActive(true);
_wndMsg.SettingText("Game Start!");
_timeCheck= 0;
}
public void PlayGame()
{
_currentGameState = eGameState.Play;
_wndMsg.gameObject.SetActive(false);
_timeCheck= 0;
}
public void EndGame(bool isClear)
{
_currentGameState = eGameState.Enndding;
_isClear = isClear;
_wndMsg.gameObject.SetActive(true);
if (_isClear)
{
_wndMsg.SettingText("축하합니다~!");
}
else
_wndMsg.SettingText("GameOver!!");
_timeCheck = 0;
}
public void ResultGame()
{
_currentGameState = eGameState.Result;
}
} // Update is called once per frame
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class TitleManager : MonoBehaviour
{
public Text _txtPush;
float _tickTime = 0;
SceneControlmng _mngScene;
void Start()
{
GameObject go = GameObject.Find("SceneControlManager");
}
void Update()
{
_tickTime += Time.deltaTime;
if(_tickTime >= 0.3f)
{
_tickTime = 0;
_txtPush.gameObject.SetActive(!_txtPush.gameObject.activeSelf);
}
if (Input.GetButtonDown("Fire1"))
{
SceneControlmng._instance.StartIngame();
SoundManager._instance.PlayeEFFSound(SoundManager.eEFFType.BUTTON, 1, false);
SoundManager._instance.PlayeEFFSound(SoundManager.eEFFType.BUTTON, 1, false);
}
}
}
댓글남기기