
目录
前言
从零开始,用 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,声明重置和提交按钮。重置按钮包含清空字母格子和字母状态的逻辑,提交按钮包含提交填满的字母格子判断正确错误的逻辑。当字母格子被填满时,提交按钮才可以点击,未填满时提交按钮不可点击。
cs
[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;
}
结果展示
