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
相关产品推荐
相关产品推荐

