Unity3D XR开发中InputFeatureUsage字段未在Inspector面板显示问题
问题原因
InputFeatureUsage<T> 属于泛型类型,Unity默认序列化系统不支持该类型的自动序列化,也没有提供对应的Inspector面板绘制逻辑,因此即使添加[SerializeField]属性也无法在面板中正常显示。
解决方法
方案1:自定义可序列化包装类(最快实现)
编写一个非泛型的可序列化类封装InputFeatureUsage<bool>,Unity支持对标记了[Serializable]的自定义类做序列化展示:
using System; using UnityEngine.XR; [Serializable] public class BoolInputFeature { public string featureName; public InputFeatureUsage<bool> Usage => new InputFeatureUsage<bool>(featureName); // 支持直接赋值CommonUsages中的预设按钮 public static implicit operator BoolInputFeature(InputFeatureUsage<bool> inputUsage) { return new BoolInputFeature { featureName = inputUsage.name }; } }
替换原有字段定义即可:
[Header("Activation Controller")] public XRNode controller = XRNode.RightHand; public BoolInputFeature activationButton = CommonUsages.primaryButton;
功能调用时取activationButton.Usage即可获得对应的InputFeatureUsage<bool>对象。
方案2:枚举映射常用按钮(新手友好)
如果仅使用固定范围的控制器按钮,可以直接定义枚举做映射,Inspector中直接选择枚举值即可:
// 自定义按钮枚举,可按需扩展 public enum ControllerButton { PrimaryButton, SecondaryButton, GripButton, TriggerButton, PrimaryTouch, SecondaryTouch } // 替换原有的InputFeatureUsage字段 public ControllerButton activationButton; // 运行时根据枚举值获取对应InputFeatureUsage private InputFeatureUsage<bool> GetButtonUsage(ControllerButton button) { return button switch { ControllerButton.PrimaryButton => CommonUsages.primaryButton, ControllerButton.SecondaryButton => CommonUsages.secondaryButton, ControllerButton.GripButton => CommonUsages.gripButton, ControllerButton.TriggerButton => CommonUsages.triggerButton, ControllerButton.PrimaryTouch => CommonUsages.primaryTouch, ControllerButton.SecondaryTouch => CommonUsages.secondaryTouch, _ => default }; }
方案3:自定义PropertyDrawer(全局生效)
如果项目中大量使用InputFeatureUsage<bool>类型,可以编写属性绘制器实现全局Inspector支持:
- 给原有
InputFeatureUsage<bool>字段添加[SerializeField]属性 - 在项目
Editor文件夹下新建绘制器脚本:
using UnityEditor; using UnityEngine; using UnityEngine.XR; [CustomPropertyDrawer(typeof(InputFeatureUsage<bool>))] public class BoolInputFeatureDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(position, label, property); var nameProp = property.FindPropertyRelative("m_Name"); nameProp.stringValue = EditorGUI.TextField(position, label, nameProp.stringValue); EditorGUI.EndProperty(); } }
配置完成后所有InputFeatureUsage<bool>类型的字段都会在Inspector显示输入框,填入对应功能名称即可正常使用。
内容的提问来源于stack exchange,提问作者Claus
相关产品推荐
相关产品推荐

