从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,声明重置和提交按钮。重置按钮包含清空字母格子和字母状态的逻辑,提交按钮包含提交填满的字母格子判断正确错误的逻辑。当字母格子被填满时,提交按钮才可以点击,未填满时提交按钮不可点击。

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;
	}

结果展示

相关推荐
程序编程- Java19 小时前
三角洲行动-java游戏程序
java·游戏程序·安全架构·玩游戏
一个小狼娃1 天前
Android集成Unity避坑指南
android·游戏·unity
极客柒1 天前
Unity 协程GC优化记录
java·unity·游戏引擎
黄思搏1 天前
Unity SpriteRenderer 进度条 Shader 实现
unity·游戏引擎
程序编程- Java1 天前
和平精英java 游戏程序
java·游戏程序·安全架构·玩游戏
猫屋小鱼丸1 天前
手把手教你在unity中实现一个视觉小说系统(一)
unity
国服第二切图仔1 天前
Rust开发实战之简单游戏开发(piston游戏引擎)
开发语言·rust·游戏引擎
HahaGiver6662 天前
Unity与Android原生交互开发入门篇 - 打开Unity游戏的设置
android·unity·交互
@LYZY2 天前
Unity TextMeshPro 文本对齐方式详解
unity·游戏引擎·textmeshpro·tmp