프로젝트/건즈앤 레이첼스
[유니티 프로젝트] 옵션 UI .3
Bueong_E
2023. 4. 3. 23:28
반응형
SMALL
구조가 많이 바뀌어 많은 수정이 있었다.
구조는
- UIPauseDirector : 정지 버튼과 관련된 모든 UI 들의 최상단 스크립트
- UIPauseMenu : 정지메뉴의 하위단 버튼들과 스크립트 들을 관리
- UISettingPopup : 셋팅 팝업 스크립트
- UIGIveupPopup : 성소로 돌아가는 포기 팝업 스크립트
- UIPauseMenu : 정지메뉴의 하위단 버튼들과 스크립트 들을 관리
- 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