Unity非常简单的翻牌游戏教程,纯UI实现 您所在的位置:网站首页 非常简单的立体画三年级 Unity非常简单的翻牌游戏教程,纯UI实现

Unity非常简单的翻牌游戏教程,纯UI实现

2023-07-26 01:28| 来源: 网络整理| 查看: 265

首先在场景中创建Canvas,加几个Button 在这里插入图片描述

为了排版方便,用了GridLayout在这里插入图片描述 每个Button的结构是这样的,你要为Button里面加四个Image,我这样弄是为了省事,少写脚本 这四个Image的名字也不能改,因为我后续是按照Image的名字进行检索的,也是为了省事……

在这里插入图片描述 在Fade上记得加个Button组件 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 简单说下这四个图片的作用:首先这是个翻牌游戏,游戏规则就是当玩家翻到两张一样的牌时计数板加一,计数到6个时游戏完成并加一分。这里面的Icon是放牌面的,就是让玩家知道这两张牌是一样的还是不一样的,起提示作用。Fade是牌背,玩家刚开始看到的就是12张牌背,点击牌背,牌背隐藏,出现牌面。True和False也起提示作用,当两张牌一样时,显示绿色的True,说明玩家选对了,不一样就显示红色的False。 然后你需要调整一下这四张Image的状态。 在这里插入图片描述 完事了把它复制12张,当然你也可以复制很多,保证是偶数就行了。

在这里插入图片描述 新建脚本CardGame,挂到Canvas或随便一个地方 在这里插入图片描述

新建三个Text,一个用于显示倒计时,一个用于显示计数,一个用于显示得分 在这里插入图片描述在这里插入图片描述 在这里插入图片描述 新建一个Button,用于开始游戏 在这里插入图片描述 在网上找几张卡面,拖到Unity里(如果是3D项目,注意转换下格式),为了省事,我没新建文件夹,大家做游戏一定要注意项目的整洁哦 在这里插入图片描述

