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

结果展示

相关推荐
技术小甜甜1 天前
[Godot] 解决导出APK安装失败的常见问题:深入分析与调试方法
游戏引擎·godot·游戏开发
老朱佩琪!1 天前
Unity桥接模式
unity·设计模式·c#·桥接模式
技术小甜甜1 天前
[Godot][入门] 安装与版本选择:3.x 还是 4.x?(按项目类型一键决策)
游戏引擎·godot·游戏开发·2d
陈言必行1 天前
Unity 之 物理引擎中三种刚体力施加方式详解
unity·游戏引擎
foreveryao1231 天前
Unity渲染流程(底层逻辑)
unity·游戏引擎·图形渲染
small-pudding1 天前
Unity中的PBR(基于物理的渲染)
unity·游戏引擎
CreasyChan1 天前
3D游戏数学基础指南
游戏·3d·unity·数学基础
平行云2 天前
Enscape × Paraverse | 从设计到一键发布、网页分享、实时交互的全新体验
unity·ue5·xr·3dsmax·webgl·实时云渲染·云桌面
老朱佩琪!2 天前
Unity迭代器模式
unity·设计模式·迭代器模式
程序猿多布2 天前
Unity 多语言系统实现
unity·多语言