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

Unity中获取激活状态的TMP_InputField问题:isFocused属性无效,需对比输入内容与Placeholder文本

Unity中获取激活状态的TMP_InputField问题:isFocused属性无效,需对比输入内容与Placeholder文本

嘿,看起来你在处理动态生成的TMP_InputField时遇到了焦点检测的问题,核心需求还要对比用户输入内容和占位符文本对吧?我来给你几个实用的解决方案:

一、为什么isFocused可能失效?

你提到已经把动态创建的InputField加入了列表,但拿不到isFocused的正确状态,大概率是因为检测时机不对(比如在Start里一次性检测,而不是实时跟踪),或者动态生成的组件没有正确初始化焦点相关的事件回调。

二、解决方案1:通过EventSystem实时获取激活的输入框

Unity的EventSystem可以直接拿到当前被选中的UI对象,不管是动态生成还是静态创建的,都能精准捕获。你可以在Update里实时检测:

using UnityEngine.EventSystems; // 别忘了加这个命名空间

private void Update()
{
    // 获取当前选中的UI对象
    var selectedObj = EventSystem.current.currentSelectedGameObject;
    if (selectedObj == null) return;

    // 尝试获取TMP_InputField组件,并确认在你的列表中
    var activeInput = selectedObj.GetComponent<TMP_InputField>();
    if (activeInput != null && inputFieldsList.Contains(activeInput))
    {
        // 拿到激活的输入框后,执行对比逻辑
        CompareInputWithPlaceholder(activeInput);
    }
}

// 对比输入内容和占位符文本的方法
private void CompareInputWithPlaceholder(TMP_InputField inputField)
{
    // 获取用户输入的文本
    string userInput = inputField.text.Trim();
    // 获取占位符的文本(注意Placeholder要挂TMP_Text组件)
    var placeholderTextComp = inputField.placeholder.GetComponent<TMP_Text>();
    if (placeholderTextComp == null)
    {
        Debug.LogWarning("输入框的Placeholder没有绑定TMP_Text组件!");
        return;
    }
    string placeholderText = placeholderTextComp.text.Trim();

    // 执行对比逻辑
    if (userInput.Equals(placeholderText))
    {
        Debug.Log("输入内容和占位符完全一致!");
    }
    else
    {
        Debug.Log($"输入内容:{userInput},占位符内容:{placeholderText},两者不一致");
    }
}

三、解决方案2:绑定输入框的选中/取消选中事件

如果你不想每帧检测,可以给每个动态生成的InputField绑定OnSelect和OnDeselect事件,精准跟踪焦点变化:

// 假设你是这样动态创建InputField的
private void CreateInputField()
{
    TMP_InputField newInput = Instantiate(_inputField, letterUIPanel.transform);
    inputFieldsList.Add(newInput);

    // 绑定选中事件:当输入框获得焦点时触发
    newInput.onSelect.AddListener((_) => OnInputFieldSelected(newInput));
    // 绑定取消选中事件:当输入框失去焦点时触发
    newInput.onDeselect.AddListener((_) => OnInputFieldDeselected(newInput));
}

// 维护一个当前激活的输入框变量
private TMP_InputField _currentActiveInput;

private void OnInputFieldSelected(TMP_InputField input)
{
    _currentActiveInput = input;
    Debug.Log($"输入框[{input.name}]获得焦点");
    // 也可以在这里立刻触发对比,或者等用户输入完成后处理
}

private void OnInputFieldDeselected(TMP_InputField input)
{
    if (_currentActiveInput == input)
    {
        _currentActiveInput = null;
        Debug.Log($"输入框[{input.name}]失去焦点,开始对比内容");
        // 失去焦点时执行对比逻辑
        CompareInputWithPlaceholder(input);
    }
}

几个注意事项

  • 确保动态生成的InputField的Placeholder组件已经绑定了TMP_Text,否则获取占位符文本会报错;
  • 如果是克隆预制体创建InputField,一定要检查预制体里的Placeholder配置是否正确;
  • 使用EventSystem方案时,要注意排除其他UI元素(比如按钮)的干扰,确保只处理你列表中的输入框。

备注:内容来源于stack exchange,提问作者Grimuar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:34:29