166 lines
6.1 KiB
C#
166 lines
6.1 KiB
C#
|
#if UNITY_EDITOR
|
||
|
using System;
|
||
|
using System.Linq;
|
||
|
using UnityEditor;
|
||
|
|
||
|
namespace UnityEngine.InputSystem.Editor
|
||
|
{
|
||
|
internal static class EditorPlayerSettingHelpers
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Whether the backends for the new input system are enabled in the
|
||
|
/// player settings for the Unity runtime.
|
||
|
/// </summary>
|
||
|
public static bool newSystemBackendsEnabled
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
#if UNITY_2020_2_OR_NEWER
|
||
|
var property = GetPropertyOrNull(kActiveInputHandler);
|
||
|
return property == null || ActiveInputHandlerToTuple(property.intValue).newSystemEnabled;
|
||
|
#else
|
||
|
var property = GetPropertyOrNull(kEnableNewSystemProperty);
|
||
|
return property == null || property.boolValue;
|
||
|
#endif
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
#if UNITY_2020_2_OR_NEWER
|
||
|
var property = GetPropertyOrNull(kActiveInputHandler);
|
||
|
if (property != null)
|
||
|
{
|
||
|
var tuple = ActiveInputHandlerToTuple(property.intValue);
|
||
|
tuple.newSystemEnabled = value;
|
||
|
property.intValue = TupleToActiveInputHandler(tuple);
|
||
|
property.serializedObject.ApplyModifiedProperties();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Debug.LogError($"Cannot find '{kActiveInputHandler}' in player settings");
|
||
|
}
|
||
|
#else
|
||
|
var property = GetPropertyOrNull(kEnableNewSystemProperty);
|
||
|
if (property != null)
|
||
|
{
|
||
|
property.boolValue = value;
|
||
|
property.serializedObject.ApplyModifiedProperties();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Debug.LogError($"Cannot find '{kEnableNewSystemProperty}' in player settings");
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// Whether the backends for the old input system are enabled in the
|
||
|
/// player settings for the Unity runtime.
|
||
|
/// </summary>
|
||
|
public static bool oldSystemBackendsEnabled
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
#if UNITY_2020_2_OR_NEWER
|
||
|
var property = GetPropertyOrNull(kActiveInputHandler);
|
||
|
return property == null || ActiveInputHandlerToTuple(property.intValue).oldSystemEnabled;
|
||
|
#else
|
||
|
var property = GetPropertyOrNull(kDisableOldSystemProperty);
|
||
|
return property == null || !property.boolValue;
|
||
|
#endif
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
#if UNITY_2020_2_OR_NEWER
|
||
|
var property = GetPropertyOrNull(kActiveInputHandler);
|
||
|
if (property != null)
|
||
|
{
|
||
|
var tuple = ActiveInputHandlerToTuple(property.intValue);
|
||
|
tuple.oldSystemEnabled = value;
|
||
|
property.intValue = TupleToActiveInputHandler(tuple);
|
||
|
property.serializedObject.ApplyModifiedProperties();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Debug.LogError($"Cannot find '{kActiveInputHandler}' in player settings");
|
||
|
}
|
||
|
#else
|
||
|
var property = GetPropertyOrNull(kDisableOldSystemProperty);
|
||
|
if (property != null)
|
||
|
{
|
||
|
property.boolValue = !value;
|
||
|
property.serializedObject.ApplyModifiedProperties();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Debug.LogError($"Cannot find '{kDisableOldSystemProperty}' in player settings");
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
#if UNITY_2020_2_OR_NEWER
|
||
|
private const string kActiveInputHandler = "activeInputHandler";
|
||
|
|
||
|
private enum InputHandler
|
||
|
{
|
||
|
OldInputManager = 0,
|
||
|
NewInputSystem = 1,
|
||
|
InputBoth = 2
|
||
|
};
|
||
|
|
||
|
private static (bool newSystemEnabled, bool oldSystemEnabled) ActiveInputHandlerToTuple(int value)
|
||
|
{
|
||
|
switch ((InputHandler)value)
|
||
|
{
|
||
|
case InputHandler.OldInputManager:
|
||
|
return (false, true);
|
||
|
case InputHandler.NewInputSystem:
|
||
|
return (true, false);
|
||
|
case InputHandler.InputBoth:
|
||
|
return (true, true);
|
||
|
default:
|
||
|
throw new ArgumentException($"Invalid value of 'activeInputHandler' setting: {value}");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static int TupleToActiveInputHandler((bool newSystemEnabled, bool oldSystemEnabled) tuple)
|
||
|
{
|
||
|
switch (tuple)
|
||
|
{
|
||
|
case (false, true):
|
||
|
return (int)InputHandler.OldInputManager;
|
||
|
case (true, false):
|
||
|
return (int)InputHandler.NewInputSystem;
|
||
|
case (true, true):
|
||
|
return (int)InputHandler.InputBoth;
|
||
|
// Special case, when using two separate bool's of the public API here,
|
||
|
// it's possible to end up with both settings in false, for example:
|
||
|
// - EditorPlayerSettingHelpers.newSystemBackendsEnabled = true;
|
||
|
// - EditorPlayerSettingHelpers.oldSystemBackendsEnabled = false;
|
||
|
// - EditorPlayerSettingHelpers.newSystemBackendsEnabled = false;
|
||
|
// - EditorPlayerSettingHelpers.oldSystemBackendsEnabled = true;
|
||
|
// On line 3 both settings will be false, even if we set old system to true on line 4.
|
||
|
case (false, false):
|
||
|
return (int)InputHandler.OldInputManager;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#else
|
||
|
private const string kEnableNewSystemProperty = "enableNativePlatformBackendsForNewInputSystem";
|
||
|
private const string kDisableOldSystemProperty = "disableOldInputManagerSupport";
|
||
|
#endif
|
||
|
|
||
|
private static SerializedProperty GetPropertyOrNull(string name)
|
||
|
{
|
||
|
var playerSettings = Resources.FindObjectsOfTypeAll<PlayerSettings>().FirstOrDefault();
|
||
|
if (playerSettings == null)
|
||
|
return null;
|
||
|
var playerSettingsObject = new SerializedObject(playerSettings);
|
||
|
return playerSettingsObject.FindProperty(name);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif // UNITY_EDITOR
|