然后开始写CardGame脚本了 脚本的思路都在注释了,也没啥好说的,写好后在外面把找的图片赋给Sprite数组,按这一套下来应该就可以运行了,点击开始游戏即可开始翻牌 (之前的脚本忘记把引用加上,其实用vs自动纠错都可以解决的,现在的脚本已经不会报错了。) (还有像我这种一个脚本写完翻牌游戏的,以后做项目或者做游戏尽量不要这样,这样写起来是省事,但是不利于项目维护。就这个游戏来说,起码应该写三个脚本,一个卡牌Model类,一个游戏控制类,一个UI显示类。) 在这里插入图片描述

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CardGame : MonoBehaviour { /// /// 最大时间,超过该时间游戏失败 /// public float maxTime=15; /// /// 用于计时 /// private float m_time; /// /// 当前翻对了多少组牌 /// private int Count; /// /// 需要翻对多少组牌才能胜利,简单来说就是所有牌数量除2 /// private int maxCount; /// /// 得分 /// private int Score; /// /// 储存牌面图片,注意你用了多少组牌,就得赋多少个牌面,比如教程里用了12个牌,就需要赋值6个Sprite /// public List sprites = new List(); /// /// 储存所有牌的列表, /// private List cardList = new List(); /// /// 用于初始化牌列表 /// public Transform cardTrans; /// /// 编号列表,用于给每张卡进行编号 /// private List indexList = new List(); /// /// 是否开始游戏 /// private bool isStart; /// /// 用于等待,主要是给玩家一点看牌的时间 /// private bool isWaiting; /// /// 储存翻到的第一张牌 /// private Transform FirstCard; /// /// 储存翻到的第二张牌 /// private Transform NextCard; /// /// 开始游戏的按钮 /// public Button startBtn; /// /// 倒计时的Text /// public Text timeText; //[SerializeField] //private Text timeText; //你也可以尝试这种写法,不过我个人觉得这种写法多此一举 /// /// 计数Text /// public Text countText; /// /// 计分Text /// public Text scoreText; protected void Awake() { //初始化cardList for (int i = 0; i CardClick(id); }); } for (int i = 0; i indexList.Add(i);//初始化编号列表,这里的结果是[0,0,1,1,2,2,3,3,4,4,5,5] } } maxCount = cardList.Count / 2; startBtn.onClick.AddListener(() => { CardStart(); }); } protected void Update() { //UI显示,我这里图省事写在了Update里,以后尽量别写Update里,可以用事件,或者把值封装下 timeText.text = m_time.ToString("f2") + "秒"; countText.text = "计数:" + Count; scoreText.text = "得分:"+Score; if (!isStart) //游戏没有进行中,不计时 return; m_time -= Time.deltaTime; if (m_time cardList[i].name = indexList[i] + "";//我这里直接用卡名作为判断依据,每两张卡如果卡名一样则为一组 cardList[i].Find("Icon").GetComponent().sprite = sprites[indexList[i]]; cardList[i].Find("Fade").gameObject.SetActive(true); cardList[i].Find("True").gameObject.SetActive(false); cardList[i].Find("False").gameObject.SetActive(false); } isStart = true; } /// /// List随机排序 /// /// /// /// public List RandomList(List list) { var random = new System.Random(); var newList = new List(); foreach (var item in list) { newList.Insert(random.Next(newList.Count), item); } return newList; } /// /// 点击卡背 /// /// private void CardClick(int id) { if (!isStart) //游戏没有进行中,不能点 return; if (isWaiting) return; Transform t = cardList[id];//找到这张卡 t.Find("Fade").gameObject.SetActive(false);//隐藏卡背 if (FirstCard == null) //翻第一张 FirstCard = t; else if (NextCard == null)//翻第二张 { NextCard = t; bool isSame; if (FirstCard.name == NextCard.name)//卡名相同,所以这两张卡是一样的,计数加1 { FirstCard.Find("True").gameObject.SetActive(true);//用于提示玩家,你翻对了 NextCard.Find("True").gameObject.SetActive(true); isSame = true; Count++; } else//我这里为了易懂,写的比较啰嗦 { FirstCard.Find("False").gameObject.SetActive(true);//用于提示玩家,你翻错了 NextCard.Find("False").gameObject.SetActive(true); isSame = false; } if (Count >= maxCount)//如果都翻对了,游戏胜利 { CardResult(true); } else { StartCoroutine(WaitFlip(isSame));//还没翻完,开启一个等待的协程 } } } /// /// 等待牌翻过来 /// /// 这两张牌是否一致 /// IEnumerator WaitFlip(bool a) { isWaiting = true; yield return new WaitForSeconds(0.35f);//等待0.35秒 //把用于提示的Image隐藏掉,这样看起来很啰嗦,其实应该给牌单独写个类,大家可以自己优化下 FirstCard.Find("True").gameObject.SetActive(false); FirstCard.Find("False").gameObject.SetActive(false); NextCard.Find("True").gameObject.SetActive(false); NextCard.Find("False").gameObject.SetActive(false); if (!a)//没翻对,这两卡翻回去 { FirstCard.Find("Fade").gameObject.SetActive(true); NextCard.Find("Fade").gameObject.SetActive(true); } //小重置一下,开启下一轮判断 FirstCard = null; NextCard = null; isWaiting = false; } /// /// 游戏结果 /// /// 是否成果 private void CardResult(bool isSuccess) { StopAllCoroutines();//停止所有运行中的协程 if (isSuccess)//游戏胜利,加一分 { Score++; } else//游戏失败,减一分 { Score--; } //重置变量 FirstCard = null; NextCard = null; isStart = false; m_time = 0; Count = 0; } }

效果预览 在这里插入图片描述 源文件链接 链接:https://pan.baidu.com/s/1KKIojoOxntCfVGBOJpQ9gg 提取码:jr7r



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有