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

Unity动态添加预制体回调:Oculus Quest XR输入系统InputField交互疑问

问题分析与解决方案

为什么预制体的回调引用会丢失?

你之前的方法出错的核心原因是:Unity预制体无法保存对场景对象的引用。当你在场景中给预制体实例绑定On Select/On DeSelect回调时,若回调方法所在的脚本挂在场景中的某个GameObject上,更新预制体时这些跨场景的引用会被自动清除——因为预制体是独立于场景的资源,只能引用自身内部的对象或其他预制体。

实例化后通过代码添加回调的方案完全可行

这是动态生成UI元素时处理事件绑定的标准做法,不仅能解决引用丢失问题,还能让逻辑更灵活。下面是具体实现步骤:


1. 编写回调处理脚本

先创建一个专门处理输入框选中/取消选中逻辑的脚本(比如命名为VRInputFieldHandler),放在场景中的全局对象上(比如Canvas根对象):

using UnityEngine;
using TMPro;

public class VRInputFieldHandler : MonoBehaviour
{
    // 输入框被选中时的逻辑
    public void OnInputSelected(TMP_InputField inputField)
    {
        // 激活输入框,允许输入
        inputField.ActivateInputField();
        // 可添加VR专属逻辑:比如锁定控制器射线聚焦、绑定输入按键等
    }

    // 输入框被取消选中时的逻辑
    public void OnInputDeselected(TMP_InputField inputField)
    {
        // 关闭输入框的输入状态
        inputField.DeactivateInputField();
        // 可添加VR专属逻辑:比如恢复射线自由交互
    }
}

2. 动态实例化并绑定回调

在负责生成表格行的脚本中,实例化预制体后,通过代码获取TMP_InputField组件并绑定回调:

using UnityEngine;
using TMPro;

public class TableGenerator : MonoBehaviour
{
    [SerializeField] private GameObject inputRowPrefab; // 你的输入行预制体
    [SerializeField] private Transform tableContent; // 表格的Content容器(用来承载生成的行)
    [SerializeField] private VRInputFieldHandler inputHandler; // 场景中的回调处理脚本实例

    // 调用此方法生成新行,传入初始文本
    public void AddNewTableRow(string initialText)
    {
        // 实例化预制体到Content容器下
        GameObject newRow = Instantiate(inputRowPrefab, tableContent);
        
        // 获取行内的TMP输入框组件
        TMP_InputField inputField = newRow.GetComponentInChildren<TMP_InputField>();
        if (inputField == null || inputHandler == null) return;

        // 先清除原有监听(避免重复绑定)
        inputField.onSelect.RemoveAllListeners();
        inputField.onDeselect.RemoveAllListeners();

        // 绑定自定义回调
        inputField.onSelect.AddListener(inputHandler.OnInputSelected);
        inputField.onDeselect.AddListener(inputHandler.OnInputDeselected);

        // 设置初始文本
        inputField.text = initialText;
    }
}

3. VR交互补充说明

因为是Oculus Quest环境,需要确保:

  • 你的UI射线交互(比如OVR Pointer)能正确触发UI的OnSelect/OnDeselect事件;
  • 若需要用控制器输入文本,可在OnInputSelected中绑定XR输入动作到输入框的文本输入逻辑,或者调用Oculus的系统虚拟键盘。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:15:55