metahunt/Assets/Scripts/Managers/SettingsManager.cs
2024-02-11 13:53:18 +05:30

147 lines
4.6 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
public class SettingsManager : MonoBehaviour
{
public const string CROSSHAIR_PREF_KEY = "crosshair";
public const string CROSSHAIR_OPACITY_PREF_KEY = "crosshair_opacity";
public const string LOOKSENS_PREF_KEY = "looksense";
// Start is called before the first frame update
public CrosshairsScriptable crosshairs;
public GameObject crosshairListItem;
public Image previewCrosshair;
public Slider crosshairOpacitySlider;
public Slider lookSenseSlider;
[Header("Dev")]
public Slider moveSpeedSlider;
public Slider ballBounceSlider;
public Slider cameraFovSlider;
public Slider cameraZoomSlider;
public GameObject[] panels;
CanvasGroup canvasGroup;
public static SettingsManager instance;
public static bool isShowing => instance.canvasGroup.alpha == 1;
public UnityEvent OnSettingsChanged;
void Awake(){
canvasGroup = GetComponent<CanvasGroup>();
instance =this;
OnSettingsChanged = new UnityEvent();
}
void Start()
{
InitPrefs();
PopulateCrosshairList();
lookSenseSlider.onValueChanged.AddListener(OnLooksensChanged);
crosshairOpacitySlider.onValueChanged.AddListener(OnCrosshairOpacityChanged);
ballBounceSlider.onValueChanged.AddListener((val)=>{OnSettingsChanged.Invoke();});
moveSpeedSlider.onValueChanged.AddListener((val)=>{OnSettingsChanged.Invoke();});
cameraFovSlider.onValueChanged.AddListener((val)=>{OnSettingsChanged.Invoke();});
cameraZoomSlider.onValueChanged.AddListener((val)=>{OnSettingsChanged.Invoke();});
RefreshSettings();
}
void RefreshSettings(){
crosshairOpacitySlider.value = PlayerPrefs.GetFloat(CROSSHAIR_OPACITY_PREF_KEY);
lookSenseSlider.value = PlayerPrefs.GetFloat(LOOKSENS_PREF_KEY);
previewCrosshair.color = new Color(1,1,1, crosshairOpacitySlider.value);
}
void Update(){
if(Input.GetKeyUp(KeyCode.Escape)){
if(isShowing){
if(activePanel == "Options"){
Hide();
}else{
TogglePanel("Options");
}
}
}
}
void OnLooksensChanged(float newval){
PlayerPrefs.SetFloat(LOOKSENS_PREF_KEY,newval);
PlayerPrefs.Save();
OnSettingsChanged.Invoke();
}
void OnCrosshairOpacityChanged(float newval){
PlayerPrefs.SetFloat(CROSSHAIR_OPACITY_PREF_KEY,newval);
PlayerPrefs.Save();
previewCrosshair.color = new Color(1,1,1, newval);
OnSettingsChanged.Invoke();
}
public string activePanel;
public void TogglePanel(string panelName){
foreach(GameObject panel in panels){
panel.SetActive(panel.name == panelName);
}
activePanel = panelName;
}
public void Show(){
canvasGroup.alpha = 1;
canvasGroup.interactable = true;
canvasGroup.blocksRaycasts = true;
TogglePanel("Options");
}
public void Hide(){
canvasGroup.alpha = 0;
canvasGroup.interactable = false;
canvasGroup.blocksRaycasts = false;
}
void PopulateCrosshairList(){
crosshairListItem.transform.GetChild(0).GetComponent<Image>().sprite = crosshairs.crosshairs[0];
crosshairListItem.GetComponent<Button>().onClick.AddListener(()=>{OnCrosshairChosen(0);});
for(int i=1; i < crosshairs.crosshairs.Count; i++){
GameObject newItem = Instantiate(crosshairListItem, crosshairListItem.transform.parent);
newItem.transform.GetChild(0).GetComponent<Image>().sprite = crosshairs.crosshairs[i];
int j =i;
newItem.GetComponent<Button>().onClick.AddListener(()=>{OnCrosshairChosen(j);});
}
previewCrosshair.sprite = crosshairs.crosshairs[PlayerPrefs.GetInt(CROSSHAIR_PREF_KEY)];
}
public void OnCrosshairChosen(int index){
PlayerPrefs.SetInt(CROSSHAIR_PREF_KEY, index);
PlayerPrefs.Save();
previewCrosshair.sprite = crosshairs.crosshairs[index];
OnSettingsChanged.Invoke();
}
public void InitPrefs(){
if(!PlayerPrefs.HasKey(CROSSHAIR_PREF_KEY)){
PlayerPrefs.SetInt(CROSSHAIR_PREF_KEY, 0);
}
if(!PlayerPrefs.HasKey(LOOKSENS_PREF_KEY)){
PlayerPrefs.SetFloat(LOOKSENS_PREF_KEY, 2f);
}
if(!PlayerPrefs.HasKey(CROSSHAIR_OPACITY_PREF_KEY)){
PlayerPrefs.SetFloat(CROSSHAIR_OPACITY_PREF_KEY, 0.8f);
}
PlayerPrefs.Save();
}
}