Unity游戏输入验证问题:需实现输入单词包含两个随机字母
解决Unity字母匹配游戏的输入判断问题
首先,咱们来拆解下当前代码的核心问题:
- 原判断逻辑错误:用
textbox.text(两个连续字符)的Contains方法,其实是检查输入里是否有连续的这两个字符,但需求是输入单词同时包含两个单独的随机字母(不管顺序和位置)。 - Update里的分支完全无效:不管输入是否符合要求,都会调用
wordIsInFile,导致错误输入也会触发后续逻辑。 wordIsInFile方法逻辑混乱:遍历所有单词时,只要碰到不匹配的就清空输入,找到匹配的才更新字母,不仅效率低,还会出现不必要的重复操作。
下面是修改后的完整代码,我会在关键部分做注释:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class LetterRandomiser : MonoBehaviour { public char[] characters; public Text textbox; public InputField mainInputField; // 保存当前需要匹配的两个目标字母(类成员变量,方便全局访问) private char _targetChar1; private char _targetChar2; // 用HashSet存储有效单词,大幅提升查找效率(比数组遍历快得多) private HashSet<string> _validWords; void Start() { // 生成初始的随机字母对 GenerateNewTargetChars(); // 读取有效单词文件并转成HashSet string[] lines = System.IO.File.ReadAllLines(@"C:\Users\lluc\Downloads\corncob_lowercase.txt"); _validWords = new HashSet<string>(lines); } // 抽出生成新字母对的方法,代码更整洁易维护 private void GenerateNewTargetChars() { _targetChar1 = characters[Random.Range(0, characters.Length)]; _targetChar2 = characters[Random.Range(0, characters.Length)]; textbox.text = $"{_targetChar1}{_targetChar2}"; } void Update() { if (Input.GetKeyDown(KeyCode.Return)) { string inputWord = mainInputField.text.Trim().ToLower(); // 空输入直接返回 if (string.IsNullOrEmpty(inputWord)) { mainInputField.text = ""; return; } // 核心判断:必须同时包含两个目标字母 bool hasBothChars = inputWord.Contains(_targetChar1.ToString()) && inputWord.Contains(_targetChar2.ToString()); if (!hasBothChars) { // 不满足条件,清空输入并提示(可以改成UI提示更友好) mainInputField.text = ""; Debug.Log("输入的单词必须同时包含显示的两个字母哦!"); return; } // 检查输入的单词是否在有效列表中 if (_validWords.Contains(inputWord)) { // 验证通过,生成新的字母对并清空输入 GenerateNewTargetChars(); mainInputField.text = ""; Debug.Log("答对啦!生成新的字母~"); } else { // 无效单词,清空输入 mainInputField.text = ""; Debug.Log("这个单词不在有效列表里,请重新输入!"); } } } }
关键改动说明:
- 新增类成员变量:
_targetChar1和_targetChar2专门存储当前需要匹配的两个字母,避免每次从textbox文本中拆分,更可靠。 - 使用HashSet存储有效单词:原代码遍历整个数组查找单词,效率极低(尤其是单词量很大时),HashSet的
Contains方法是O(1)时间复杂度,性能提升明显。 - 修正输入判断逻辑:先检查输入是否同时包含两个目标字母,不满足直接拦截;满足后再验证单词有效性,逻辑清晰符合需求。
- 代码模块化:把生成新字母对的逻辑抽成独立方法,后续维护或扩展更方便。
- 输入规范化:对输入单词做
Trim()(去除前后空格)和ToLower()(统一转小写),避免因空格或大小写导致的误判。
这样修改后,就只有当玩家输入的单词同时包含两个随机字母,并且是有效单词时,才会生成新的字母对,完美解决你遇到的问题~
内容的提问来源于stack exchange,提问作者greatvortex
相关产品推荐
相关产品推荐

