smart-interactive-display/Assets/Plugins/IngameDebugConsole/Scripts/InputFieldWarningsFixer.cs

29 lines
1.3 KiB
C#

using System.Reflection;
using UnityEngine;
using UnityEngine.UI;
namespace IngameDebugConsole
{
// Fixes: https://github.com/yasirkula/UnityIngameDebugConsole/issues/77
// This was caused by Canvas.ForceUpdateCanvases in InputField.UpdateLabel (added in 2022.1 to resolve another bug: https://issuetracker.unity3d.com/issues/input-fields-width-doesnt-change-after-entering-specific-combinations-of-text-when-the-content-size-fitter-is-used)
// which is triggered from InputField.OnValidate. UpdateLabel isn't invoked if a variable called m_PreventFontCallback is true,
// which is what this component is doing: temporarily switching that variable before InputField.OnValidate to avoid this issue.
#if UNITY_2022_1_OR_NEWER && UNITY_EDITOR
[DefaultExecutionOrder( -50 )]
#endif
public class InputFieldWarningsFixer : MonoBehaviour
{
#if UNITY_2022_1_OR_NEWER && UNITY_EDITOR
private static readonly FieldInfo preventFontCallback = typeof( InputField ).GetField( "m_PreventFontCallback", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
protected void OnValidate()
{
if( preventFontCallback != null && TryGetComponent( out InputField inputField ) )
{
preventFontCallback.SetValue( inputField, true );
UnityEditor.EditorApplication.delayCall += () => preventFontCallback.SetValue( inputField, false );
}
}
#endif
}
}