1
This commit is contained in:
@@ -3,6 +3,8 @@ using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Newtonsoft.Json;
|
||||
using Unity.Mathematics;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
#if UNITY_EDITOR
|
||||
@@ -10,103 +12,106 @@ using Types = FullscreenEditor.Types;
|
||||
#endif
|
||||
namespace BITKit.UX.Settings
|
||||
{
|
||||
public class UXSettings : MonoBehaviour
|
||||
public interface IUXSettings:IUXPanel{}
|
||||
public class UXSettings<T,TValue> : UIToolkitSubPanel<T>,IUXSettings where T: IUXPanel
|
||||
{
|
||||
|
||||
[SerializeField] private UIDocument document;
|
||||
|
||||
[UXBindPath("resolution-dropdown")]
|
||||
private DropdownField _resolutionDropdown;
|
||||
[UXBindPath("sensitivity-slider")]
|
||||
private Slider _sensitivitySlider;
|
||||
[UXBindPath("fullscreen-toggle")]
|
||||
private Toggle _fullscreenToggle;
|
||||
|
||||
private void Start()
|
||||
private readonly TValue _value;
|
||||
private readonly IWrapper<TValue> _valueWrapper;
|
||||
public UXSettings(IServiceProvider serviceProvider, IWrapper<TValue> valueWrapper) : base(serviceProvider)
|
||||
{
|
||||
UXUtils.Inject(this);
|
||||
|
||||
|
||||
|
||||
_resolutionDropdown.choices = Screen.resolutions.Select(x => x.ToString()).ToList();
|
||||
_resolutionDropdown.SetValueWithoutNotify(Screen.currentResolution.ToString());
|
||||
_resolutionDropdown.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
Data.Set(Constant.Environment.mat_setvideomode, x.newValue);
|
||||
});
|
||||
|
||||
_fullscreenToggle.SetValueWithoutNotify(Screen.fullScreen);
|
||||
_fullscreenToggle.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
Data.Set(Constant.Environment.fullscreen, x.newValue);
|
||||
});
|
||||
|
||||
//_sensitivitySlider.SetValueWithoutNotify(PlayerConfig.Singleton.Sensitivity);
|
||||
_sensitivitySlider.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
Data.Set(Constant.Environment.sensitivity, x.newValue);
|
||||
});
|
||||
|
||||
Data.AddListener<string>(Constant.Environment.mat_setvideomode, OnResolutionChanged);
|
||||
Data.AddListener<bool>(Constant.Environment.fullscreen,OnFullScreenChanged);
|
||||
Data.AddListener<float>(Constant.Environment.sensitivity,OnSensitivityChanged);
|
||||
|
||||
destroyCancellationToken.Register(() =>
|
||||
{
|
||||
Data.RemoveListender<string>(Constant.Environment.mat_setvideomode, OnResolutionChanged);
|
||||
Data.RemoveListender<bool>(Constant.Environment.fullscreen,OnFullScreenChanged);
|
||||
Data.RemoveListender<float>(Constant.Environment.sensitivity,OnSensitivityChanged);
|
||||
|
||||
PlayerPrefs.Save();
|
||||
});
|
||||
|
||||
if(PlayerPrefs.HasKey(Constant.Environment.fullscreen))
|
||||
Data.Set(Constant.Environment.fullscreen, PlayerPrefs.GetInt(Constant.Environment.fullscreen) == 1);
|
||||
if(PlayerPrefs.HasKey(Constant.Environment.sensitivity))
|
||||
Data.Set(Constant.Environment.sensitivity, PlayerPrefs.GetFloat(Constant.Environment.sensitivity));
|
||||
_valueWrapper = valueWrapper;
|
||||
_value = _valueWrapper.Value;
|
||||
}
|
||||
|
||||
private async void OnSensitivityChanged(float obj)
|
||||
{
|
||||
await UniTask.SwitchToMainThread(destroyCancellationToken);
|
||||
|
||||
_sensitivitySlider.SetValueWithoutNotify(obj);
|
||||
|
||||
PlayerPrefs.SetFloat(Constant.Environment.sensitivity,obj);
|
||||
}
|
||||
|
||||
private async void OnFullScreenChanged(bool obj)
|
||||
{
|
||||
await UniTask.SwitchToMainThread(destroyCancellationToken);
|
||||
_fullscreenToggle.SetValueWithoutNotify(obj);
|
||||
|
||||
[UXBindPath("settings-container")]
|
||||
private VisualElement _settingsContainer;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
if (obj)
|
||||
private void Save()
|
||||
{
|
||||
_valueWrapper.Value = _value;
|
||||
}
|
||||
protected override void OnInitiated()
|
||||
{
|
||||
base.OnInitiated();
|
||||
_settingsContainer.Clear();
|
||||
foreach (var propertyInfo in typeof(TValue).GetProperties())
|
||||
{
|
||||
FullscreenEditor.Fullscreen.MakeFullscreen(Types.GameView);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var x in FullscreenEditor.Fullscreen.GetAllFullscreen())
|
||||
var name = propertyInfo.GetDisplayName();
|
||||
var value = propertyInfo.GetValue(_valueWrapper.Value);
|
||||
switch (propertyInfo.PropertyType)
|
||||
{
|
||||
x.Close();
|
||||
case var type when type == typeof(bool):
|
||||
{
|
||||
var checkBox = _settingsContainer.Create<Toggle>();
|
||||
checkBox.label = name;
|
||||
checkBox.SetValueWithoutNotify(value.As<bool>());
|
||||
checkBox.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
propertyInfo.SetValue(_value,x.newValue);
|
||||
Save();
|
||||
});
|
||||
}
|
||||
break;
|
||||
case var type when type == typeof(float):
|
||||
{
|
||||
var slider = _settingsContainer.Create<Slider>();
|
||||
slider.label = name;
|
||||
slider.showInputField = true;
|
||||
slider.showMixedValue = true;
|
||||
slider.lowValue = 1;
|
||||
slider.highValue = 100;
|
||||
slider.SetValueWithoutNotify(value.As<float>());
|
||||
slider.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
propertyInfo.SetValue(_value,x.newValue);
|
||||
Save();
|
||||
});
|
||||
}
|
||||
break;
|
||||
case var type when type == typeof(int):
|
||||
{
|
||||
var slider = _settingsContainer.Create<SliderInt>();
|
||||
slider.label = name;
|
||||
slider.showInputField = true;
|
||||
slider.showMixedValue = true;
|
||||
slider.lowValue = 1;
|
||||
slider.highValue = 100;
|
||||
slider.SetValueWithoutNotify(value.As<int>());
|
||||
slider.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
propertyInfo.SetValue(_value,x.newValue);
|
||||
Save();
|
||||
});
|
||||
}
|
||||
break;
|
||||
case var type when type == typeof(string):
|
||||
{
|
||||
var textField = _settingsContainer.Create<TextField>();
|
||||
textField.label = name;
|
||||
textField.SetValueWithoutNotify(value.As<string>());
|
||||
textField.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
propertyInfo.SetValue(_value,x.newValue);
|
||||
Save();
|
||||
});
|
||||
}
|
||||
break;
|
||||
case var type when type.IsEnum:
|
||||
{
|
||||
var enumField = _settingsContainer.Create<EnumField>();
|
||||
enumField.label = name;
|
||||
|
||||
enumField.Init(value as Enum);
|
||||
enumField.SetValueWithoutNotify(value as Enum);
|
||||
enumField.RegisterValueChangedCallback(x =>
|
||||
{
|
||||
propertyInfo.SetValue(_value,x.newValue);
|
||||
Save();
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
Screen.fullScreen = obj;
|
||||
#endif
|
||||
PlayerPrefs.SetInt(Constant.Environment.fullscreen, obj ? 1 : 0);
|
||||
}
|
||||
private async void OnResolutionChanged(string newResolution)
|
||||
{
|
||||
await UniTask.SwitchToMainThread(destroyCancellationToken);
|
||||
|
||||
_resolutionDropdown.SetValueWithoutNotify(newResolution);
|
||||
var resolution = Screen.resolutions.Single(x => x.ToString() == newResolution);
|
||||
|
||||
Screen.SetResolution(resolution.width,resolution.height,Data.Get<bool>(Constant.Environment.fullscreen));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user