프로젝트/건즈앤 레이첼스

[유니티 프로젝트] 옵션 UI .3

Bueong_E 2023. 4. 3. 23:28
반응형
SMALL

 

 

구조가 많이 바뀌어 많은 수정이 있었다.

 

구조는 

 

  • UIPauseDirector  : 정지 버튼과 관련된 모든 UI 들의 최상단 스크립트
    • UIPauseMenu : 정지메뉴의 하위단 버튼들과 스크립트 들을 관리
      • UISettingPopup : 셋팅 팝업 스크립트
      • UIGIveupPopup : 성소로 돌아가는 포기 팝업 스크립트
  • AudioManager : 오디오 매니저 스크립트

 

 

구현중 제일 많은 부분을 차지하는 셋팅창 부분은 따로 만들어 두어 다른 오브젝트 들간의 상호작용을 관리하기위한 스크립트 구조가 제일 큰 부분이었다.

 

영상을 확인하면 알수 있듯 씬전환과 진동 모드 On OFF 의 경우는 좀더 구체적인 구조가 잡히고 추가하는 편이 나을 듯하다.


코드

 

UIPauseDirector  스크립트

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIPauseDirector : MonoBehaviour
{
    public UIPauseMenu uiPauseMenu; // 정지 메뉴 스크립트

    public Button BtnPause; //인게임 팝업 버튼

    public Action onToSanctuary; // 씬 전환 액션

    void Awake()
    {     
        this.uiPauseMenu.Init();
        this.onToSanctuary = () =>
        {
            //씬 매니저 에게 전달 
            Debug.Log("마을 씬으로 전환");
        };

        this.BtnPause.onClick.AddListener(() =>
        {
            this.uiPauseMenu.gameObject.SetActive(true);   
        });
    }

}

UIPauseMenu 스크립트

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIPauseMenu : MonoBehaviour
{
    public Button BtnPauseMenuResume;
    public Button BtnPauseMenuSetting;
    public Button BtnPauseMenuGiveup;

    public UISettingPopup uiSettingPopup;
    public UIGIveupPopup uiGIveupPopup;

    public void Init()
    {
        this.uiSettingPopup.Init();
        this.uiGIveupPopup.Init();

        this.BtnPauseMenuResume.onClick.AddListener(() =>
        {
            this.gameObject.SetActive(false);    
        });

        this.BtnPauseMenuSetting.onClick.AddListener(() =>
        {
            this.uiSettingPopup.gameObject.SetActive(true);

        });

        this.BtnPauseMenuGiveup.onClick.AddListener(() =>
        {
            this.uiGIveupPopup.gameObject.SetActive(true);

        });

        //초기값 설정 set OFF
        this.gameObject.SetActive(false);
    }
}

