forked from sin365/AxibugEmuOnline
侧边栏UI增加可编辑值的选项类型,滤镜预设现在已支持参数的修改
This commit is contained in:
parent
c421466b84
commit
d6fa9772b9
File diff suppressed because it is too large
Load Diff
@ -26,7 +26,22 @@ namespace AxibugEmuOnline.Client
|
||||
where t.DeclaringType.IsSubclassOf(typeof(FilterEffect))
|
||||
orderby t.MetadataToken
|
||||
select t);
|
||||
m_editableParamList = parameters.Select(p => new EditableParamerter(p.Name, (ParameterOverride)p.GetValue(this))).ToList();
|
||||
|
||||
m_editableParamList = new List<EditableParamerter>();
|
||||
foreach (var param in parameters)
|
||||
{
|
||||
var paramObj = (ParameterOverride)param.GetValue(this);
|
||||
var rangeAtt = param.GetCustomAttribute<RangeAttribute>();
|
||||
float min = 0;
|
||||
float max = 10;
|
||||
if (rangeAtt != null)
|
||||
{
|
||||
min = rangeAtt.min; max = rangeAtt.max;
|
||||
}
|
||||
|
||||
var editableParam = new EditableParamerter(param.Name, paramObj, min, max);
|
||||
m_editableParamList.Add(editableParam);
|
||||
}
|
||||
}
|
||||
|
||||
public class EditableParamerter
|
||||
@ -42,9 +57,13 @@ namespace AxibugEmuOnline.Client
|
||||
set
|
||||
{
|
||||
valueFieldInfo.SetValue(m_paramObject, value);
|
||||
m_paramObject.overrideState = true;
|
||||
}
|
||||
}
|
||||
public EditableParamerter(string name, ParameterOverride paramObject)
|
||||
public object MinValue { get; private set; }
|
||||
public object MaxValue { get; private set; }
|
||||
|
||||
public EditableParamerter(string name, ParameterOverride paramObject, object minValue, object maxValue)
|
||||
{
|
||||
m_paramObject = paramObject;
|
||||
Name = name;
|
||||
@ -60,18 +79,16 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
ValueType = typeof(object);
|
||||
}
|
||||
|
||||
MinValue = minValue;
|
||||
MaxValue = maxValue;
|
||||
}
|
||||
|
||||
public void ResetToDefault() => m_paramObject.overrideState = false;
|
||||
|
||||
public string Serilized()
|
||||
{
|
||||
return JsonUtility.ToJson(Value);
|
||||
}
|
||||
|
||||
public void Apply(string json)
|
||||
public void Apply(object overrideValue)
|
||||
{
|
||||
var overrideValue = JsonUtility.FromJson(json, ValueType);
|
||||
Value = overrideValue;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
@ -94,7 +95,8 @@ namespace AxibugEmuOnline.Client
|
||||
filter = Filters.FirstOrDefault(f => f.Name == value.filterName);
|
||||
if (filter != null)
|
||||
{
|
||||
preset = filter.Presets.FirstOrDefault(p => p.Name == value.filterName);
|
||||
string presetName = value.presetName;
|
||||
preset = filter.Presets.FirstOrDefault(p => p.Name == presetName);
|
||||
}
|
||||
|
||||
return (filter, preset);
|
||||
@ -126,9 +128,9 @@ namespace AxibugEmuOnline.Client
|
||||
else Presets = loadedPresets.presets;
|
||||
}
|
||||
|
||||
private void savePresets()
|
||||
public void SavePresets()
|
||||
{
|
||||
var json = JsonUtility.ToJson(new FilterPresetList { presets = Presets });
|
||||
var json = JsonUtility.ToJson(new FilterPresetList(Presets));
|
||||
PlayerPrefs.SetString($"Filter_{Name}_PresetList", json);
|
||||
}
|
||||
|
||||
@ -141,7 +143,7 @@ namespace AxibugEmuOnline.Client
|
||||
newPreset = new FilterPreset(presetName);
|
||||
Presets.Add(newPreset);
|
||||
|
||||
savePresets();
|
||||
SavePresets();
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -149,7 +151,7 @@ namespace AxibugEmuOnline.Client
|
||||
public void RemovePreset(FilterPreset preset)
|
||||
{
|
||||
if (!Presets.Remove(preset)) return;
|
||||
savePresets();
|
||||
SavePresets();
|
||||
|
||||
EventInvoker.RaiseFilterPresetRemoved(this, preset);
|
||||
}
|
||||
@ -166,11 +168,11 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
foreach (var param in Paramerters)
|
||||
{
|
||||
var json = preset.GetParamValueJson(param.Name);
|
||||
if (string.IsNullOrEmpty(json))
|
||||
var value = preset.GetParamValue(param.Name, param.ValueType);
|
||||
if (value == null)
|
||||
param.ResetToDefault();
|
||||
else
|
||||
param.Apply(json);
|
||||
param.Apply(value);
|
||||
}
|
||||
|
||||
}
|
||||
@ -182,6 +184,15 @@ namespace AxibugEmuOnline.Client
|
||||
private class FilterPresetList
|
||||
{
|
||||
public List<FilterPreset> presets;
|
||||
|
||||
public FilterPresetList(List<FilterPreset> presets)
|
||||
{
|
||||
this.presets = presets;
|
||||
foreach (var preset in presets)
|
||||
{
|
||||
preset.ReadyForJson();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
@ -201,6 +212,12 @@ namespace AxibugEmuOnline.Client
|
||||
Name = presetName;
|
||||
}
|
||||
|
||||
public void ReadyForJson()
|
||||
{
|
||||
m_paramName = m_paramName2ValueJson.Keys.ToList();
|
||||
m_valueJson = m_paramName2ValueJson.Values.ToList();
|
||||
}
|
||||
|
||||
public string GetParamValueJson(string paramName)
|
||||
{
|
||||
prepareCache();
|
||||
@ -209,6 +226,34 @@ namespace AxibugEmuOnline.Client
|
||||
return value;
|
||||
}
|
||||
|
||||
public object GetParamValue(string paramName, Type valueType)
|
||||
{
|
||||
var rawStr = GetParamValueJson(paramName);
|
||||
if (rawStr == null) return null;
|
||||
|
||||
if (valueType == typeof(float))
|
||||
{
|
||||
float.TryParse(rawStr, out var floatVal);
|
||||
return floatVal;
|
||||
}
|
||||
else if (valueType.IsEnum)
|
||||
{
|
||||
Enum.TryParse(valueType, rawStr,out var enumValue);
|
||||
return enumValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
App.log.Error($"尚未支持的滤镜参数类型{valueType}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetParamValue(string paramName, Type valueType, object value)
|
||||
{
|
||||
prepareCache();
|
||||
m_paramName2ValueJson[paramName] = value.ToString();
|
||||
}
|
||||
|
||||
private void prepareCache()
|
||||
{
|
||||
if (m_cacheReady) return;
|
||||
|
@ -1,5 +1,6 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using AxibugEmuOnline.Client.UI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
@ -88,12 +89,16 @@ namespace AxibugEmuOnline.Client
|
||||
private Filter m_filter;
|
||||
private FilterPreset m_preset;
|
||||
private OptionUI_MenuItem m_ui;
|
||||
private List<OptionMenu> m_menu;
|
||||
|
||||
public Opt_Presets(Filter filter, FilterPreset preset) : base(preset.Name, null)
|
||||
{
|
||||
m_filter = filter;
|
||||
m_preset = preset;
|
||||
|
||||
m_menu = new List<OptionMenu>();
|
||||
m_menu.Add(new Opt_Delete(m_filter, m_preset));
|
||||
foreach (var p in m_filter.Paramerters) m_menu.Add(new Opt_ParamEditor(m_filter, p, m_preset));
|
||||
}
|
||||
|
||||
public override void OnShow(OptionUI_MenuItem ui)
|
||||
@ -122,7 +127,37 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
protected override List<OptionMenu> GetOptionMenus()
|
||||
{
|
||||
return new List<OptionMenu> { new Opt_Delete(m_filter, m_preset) };
|
||||
return m_menu;
|
||||
}
|
||||
|
||||
public class Opt_ParamEditor : ValueSetMenu
|
||||
{
|
||||
private Filter m_filter;
|
||||
private FilterEffect.EditableParamerter m_param;
|
||||
private FilterPreset m_preset;
|
||||
|
||||
public Opt_ParamEditor(Filter filter, FilterEffect.EditableParamerter editParam, FilterPreset preset)
|
||||
: base(editParam.Name)
|
||||
{
|
||||
m_filter = filter;
|
||||
m_param = editParam;
|
||||
m_preset = preset;
|
||||
}
|
||||
|
||||
public override Type ValueType => m_param.ValueType;
|
||||
|
||||
public override object ValueRaw => m_preset.GetParamValue(m_param.Name, ValueType) ?? m_param.Value;
|
||||
|
||||
public override void OnValueChanged(object newValue)
|
||||
{
|
||||
m_preset.SetParamValue(m_param.Name, ValueType, newValue);
|
||||
m_filter.SavePresets();
|
||||
m_param.Apply(newValue);
|
||||
}
|
||||
|
||||
public override object Min => m_param.MinValue;
|
||||
|
||||
public override object Max => m_param.MaxValue;
|
||||
}
|
||||
|
||||
public class Opt_Delete : ExecuteMenu
|
||||
@ -141,6 +176,8 @@ namespace AxibugEmuOnline.Client
|
||||
m_filter.RemovePreset(m_preset);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ namespace AxibugEmuOnline.Client
|
||||
[Space]
|
||||
[Header("模板")]
|
||||
[SerializeField] OptionUI_ExecuteItem TEMPLATE_EXECUTEITEM;
|
||||
[SerializeField] OptionUI_ValueEditItem TEMPLATE_VALUEEDITITEM;
|
||||
|
||||
private OptionUI m_child;
|
||||
private OptionUI m_parent;
|
||||
@ -64,6 +65,8 @@ namespace AxibugEmuOnline.Client
|
||||
protected override void Awake()
|
||||
{
|
||||
TEMPLATE_EXECUTEITEM.gameObject.SetActiveEx(false);
|
||||
TEMPLATE_VALUEEDITITEM.gameObject.SetActiveEx(false);
|
||||
|
||||
SelectBorder.gameObject.SetActiveEx(false);
|
||||
base.Awake();
|
||||
}
|
||||
@ -269,15 +272,19 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
if (menuData is ExecuteMenu executeMenu)
|
||||
{
|
||||
var menuUI = GameObject.Instantiate(TEMPLATE_EXECUTEITEM.gameObject, TEMPLATE_EXECUTEITEM.transform.parent).GetComponent<OptionUI_ExecuteItem>();
|
||||
var menuUI = Instantiate(TEMPLATE_EXECUTEITEM.gameObject, TEMPLATE_EXECUTEITEM.transform.parent).GetComponent<OptionUI_ExecuteItem>();
|
||||
menuUI.gameObject.SetActive(true);
|
||||
menuUI.SetData(this, executeMenu);
|
||||
m_runtimeMenuItems.Add(menuUI);
|
||||
}
|
||||
else
|
||||
else if (menuData is ValueSetMenu valueSetMenu)
|
||||
{
|
||||
throw new NotImplementedException($"暂不支持的菜单类型{menuData.GetType().Name}");
|
||||
var menuUI = Instantiate(TEMPLATE_VALUEEDITITEM.gameObject, TEMPLATE_VALUEEDITITEM.transform.parent).GetComponent<OptionUI_ValueEditItem>();
|
||||
menuUI.gameObject.SetActive(true);
|
||||
menuUI.SetData(this, valueSetMenu);
|
||||
m_runtimeMenuItems.Add(menuUI);
|
||||
}
|
||||
else throw new NotImplementedException($"暂不支持的菜单类型{menuData.GetType().Name}");
|
||||
}
|
||||
|
||||
private void ReleaseRuntimeMenus()
|
||||
@ -305,10 +312,23 @@ namespace AxibugEmuOnline.Client
|
||||
Hide();
|
||||
}
|
||||
|
||||
protected override void OnCmdSelectItemLeft()
|
||||
{
|
||||
var executer = m_runtimeMenuItems[SelectIndex];
|
||||
if (executer != null)
|
||||
{
|
||||
executer.OnLeft();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnCmdSelectItemRight()
|
||||
{
|
||||
var executer = m_runtimeMenuItems[SelectIndex];
|
||||
if (!executer.IsExpandMenu) return;
|
||||
if (!executer.IsExpandMenu)
|
||||
{
|
||||
executer.OnRight();
|
||||
return;
|
||||
}
|
||||
|
||||
OnCmdEnter();
|
||||
}
|
||||
@ -384,25 +404,6 @@ namespace AxibugEmuOnline.Client
|
||||
protected abstract List<OptionMenu> GetOptionMenus();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 带有值类型显示和编辑的菜单
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
public class ValueSetMenu<T> : ValueSetMenu
|
||||
{
|
||||
public sealed override Type ValueType => typeof(T);
|
||||
|
||||
public T Value { get; private set; }
|
||||
|
||||
public sealed override object ValueRaw => Value;
|
||||
|
||||
public sealed override void OnValueChanged(object newValue)
|
||||
{
|
||||
Value = (T)newValue;
|
||||
}
|
||||
protected ValueSetMenu(string name) : base(name) { }
|
||||
}
|
||||
|
||||
/// <summary> 不要直接继承这个类 </summary>
|
||||
public abstract class OptionMenu
|
||||
{
|
||||
@ -421,7 +422,9 @@ namespace AxibugEmuOnline.Client
|
||||
public virtual void OnShow(OptionUI_MenuItem ui) { }
|
||||
public virtual void OnHide() { }
|
||||
}
|
||||
/// <summary> 不要直接继承这个类 </summary>
|
||||
/// <summary>
|
||||
/// 带有值类型显示和编辑的菜单
|
||||
/// </summary>
|
||||
public abstract class ValueSetMenu : OptionMenu
|
||||
{
|
||||
public ValueSetMenu(string name) : base(name) { }
|
||||
@ -429,7 +432,7 @@ namespace AxibugEmuOnline.Client
|
||||
public abstract Type ValueType { get; }
|
||||
public abstract object ValueRaw { get; }
|
||||
public abstract void OnValueChanged(object newValue);
|
||||
public abstract object Min { get; }
|
||||
public abstract object Max { get; }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ namespace AxibugEmuOnline.Client
|
||||
protected abstract void OnSetData(OptionMenu menuData);
|
||||
|
||||
public abstract void OnExecute(OptionUI optionUI, ref bool cancelHide);
|
||||
public virtual void OnLeft() { }
|
||||
public virtual void OnRight() { }
|
||||
public abstract void OnFocus();
|
||||
public virtual void OnHide() { }
|
||||
}
|
||||
|
@ -0,0 +1,69 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class OptionUI_ValueEditItem : OptionUI_MenuItem<ValueSetMenu>
|
||||
{
|
||||
[SerializeField]
|
||||
OptionUI_ValueEditItem_FloatEdit com_floatEdit;
|
||||
[SerializeField]
|
||||
OptionUI_ValueEditItem_EnumEdit com_enumEdit;
|
||||
|
||||
IValueEditControl m_currentCom;
|
||||
|
||||
protected override void OnSetData(OptionMenu menuData)
|
||||
{
|
||||
com_floatEdit.gameObject.SetActive(false);
|
||||
com_enumEdit.gameObject.SetActive(false);
|
||||
|
||||
if (menuData is ValueSetMenu valueMenu)
|
||||
{
|
||||
if (valueMenu.ValueType == typeof(float))
|
||||
{
|
||||
m_currentCom = com_floatEdit;
|
||||
}
|
||||
else if (valueMenu.ValueType.IsEnum)
|
||||
{
|
||||
m_currentCom = com_enumEdit;
|
||||
}
|
||||
else
|
||||
{
|
||||
App.log.Error($"ÉÐδ֧³ÖµÄÊý¾ÝÀàÐÍ:{valueMenu.ValueType}");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
m_currentCom.gameObject.SetActiveEx(true);
|
||||
m_currentCom.SetData(valueMenu);
|
||||
}
|
||||
|
||||
base.OnSetData(menuData);
|
||||
}
|
||||
|
||||
public override void OnExecute(OptionUI optionUI, ref bool cancelHide)
|
||||
{
|
||||
cancelHide = true;
|
||||
m_currentCom?.OnExecute();
|
||||
}
|
||||
|
||||
public override void OnLeft()
|
||||
{
|
||||
m_currentCom?.OnLeft();
|
||||
}
|
||||
|
||||
public override void OnRight()
|
||||
{
|
||||
m_currentCom?.OnRight();
|
||||
}
|
||||
}
|
||||
|
||||
public interface IValueEditControl
|
||||
{
|
||||
void SetData(ValueSetMenu valueMenu);
|
||||
GameObject gameObject { get; }
|
||||
void OnLeft();
|
||||
void OnRight();
|
||||
void OnExecute();
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: deae682aaf23cab458cba1b12cd3a1f7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class OptionUI_ValueEditItem_EnumEdit : MonoBehaviour, IValueEditControl
|
||||
{
|
||||
[SerializeField]
|
||||
Text txt_value;
|
||||
|
||||
private ValueSetMenu m_valueMenu;
|
||||
private List<Enum> m_enumValues = new List<Enum>();
|
||||
private int m_valueIndex;
|
||||
|
||||
public void SetData(ValueSetMenu valueMenu)
|
||||
{
|
||||
m_valueMenu = valueMenu;
|
||||
txt_value.text = valueMenu.ValueRaw.ToString();
|
||||
|
||||
foreach (Enum enumValue in Enum.GetValues(valueMenu.ValueType))
|
||||
{
|
||||
m_enumValues.Add(enumValue);
|
||||
}
|
||||
m_valueIndex = m_enumValues.IndexOf((Enum)valueMenu.ValueRaw);
|
||||
}
|
||||
|
||||
public void OnLeft()
|
||||
{
|
||||
m_valueIndex--;
|
||||
|
||||
if (m_valueIndex < 0) m_valueIndex = m_enumValues.Count - 1;
|
||||
|
||||
var value = m_enumValues[m_valueIndex];
|
||||
txt_value.text = value.ToString();
|
||||
m_valueMenu.OnValueChanged(value);
|
||||
}
|
||||
|
||||
public void OnRight()
|
||||
{
|
||||
m_valueIndex++;
|
||||
|
||||
if (m_valueIndex >= m_enumValues.Count) m_valueIndex = 0;
|
||||
|
||||
var value = m_enumValues[m_valueIndex];
|
||||
txt_value.text = value.ToString();
|
||||
m_valueMenu.OnValueChanged(value);
|
||||
}
|
||||
|
||||
public void OnExecute()
|
||||
{
|
||||
OnRight();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ef1018f09e7c5b049b75128ee308d372
|
@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class OptionUI_ValueEditItem_FloatEdit : MonoBehaviour, IValueEditControl
|
||||
{
|
||||
[SerializeField]
|
||||
Slider slider;
|
||||
[SerializeField]
|
||||
Text txt_value;
|
||||
|
||||
float m_step;
|
||||
private ValueSetMenu m_valueMenu;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
slider.onValueChanged.AddListener(OnSliderValueChanged);
|
||||
}
|
||||
|
||||
private void OnSliderValueChanged(float value)
|
||||
{
|
||||
txt_value.text = $"{value:.00}";
|
||||
m_valueMenu.OnValueChanged(value);
|
||||
}
|
||||
|
||||
public void SetData(ValueSetMenu valueMenu)
|
||||
{
|
||||
m_valueMenu = valueMenu;
|
||||
slider.minValue = (float)valueMenu.Min;
|
||||
slider.maxValue = (float)valueMenu.Max;
|
||||
slider.value = (float)valueMenu.ValueRaw;
|
||||
m_step = (slider.maxValue - slider.minValue) * 0.05f;
|
||||
}
|
||||
|
||||
public void OnLeft()
|
||||
{
|
||||
var newValue = Mathf.Clamp(slider.value - m_step, slider.minValue, slider.maxValue);
|
||||
slider.value = newValue;
|
||||
}
|
||||
|
||||
public void OnRight()
|
||||
{
|
||||
var newValue = Mathf.Clamp(slider.value + m_step, slider.minValue, slider.maxValue);
|
||||
slider.value = newValue;
|
||||
}
|
||||
|
||||
public void OnExecute()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8c9e9868e38e8ea44a0dad03b987cd73
|
Loading…
Reference in New Issue
Block a user