using System;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Processors;
using UnityEngine.UI;
namespace UnityEngine.InputSystem.Samples.RebindUI
{
public class RebindActionParameterUI : MonoBehaviour
{
///
/// Reference to the action that is to be rebound (Required).
///
public InputActionReference actionReference
{
get => m_Action;
set => m_Action = value;
}
///
/// ID (in string form) of the binding that is to be rebound on the action.
///
/// If this is not set (null or empty), corresponds to an action processor
/// parameter, otherwise it corresponds to a binding parameter.
///
public string bindingId
{
get => m_BindingId;
set => m_BindingId = value;
}
///
/// The preference key to be used for persistence.
///
public string preferenceKey
{
get => m_PreferenceKey;
set => m_PreferenceKey = value;
}
///
/// The associated slider UI component instance.
///
public Slider slider
{
get => m_Slider;
set
{
if (m_Slider != null)
m_Slider.onValueChanged.RemoveListener(SetParameterValue);
m_Slider = value;
if (value != null)
value.onValueChanged.AddListener(SetParameterValue);
}
}
///
/// The default value to apply when reset or no preference exist.
///
public float defaultValue
{
get => m_DefaultValue;
set => m_DefaultValue = value;
}
[Tooltip("Reference to action that holds the parameter to be configurable via this behaviour.")]
[SerializeField]
private InputActionReference m_Action;
[Tooltip("Optional binding ID of the binding processor parameter to override.")]
[SerializeField]
private string m_BindingId;
[Tooltip("The player preference key to be used for persistence.")]
[SerializeField]
private string m_PreferenceKey;
[Tooltip("The default value to be be used when no preference exists or when resetting")]
[SerializeField]
private float m_DefaultValue;
[Tooltip("The associated slider UI component used to change the value.")]
[SerializeField]
private Slider m_Slider;
[SerializeField]
private string[] m_ParameterOverrides;
private float m_Value;
public void ResetToDefault()
{
PlayerPrefs.SetFloat(m_PreferenceKey, m_DefaultValue);
SetParameterValue(m_DefaultValue);
}
private void Awake()
{
if (m_Slider == null)
m_Slider = GetComponent();
}
private void OnEnable()
{
if (!string.IsNullOrEmpty(m_PreferenceKey))
SetParameterValue(PlayerPrefs.GetFloat(m_PreferenceKey, m_DefaultValue));
if (m_Slider != null)
m_Slider.onValueChanged.AddListener(SetParameterValue);
}
private void OnDisable()
{
if (m_Slider != null)
m_Slider.onValueChanged.RemoveListener(SetParameterValue);
if (!string.IsNullOrEmpty(m_PreferenceKey))
PlayerPrefs.SetFloat(m_PreferenceKey, m_Value);
}
private void SetParameterValue(float value)
{
// Apply parameter value as a parametric override
if (m_Action != null && m_Action.action != null)
{
var action = m_Action.action;
int bindingIndex = action.FindBindingById(m_BindingId);
var bindingMask = bindingIndex >= 0 ? action.bindings[bindingIndex] : default;
// We apply parameter override. This directly affects matching processors and interactions
// if they have matching parameters.
foreach (var parameterOverride in m_ParameterOverrides)
action.ApplyParameterOverride(parameterOverride, value, bindingMask);
}
m_Value = value;
UpdateDisplayValue(value);
}
private void UpdateDisplayValue(float value)
{
if (m_Slider != null)
m_Slider.value = Mathf.Clamp(value, m_Slider.minValue, m_Slider.maxValue);
}
}
}