UISettingPopup 스크립트

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class UISettingPopup : MonoBehaviour
{
    private AudioManager audioManager; // AudioManager 컴포넌트

    public Button SettingPopupDim; // 팝업 끄는 버튼 dim
    public Slider MusicVolumeSlider; // 배경음악 볼륨 조절 슬라이더
    public Slider SFXVolumeSlider; // 효과음 볼륨 조절 슬라이더
    public Toggle vibrationToggle; // 진동 On/Off 토글
    public Button BtnAnnouncement; // 공지사항 버튼
    public Button BtnHelp; // 도움말 버튼
    public Text txtVersion;
    public Button btnSettingPopupClose; // 팝업 끄는 버튼

    public void Init()
    {
        //오디오 매니저찾기 
        this.audioManager = GameObject.FindObjectOfType<AudioManager>();    


        //팝업 메뉴 내 버튼 기능
        this.MusicVolumeSlider.onValueChanged.AddListener((x) =>
        {
            this.OnBackgroundMusicSliderValueChanged(x);
        });

        this.SFXVolumeSlider.onValueChanged.AddListener((x) =>
        {
            this.OnSoundEffectSliderValueChanged(x);
        });

        this.vibrationToggle.onValueChanged.AddListener((x) => {

            this.OnVibrationToggleValueChanged(x);
        });

        // 임시로 제 블로그를사용했습니다. 나중에 저희 게임 블로그로 변경하면 됩니다.
        this.BtnAnnouncement.onClick.AddListener(() => {
            Application.OpenURL("https://bueong-e.tistory.com/");
        });

        this.BtnHelp.onClick.AddListener(() => {
            Application.OpenURL("https://bueong-e.tistory.com/");
        });

        // 팝업 끄는 버튼
        this.btnSettingPopupClose.onClick.AddListener(() => {
        
            this.gameObject.SetActive(false);
        });
        // 팝업 끄는 버튼 dim
        this.SettingPopupDim.onClick.AddListener(() => {

            this.gameObject.SetActive(false);
        });

        //초기값 설정
        this.MusicVolumeSlider.value = this.audioManager.backgroundMusicVolume;
        this.SFXVolumeSlider.value = this.audioManager.soundEffectVolume;
        this.vibrationToggle.isOn = this.audioManager.isVibrationOn;
        //ver info : Major.Minor.Patch 순으로 변경
        this.txtVersion.text = string.Format("Ver.{0}", Application.version);

        this.gameObject.SetActive(false);

    }

    // 배경음악 볼륨 조절 슬라이더 값 변경시 호출되는 메소드
    public void OnBackgroundMusicSliderValueChanged(float value)
    {
        this.audioManager.SetBackgroundMusicVolume(value);
    }

    // 효과음 볼륨 조절 슬라이더 값 변경시 호출되는 메소드
    public void OnSoundEffectSliderValueChanged(float value)
    {
        this.audioManager.SetSoundEffectVolume(value);
    }

    // 진동 On/Off 토글 값 변경시 호출되는 메소드
    public void OnVibrationToggleValueChanged(bool value)
    {
        this.audioManager.SetVibrationOnOff(value);
    }
}

 

UIGIveupPopup 스크립트

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIGIveupPopup : MonoBehaviour
{
    public Button GIveupPopupDim; // 팝업 끄는 버튼 dim
    public Button btnSelect; // 수락 버튼
    public Button btnCancel; // 거절버튼

    public UIPauseDirector director;

    public void Init()
    {
        this.GIveupPopupDim.onClick.AddListener(() =>
        {
            this.gameObject.SetActive(false);   
        });

        this.btnSelect.onClick.AddListener(() =>
        {
            // UIPauseDirector 에서 정의
            this.director.onToSanctuary();
        });

        this.btnCancel.onClick.AddListener(() =>
        {
            this.gameObject.SetActive(false);
        });

        //초기값 설정 set OFF
        this.gameObject.SetActive(false);

    }
}

AudioManager 스크립트

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class AudioManager : MonoBehaviour
{
    public float backgroundMusicVolume = 1f; // 배경음악 볼륨
    public float soundEffectVolume = 1f; // 효과음 볼륨
    public bool isVibrationOn = true; // 진동 On/Off

    private AudioSource audioSource;
    public GameObject deathSound;
  

    void Start()
    {
        // 초기화
        this.audioSource = this.GetComponent<AudioSource>();
    }

    // 배경음악 볼륨 설정
    public void SetBackgroundMusicVolume(float value)
    {
        this.backgroundMusicVolume = value;
        this.audioSource.volume = value;   
    }

    // 효과음 볼륨 설정
    public void SetSoundEffectVolume(float value)
    {
        this.soundEffectVolume = value;
        this.PlaySfx();
    }


    // 진동 On/Off 설정
    public void SetVibrationOnOff(bool value)
    {
        this.isVibrationOn = value;
        string state = value ? "on" : "off";
        Debug.LogFormat("viberation : {0}", state);
    }

    public void PlaySfx()
    {
        var go = GameObject.Instantiate(this.deathSound);    
        go.GetComponent<AudioSource>().volume = this.soundEffectVolume;    
        this.StartCoroutine(this.DestoySFX(go));    
    }

    private IEnumerator DestoySFX(GameObject go)
    {
        yield return new WaitForSeconds(2f);
        GameObject.Destroy(go);
    }

}

 

다음 구현 목표는 제작중인 인벤토리 마무리 

반응형
LIST