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

Unity中TMP InputField结束编辑时下拉菜单不显示指定方法

问题原因

TMP_InputField的On End Edit事件是带string参数的回调(会自动把输入框的文本作为参数传递),而你写的SetSpeakerCustomName()是无参方法——Unity的Inspector事件列表只会显示参数匹配的方法,所以你的方法不会出现在下拉选项里。

解决方案

有两种简单的修改方式:

方式1:调整方法参数,匹配事件要求

把SetSpeakerCustomName改成带string参数的形式,直接用事件传递的文本(也可以保留读取输入框的逻辑,看你需求):

using UnityEngine;
using TMPro;

public class SpeakerNameInputHandler : MonoBehaviour
{
    public Speaker speaker;
    public TMP_Text speakerNameTextMeshPro;

    // 修改为带string参数的方法,匹配On End Edit的回调签名
    public void SetSpeakerCustomName(string newName)
    {
        speaker.SetCustomName(newName);

        if (speakerNameTextMeshPro != null)
        {
            speakerNameTextMeshPro.text = newName;
        }
    }
}

改完之后,回到Inspector的On End Edit下拉菜单,就能找到这个方法了,选中后会自动把输入框的文本作为参数传进去。

方式2:通过代码绑定事件(适合不想改方法签名的情况)

在脚本里手动把输入框的事件和你的方法绑定,不用依赖Inspector的下拉:

using UnityEngine;
using TMPro;

public class SpeakerNameInputHandler : MonoBehaviour
{
    public Speaker speaker;
    public TMP_InputField nameInputField;
    public TMP_Text speakerNameTextMeshPro;

    private void Awake()
    {
        // 绑定输入框的结束编辑事件,触发自定义方法
        nameInputField.onEndEdit.AddListener(_ => SetSpeakerCustomName());
    }

    public void SetSpeakerCustomName()
    {
        string newName = nameInputField.text;
        speaker.SetCustomName(newName);

        if (speakerNameTextMeshPro != null)
        {
            speakerNameTextMeshPro.text = newName;
        }
    }
}

这种方式下,你不需要在Inspector里设置On End Edit事件,运行时会自动绑定。

额外提醒
  • 一定要确保Speaker对象已经正确拖到SpeakerNameInputHandler的Inspector字段里,不然运行时会报空引用错误。
  • 注意:ScriptableObject在Play模式下修改的内容,退出Play模式后会自动还原。如果需要永久保存玩家设置的自定义名称,得额外做数据持久化(比如用PlayerPrefs存到本地,或者写JSON文件)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:17:50