기획하면서 만든 게임 개발 로그(4) 사운드 관리 시스템과 UI 시스템 추가

21846 단어 게임 개발unity
게임에 배경음악과 약간의 음향 효과를 추가하기 위해 나는 음향 효과 관리 시스템을 추가했다. 매우 간단하고 코드에 직접 넣는다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AudioManager : MonoBehaviour
{
    private static AudioManager _instance;

    public AudioClip[] AudioClipArray;                     

    private static Dictionary<string, AudioClip> AudioDic = new Dictionary<string, AudioClip>(); 
    private static AudioSource audioBGM;                  
    private static AudioSource[] audioSources;


    public Slider volumeSlider;
    public float Volume { get; set; }
    public static AudioManager Instance { get => _instance; set => _instance = value; }

    void Awake()
    {
        Instance = this;
        foreach (var item in AudioClipArray)
        {
            AudioDic.Add(item.name, item);
        }
        volumeSlider.onValueChanged.AddListener((value) => SetVolume());
        audioBGM = gameObject.AddComponent<AudioSource>();
        audioSources = GetComponents<AudioSource>();

        Volume = 50;
    }

    
    public void PlayEffect(string acName)
    {
 
        if (AudioDic.ContainsKey(acName) && !string.IsNullOrEmpty(acName))
        {
            AudioClip ac = AudioDic[acName];
            PlayEffect(ac);
        }
    }

    private void PlayEffect(AudioClip ac)
    {
        if (ac)
        {

            audioSources = gameObject.GetComponents<AudioSource>();

            for (int i = 1; i < audioSources.Length; i++)
            {
                if (!audioSources[i].isPlaying)
                {
                    audioSources[i].loop = false;
                    audioSources[i].clip = ac;
                    audioSources[i].volume = Volume;
                    audioSources[i].Play();
                    return;
                }
            }

            AudioSource newAs = gameObject.AddComponent<AudioSource>();
            newAs.loop = false;
            newAs.clip = ac;
            newAs.volume = Volume;
            newAs.Play();
        }
    }

    public void PlayBGM(string acName)
    {
        if (AudioDic.ContainsKey(acName) && !string.IsNullOrEmpty(acName))
        {
            AudioClip ac = AudioDic[acName];
            PlayBGM(ac);
        }
    }

    private void PlayBGM(AudioClip ac)
    {
        if (ac)
        {
            audioBGM.clip = ac;
            audioBGM.loop = true;
            audioBGM.volume = Volume;
            audioBGM.Play();
        }
    }

    public void StopPlayBGM()
    {
        audioBGM.Stop();
    }

    public void SetVolume()
    {
        Volume =volumeSlider.value;
        for (int i = 0; i < audioSources.Length; i++)
            audioSources[i].volume = Volume;
    }
}

현재 BGM과 BGS만 취급하고 있어 추후 확대될 수 있다.이 시스템의 장점은 필요에 따라 자동으로 오디오소스 수를 늘려 자원을 절약할 수 있다는 데 있다.음량 조절 등 기본적인 기능도 갖추고 있다.다른 스크립트에서 일례로 호출하면 됩니다.
또한 BasePanel을 페이지 기본 클래스로 사용하는 매우 간단한 UI 프레임워크를 설계했습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class BasePanel : MonoBehaviour
{
    private Vector3 initPos;
    protected EventDefine ShowEvent;
    protected EventDefine HideEvent;

    public virtual void Start()
    {
        initPos = transform.position;
        HideThis();
        EventCenter.AddListener(ShowEvent, ShowThis);
        EventCenter.AddListener(HideEvent, HideThis);
    }

    public virtual void OnDestroy()
    {
        EventCenter.RemoveListener(ShowEvent, ShowThis);
        EventCenter.RemoveListener(HideEvent, HideThis);
    }

    public virtual void ShowThis()
    {
        transform.position = initPos;
    }

    public virtual void HideThis()
    {
        transform.position = new Vector3(1000, 1000, 1000);
    }

}


여기서는 이벤트 디스패치 메커니즘의 결합을 해제하는 데 사용되며 UI를 숨기는 방법은 UI 페이지를 보이지 않는 곳으로 이동하는 것이다. (성능 절약)나중에 UI가 복잡해지면 확장을 고려할 수 있습니다.

좋은 웹페이지 즐겨찾기