카테고리 없음
[Unity 꿀Tip] 오디오 시스템 구축
smile blog
2024. 6. 9. 23:33
- 오디오 소스에 관한 영상
https://www.youtube.com/watch?v=YPEkpwPrmPk&t=942s
- Audio Source의 생김새
- 오디오 소스에 관한 상세 설명
https://docs.unity3d.com/kr/2022.3/Manual/class-AudioSource.html
오디오 소스 - Unity 매뉴얼
오디오 소스(Audio Source) 는 씬에서 오디오 클립을 재생합니다. 이 클립은 오디오 리스너 또는 오디오 믹서를 통해 재생 가능합니다. 오디오 소스는 모든 종류의 오디오 클립을 재생할 수 있으며,
docs.unity3d.com
[Audio Manager Script 예시]
씬 마다 배경음악과 대사들이 존재, 대사는 여러개가 있을 수 있음
배경 음악과 대사들을 넣을 공간 생성
큐에 있는 배경 음악이 Audio Clip에 할당된 오디오 소스가 생성
큐에 있는 대사들이 Audio Clip에 할당된 오디오 소스가 생성
생성된 오디오 소스는 씬이 넘어가면서 Destroy
배경 음악이 Audio Clip에 할당된 오디오 소스는 loop 재생
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioManager : MonoBehaviour
{
// 배경 음악과 대사를 담을 큐
Queue<AudioClip> backgroundMusicQueue = new Queue<AudioClip>();
Queue<AudioClip> dialogueQueue = new Queue<AudioClip>();
// 현재 재생 중인 배경 음악과 대사의 AudioSource
AudioSource backgroundMusicSource;
AudioSource dialogueSource;
// 배경 음악을 담을 AudioClip 배열
public AudioClip[] backgroundMusicClips;
// 대사를 담을 AudioClip 배열
public AudioClip[] dialogueClips;
void Start()
{
// AudioSource 컴포넌트를 가져와서 초기화
backgroundMusicSource = gameObject.AddComponent<AudioSource>();
dialogueSource = gameObject.AddComponent<AudioSource>();
// 배경 음악을 큐에 추가
foreach (var clip in backgroundMusicClips)
{
backgroundMusicQueue.Enqueue(clip);
}
// 대사를 큐에 추가
foreach (var clip in dialogueClips)
{
dialogueQueue.Enqueue(clip);
}
// 첫 번째 배경 음악 재생
PlayNextBackgroundMusic();
}
void Update()
{
// 대사 재생이 끝나면 다음 대사 재생
if (!dialogueSource.isPlaying && dialogueQueue.Count > 0)
{
PlayNextDialogue();
}
}
// 다음 배경 음악 재생
void PlayNextBackgroundMusic()
{
if (backgroundMusicQueue.Count > 0)
{
var nextClip = backgroundMusicQueue.Dequeue();
backgroundMusicSource.clip = nextClip;
backgroundMusicSource.loop = true; // 루프 재생
backgroundMusicSource.Play();
}
}
// 다음 대사 재생
void PlayNextDialogue()
{
if (dialogueQueue.Count > 0)
{
var nextClip = dialogueQueue.Dequeue();
dialogueSource.clip = nextClip;
dialogueSource.Play();
}
}
// 씬이 변경될 때 호출되는 함수
void OnDestroy()
{
// AudioSource 파괴
Destroy(backgroundMusicSource);
Destroy(dialogueSource);
}
}