반응형
[30회차 수업내용] 250627
1. 사운드매니저
2. 설정창
3. 씬전환
1. 사운드매니저_배열 이용
// SoundController 스크립트
using UnityEngine;
public class SoundController : MonoBehaviour
{
// 배경음 재생용 AudioSource (한 번에 하나만 재생으로 할 소리)
[SerializeField] private AudioSource bgmaudio;
// 효과음 재생용 AudioSource (겹쳐서 재생 가능하게 할 소리)
[SerializeField] private AudioSource eventAudio;
// 사용할 오디오 클립들을 배열로 등록
[SerializeField] private AudioClip[] clips;
void Start()
{
// 이 스크립트가 붙은 오브젝트의 AudioSource를 bgmaudio로 사용 (효과음용 eventAudio는 따로 드래그로 할당해야 함)
bgmaudio = GetComponent<AudioSource>();
// 게임 시작 시 기본 배경음악 재생
BgmSoundPlay("Town BGM");
}
public void BgmSoundPlay(string clipName)
{
foreach (var clip in clips)
{
if (clip.name == clipName)
{
// 배경음으로 설정하고 재생
bgmaudio.clip = clip;
bgmaudio.Play();
return;
}
}
// 원하는 이름의 배경음이 없을 경우 경고 로그 출력
Debug.Log($"{clipName}을 찾지 못했습니다");
}
public void EventSoundPlay(string clipName)
{
foreach (var clip in clips)
{
if (clip.name == clipName)
{
// 한 번만 재생 (겹쳐서 재생 가능)
eventAudio.PlayOneShot(clip);
return;
}
}
Debug.Log($"{clipName}을 찾지 못했습니다");
}
}
* 리마인드
- foreach는 배열을 하나씩 순회하며 clip 변수에 담아 반복
- AudioSource 잘 부터있는지 꼭 확인!

(문열림 코드 적용은 29회차에 정리)
2. 설정창2.1 UI - slider와 Toggle 이용 구성

2.2 Setting 버튼, Quit 버튼 연결

2.3 Slider / Toggle - Soundmanager와 연결
using UnityEngine;
using UnityEngine.UI;
// 사운드 설정을 관리하는 컨트롤러 스크립트
public class SoundController : MonoBehaviour
{
[SerializeField] private AudioSource bgmAudio;
[SerializeField] private AudioSource eventAudio;
[SerializeField] private AudioClip[] clips;
// 배경음 볼륨 조절 슬라이더
[SerializeField] private Slider bgmVolume;
// 효과음 볼륨 조절 슬라이더
[SerializeField] private Slider eventVolume;
// 배경음 음소거 토글
[SerializeField] private Toggle bgmMute;
// 효과음 음소거 토글
[SerializeField] private Toggle eventMute;
// 오디오 상태를 UI에 반영 (처음 시작 시 한 번 실행됨)
void Awake()
{
bgmVolume.value = bgmAudio.volume;
eventVolume.value = eventAudio.volume;
// 현재 음소거 상태를 토글에 반영 (mute는 true일 때 소리 꺼짐)
bgmMute.isOn = bgmAudio.mute;
eventMute.isOn = eventAudio.mute;
}
// 게임이 시작될 때 실행
void Start()
{
// 초기 배경음 재생
BgmSoundPlay("Town BGM");
// 슬라이더 및 토글에 이벤트 연결 (값이 바뀔 때마다 함수 실행됨)
bgmVolume.onValueChanged.AddListener(OnBgmVolumeChanged);
eventVolume.onValueChanged.AddListener(OnEventVolumeChanged);
bgmMute.onValueChanged.AddListener(OnBgmMute);
eventMute.onValueChanged.AddListener(OnEventMute);
}
public void BgmSoundPlay(string clipName)
{
foreach (var clip in clips)
{
if (clip.name == clipName)
{
bgmAudio.clip = clip;
bgmAudio.Play();
return;
}
}
Debug.Log($"{clipName}을 찾지 못했습니다");
}
public void EventSoundPlay(string clipName)
{
foreach (var clip in clips)
{
if (clip.name == clipName)
{
eventAudio.PlayOneShot(clip); // 겹쳐서 재생 가능
return;
}
}
Debug.Log($"{clipName}을 찾지 못했습니다");
}
// 배경음 볼륨 변경 이벤트
private void OnBgmVolumeChanged(float volume)
{
bgmAudio.volume = volume;
}
// 효과음 볼륨 변경 이벤트
private void OnEventVolumeChanged(float volume)
{
eventAudio.volume = volume;
}
// 배경음 음소거 토글 이벤트
private void OnBgmMute(bool isOn)
{
bgmAudio.mute = !isOn; // 토글이 켜져 있으면 음소거 해제
}
// 효과음 음소거 토글 이벤트
private void OnEventMute(bool isOn)
{
eventAudio.mute = !isOn;
}
}
3. 씬 전환
3.1 포탈설정
- particle system
작은 이미지나 메쉬(입자, 파티클)를 반복적으로 생성하고 움직이게 하여
불꽃, 연기, 눈, 폭발, 마법 효과 등과 같은 시각적 효과(VFX)를 표현하는 시스템


- 자식까지 한번에 잡고, Particle System > Renderer 찾아서 Order in Layer 설정 가능
- Colldier - Trigger 추가
3.2 로딩 화면 만들기
- 배경 가져오기 (Canvas)
- 진행 바 만들기 = Image 컴포넌트의 Fill Amount 를 점점 채우는 방식으로 구현

| Filled | 이미지가 점차 채워지거나 비워지는 방식으로 출력됨 |
| Fill Method | 채우는 방향 설정 (Horizontal, Vertical, Radial 등) |
| Fill Origin | 시작 위치 설정 (왼쪽, 오른쪽 등) |
| Fill Amount | 0.0~1.0 사이 값으로 채워진 정도 (스크립트에서 조절 가능) |

3.3 포탈 활성화, 로딩 화면 구현 코드
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class PortalController : MonoBehaviour
{
public FadeRoutine fade;
public GameObject portalEffect;
public GameObject loadingImage;
public Image progressBar;
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
StartCoroutine(PortalRoutine());
}
}
IEnumerator PortalRoutine()
{
portalEffect.SetActive(true);
yield return StartCoroutine(fade.Fade(3f, Color.white, true)); // 페이드 온
loadingImage.SetActive(true);
yield return StartCoroutine(fade.Fade(3f, Color.white, false)); // 페이드 오프
// 진행바가 100%가 될 때까지 fillAmount를 증가시킴
while (progressBar.fillAmount < 1f)
{
progressBar.fillAmount += Time.deltaTime * 0.3f;
yield return null; // 다음 프레임까지 대기
}
// 로딩 완료 후, 빌드 인덱스 1번 씬으로 전환
SceneManager.LoadScene(1);
}
}
- using UnityEngine.SceneManagement; 를 선언하면 SceneManager 사용 가능
- 연결 잘 해준다

3.4. 빌드에 씬 추가하기

4.로딩창에 설정버튼 안보이게하기
UI 버튼이 계속 보이길래, public Gameobject settingUI를 추가해서, 로딩할때 비활성화, 씬 전환되며 활성화되게 추가해주었다.


반응형