Skip to content
Snippets Groups Projects
AudioSystem.cs 4.14 KiB
Newer Older
Tony Pohto's avatar
Tony Pohto committed
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class AudioSystem : MonoBehaviour, IAction
{

    [SerializeField]
    private List<AudioClip> musics = new List<AudioClip>();

    [SerializeField]
    private AudioSource ac = null;
    
Tony Pohto's avatar
Tony Pohto committed
    // Start is called before the first frame update
Tony Pohto's avatar
Tony Pohto committed
    void Start()
    {

        foreach (EventType x in System.Enum.GetValues(typeof(EventType)))
        {
            EventSystem.AddEvent(x, this);
        }
        React(EventType.GameStarts);
    }

Tony Pohto's avatar
Tony Pohto committed
    public void React(EventType type) {
        if (type == EventType.GameStarts)
        {
            StartCoroutine("GameStartsClip");
Tony Pohto's avatar
Tony Pohto committed
        }
        if (type == EventType.CitySmall)
        {
            CitySmallClip();
        }
        if (type == EventType.CityBig)
        {
            CityBigClip();
        }
        if (type == EventType.HuntingSmall)
        {
            HuntingSmallClip();
        }
        if (type == EventType.HuntingBig)
        {
            HuntingBigClip();
        }
        if (type == EventType.WoodChopped)
        {
Tony Pohto's avatar
Tony Pohto committed
            WoodClip();
Tony Pohto's avatar
Tony Pohto committed
        }
        if (type == EventType.StoneCut)
        {
Tony Pohto's avatar
Tony Pohto committed
            StoneClip();
Tony Pohto's avatar
Tony Pohto committed
        }
Tony Pohto's avatar
Tony Pohto committed
        if (type == EventType.Berrypicked)
        {
            BerryClip();
        }
        if (type == EventType.UpgradeBuilt)
        {
Tony Pohto's avatar
Tony Pohto committed
        }
        if (type == EventType.TimePeriodChanged)
        {
Tony Pohto's avatar
Tony Pohto committed
        }
        
    public IEnumerator GameStartsClip()
Tony Pohto's avatar
Tony Pohto committed
    {
        StartCoroutine("PlayEffect", 6);
        yield return new WaitForSeconds(2);
        ac.clip = musics[1];
        StartCoroutine("FadeIn", 0);
        
Tony Pohto's avatar
Tony Pohto committed
    }
    public void CitySmallClip()
    {
        StartCoroutine("FadeOutIn", new Timing(3, 1));
    }
    public void CityBigClip()
    {
        StartCoroutine("FadeOutIn", new Timing(3, 2));
    }
    public void HuntingSmallClip()
    {
        StartCoroutine("FadeOutIn", new Timing(2, 4));
    }
    public void HuntingBigClip()
    {
        StartCoroutine("FadeOutIn", new Timing(2, 5));
Tony Pohto's avatar
Tony Pohto committed
    }
Tony Pohto's avatar
Tony Pohto committed
    public void WoodClip()
    {
        StartCoroutine("PlayEffect", 7);
    }
    public void StoneClip()
    {
        StartCoroutine("PlayEffect", 8);
    }
    public void BerryClip()
    {
        StartCoroutine("PlayEffect", 9);
    }
    public void UpgradeClip()
    {
        StartCoroutine("PlayEffect", 4);
    }
    public void FanfareClip()
    {
        StartCoroutine("FadeOutIn", new Timing(0, 0));
    }
Tony Pohto's avatar
Tony Pohto committed

Tony Pohto's avatar
Tony Pohto committed
    IEnumerator FadeOutIn(Timing t) {
        //yield return FadeOut(t.duration);
        yield return StartCoroutine("FadeOut", t.duration);
        ac.clip = musics[t.clip];
        yield return StartCoroutine("FadeIn", t.duration);
    }

    public IEnumerator FadeOut(int duration)
    {
        float start = Time.time;
        float end = start + duration;
        if (ac.isPlaying)
        {
            while (Time.time < end)
            {
                float current = Time.time - start;
                //(duration-(current-min)/(max-min)
                float volume = (duration - (Time.time - start)) / (end - start);
                yield return null;
                ac.volume = volume;
            }
            ac.Stop();
        }
    }
    public IEnumerator FadeIn(int duration)
    {
        float start = Time.time;
        float end = start + duration;
        ac.volume = 0;
        ac.Play();
        while(Time.time < end)
        {
            float current = Time.time - start;
            //(max-current)/(max-min)
            float volume = (Time.time - start) / (end - start);
Tony Pohto's avatar
Tony Pohto committed
            yield return null;
            ac.volume = volume;
        }
        ac.volume = 1;
    }
    public IEnumerator PlayEffect(int clip)
    {
        AudioSource v = gameObject.AddComponent<AudioSource>();
        v.clip = musics[clip];
        v.Play();
        yield return new WaitForSeconds(v.clip.length);
Tony Pohto's avatar
Tony Pohto committed



    private class Timing {
        public int clip;
        public int duration;

        public Timing(int duration, int clip) {
            this.clip = clip;
            this.duration = duration;
        }
    }




}