기획하면서 만든 게임 개발 로그(4) 사운드 관리 시스템과 UI 시스템 추가
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가 복잡해지면 확장을 고려할 수 있습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
게임 만들기 : 구현 된 헥스 맵 좌표계 구조구현해 본 결과, Hex의 좌표계는 교대로 어긋나는 형태가 좋다 헥스의 줄은 가로 일직선이 좋다 헥스를 세로로 잡아 보았다 구현 내용은 . 그리고, 날아다니는 좌표계가 좋을 것이라고, 썼습니다만, 실장해 보면 취급하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.