본문 바로가기

유니티(사운드매니저 / 설정창 / 씬 전환) _ 멋쟁이사자처럼 유니티 부트캠프 후기 30회차

@salmu2025. 7. 3. 00:10
반응형

[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. 빌드에 씬 추가하기

:SceneManager 감지 위해 필수!

 

 

 

4.로딩창에 설정버튼 안보이게하기

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

 

 

 

이번 수업에서는 사운드 매니저와 설정 UI, 포탈을 통한 로딩 화면과 씬 전환을 구현했다. 오디오 설정을 슬라이더와 토글로 제어하는 법을 익혔고, 로딩바를 fillAmount로 구현하면서 UI와 연출이 연결되는 구조를 이해할 수 있었다. 설정 버튼이 계속 보이는 문제는 SetActive()로 해결해보는게 재미있었다. 실제 게임에 활용할 유용한 기능들을 오늘 많이 배운 것 같다.

 

반응형
salmu
@salmu :: SMU 각종 기록

목차