using System; using UnityEngine.InputSystem.Utilities; using UnityEngine.Scripting; ////REVIEW: should this *not* be inherited? inheritance can lead to surprises namespace UnityEngine.InputSystem.Layouts { /// /// Attribute to control layout settings of a type used to generate an . /// [AttributeUsage(AttributeTargets.Class, Inherited = false)] public sealed class InputControlLayoutAttribute : Attribute { /// /// Associates a state representation with an input device and drives /// the control layout generated for the device from its state rather /// than from the device class. /// /// This is *only* useful if you have a state struct dictating a specific /// state layout and you want the device layout to automatically take offsets from /// the fields annotated with . /// /// /// /// public struct MyStateStruct : IInputStateTypeInfo /// { /// public FourCC format => new FourCC('M', 'Y', 'D', 'V'); /// /// [InputControl(name = "button1", layout = "Button", bit = 0)] /// [InputControl(name = "button2", layout = "Button", bit = 0)] /// public int buttons; /// } /// /// [InputControlLayout(stateType = typeof(MyStateStruct)] /// public class MyDevice : InputDevice /// { /// } /// /// /// /// /// public Type stateType { get; set; } /// /// identifier for the memory format associated with the layout. /// /// public string stateFormat { get; set; } ////TODO: rename this to just "usages"; "commonUsages" is such a weird name [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1819:PropertiesShouldNotReturnArrays", Justification = "According to MSDN, this message can be ignored for attribute parameters, as there are no better alternatives.")] public string[] commonUsages { get; set; } public string variants { get; set; } /// /// Allows marking a device as noisy regardless of control layout. /// /// /// Controls can be individually marked as noisy using the /// attribute, but this property can be used to mark a device as noisy even when no control has been /// marked as such. This can be useful when a device state layout has only been partially implemented /// i.e. some data in the state memory has not been mapped to a control, and the unimplemented controls /// are noisy. Without doing this, the device will constantly be made current as the system has no way /// to know that the event data contains only noise. /// public bool isNoisy { get; set; } internal bool? canRunInBackgroundInternal; public bool canRunInBackground { get => canRunInBackgroundInternal.Value; set => canRunInBackgroundInternal = value; } internal bool? updateBeforeRenderInternal; /// /// Whether the device should receive events in updates. /// /// public bool updateBeforeRender { get => updateBeforeRenderInternal.Value; set => updateBeforeRenderInternal = value; } /// /// If true, the layout describes a generic class of devices such as "gamepads" or "mice". /// /// /// This property also determines how the layout is presented in the UI. All the device layouts /// that are marked as generic kinds of devices are displayed with their own entry at the root level of /// the control picker (), for example. /// public bool isGenericTypeOfDevice { get; set; } /// /// Gives a name to display in the UI. By default, the name is the same as the class the attribute /// is applied to. /// public string displayName { get; set; } public string description { get; set; } /// /// If true, don't include the layout when presenting picking options in the UI. /// /// /// This will keep device layouts out of the control picker and will keep control layouts out of /// action type dropdowns. /// public bool hideInUI { get; set; } } }