从0到1做一个“字母拼词”Unity小游戏(含源码/GIF)- 字母拼词正确错误判断

目录
前言
创建正确错误判断UI结构
正确错误判断逻辑实现
结果展示
前言
从零开始,用 Unity 打造一个“字母拼词”小游戏!本系列将带你一步步完成从界面布局、逻辑实现到动画优化与发布的全过程。无需复杂算法,新手也能轻松上手,最终做出一款可玩又有趣的文字益智游戏。
创建正确错误判断UI结构
在Canvas下面新建一个名为ResultUI的游戏物体,在其下新建一个Image名为ResultImage,新建一个按钮容器Buttons并添加Horizontal Layout Group组件,在Buttons容器下新建两个按钮,一个是ResetButton重置按钮,另一个是ConfirmButton提交按钮。

ResultImage设置锚点为UI界面的顶部,并设置好对应的距离。

设置Buttons容器上Horizontal Layout Group组件的参数,以UI界面的底部为锚点,设置为居中排列,间隔为100,并使用子物体的宽高。

设置ResetButton和ConfirmButton的宽高为350*120。

正确错误判断逻辑实现
声明正确及错误的图片资源,并声明要显示结果的Image,声明重置和提交按钮。重置按钮包含清空字母格子和字母状态的逻辑,提交按钮包含提交填满的字母格子判断正确错误的逻辑。当字母格子被填满时,提交按钮才可以点击,未填满时提交按钮不可点击。
[Header("Result")][SerializeField] private Sprite _correctSprite; //正确的图片资源[SerializeField] private Sprite _wrongSprite; //错误的图片资源[SerializeField] private Image _resultImage; //显示结果的图片[SerializeField] private Button _resetButton; //重置按钮[SerializeField] private Button _confirmButton; //提交按钮private readonly Random _lettersRandom = new();private readonly List<WordLetterSlot> _wordLetterSlots = new();private readonly List<WordLetter> _wordLetters = new();private void OnEnable(){_resetButton.onClick.AddListener(HandleOnResetButtonClicked);_confirmButton.onClick.AddListener(HandleOnConfirmButtonClicked);}private void OnDisable(){_resetButton.onClick.RemoveListener(HandleOnResetButtonClicked);_confirmButton.onClick.RemoveListener(HandleOnConfirmButtonClicked);}//重置按钮,清空字母和字母格子,以及结果图片,禁用提交按钮private void HandleOnResetButtonClicked(){foreach (var wordLetter in _wordLetters){wordLetter.Reset();}foreach (var wordLetterSlot in _wordLetterSlots){wordLetterSlot.Reset();}_resultImage.gameObject.SetActive(false);_confirmButton.interactable = false;}//点击提交按钮进行正确错误校验private void HandleOnConfirmButtonClicked(){var isCorrect = false;foreach (var wordLetterSlot in _wordLetterSlots){isCorrect = wordLetterSlot.CheckIsCorrect();}_resultImage.gameObject.SetActive(true);_resultImage.sprite = isCorrect ? _correctSprite : _wrongSprite;}private void Start(){//隐藏结果图片,禁用提交按钮_resultImage.gameObject.SetActive(false);_confirmButton.interactable = false;string testWord = "HELLO";var lettersArray = testWord.ToCharArray();var randomLettersArray = ShuffleLetters(lettersArray);foreach (var testLetter in testWord){var wordLetterSlot = Instantiate(_wordLetterSlotPrefab, _wordLettersSlotsSpawnPoint);wordLetterSlot.Initialize(testLetter.ToString());wordLetterSlot.OnLetterClicked += HandleOnLetterSlotClicked;_wordLetterSlots.Add(wordLetterSlot);}foreach (var randomLetter in randomLettersArray){var wordLetter = Instantiate(_wordLetterPrefab, _wordLettersSpawnPoint);wordLetter.Initialize(randomLetter.ToString());wordLetter.OnLetterClicked += HandleOnLetterClicked;_wordLetters.Add(wordLetter);}}private void HandleOnLetterSlotClicked(string letter){foreach (var wordLetter in _wordLetters){if (wordLetter.IsSelected && letter == wordLetter.CurrentLetter){wordLetter.Reset();break;}}}//当所有字母格子都填满了提交按钮可以交互private void HandleOnLetterClicked(string letter){var fillAllLetters = false;for (int i = 0; i < _wordLetterSlots.Count; i++){if (!_wordLetterSlots[i].HasLetter){_wordLetterSlots[i].SetLetter(letter);fillAllLetters = i == _wordLetterSlots.Count - 1;break;}}_confirmButton.interactable = fillAllLetters;}private char[] ShuffleLetters(char[] letters){char[] result = (char[])letters.Clone();int n = result.Length;while (n > 1){n--;int k = _lettersRandom.Next(n + 1);(result[k], result[n]) = (result[n], result[k]);}return result;}
结果展示

