2 분 소요

배경음, 효과음을 다룬다 배경음은 한 개의 사운드만, 효과음은 다중 사운드 가능

배경은 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);
        }
    }
}

댓글남기기