You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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支持:

  1. 给原有InputFeatureUsage<bool>字段添加[SerializeField]属性
  2. 在项目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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 08:06:08