首先在场景中创建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
{/// <summary>/// 最大时间,超过该时间游戏失败/// </summary>public float maxTime=15;/// <summary>/// 用于计时/// </summary>private float m_time;/// <summary>/// 当前翻对了多少组牌/// </summary>private int Count;/// <summary>/// 需要翻对多少组牌才能胜利,简单来说就是所有牌数量除2/// </summary>private int maxCount;/// <summary>/// 得分/// </summary>private int Score;/// <summary>/// 储存牌面图片,注意你用了多少组牌,就得赋多少个牌面,比如教程里用了12个牌,就需要赋值6个Sprite/// </summary>public List<Sprite> sprites = new List<Sprite>();/// <summary>/// 储存所有牌的列表,/// </summary>private List<Transform> cardList = new List<Transform>();/// <summary>/// 用于初始化牌列表/// </summary>public Transform cardTrans;/// <summary>/// 编号列表,用于给每张卡进行编号/// </summary>private List<int> indexList = new List<int>();/// <summary>/// 是否开始游戏/// </summary>private bool isStart;/// <summary>/// 用于等待,主要是给玩家一点看牌的时间/// </summary>private bool isWaiting;/// <summary>/// 储存翻到的第一张牌/// </summary>private Transform FirstCard;/// <summary>/// 储存翻到的第二张牌/// </summary>private Transform NextCard;/// <summary>/// 开始游戏的按钮/// </summary>public Button startBtn;/// <summary>/// 倒计时的Text/// </summary>public Text timeText;//[SerializeField]//private Text timeText;//你也可以尝试这种写法,不过我个人觉得这种写法多此一举/// <summary>/// 计数Text/// </summary>public Text countText;/// <summary>/// 计分Text/// </summary>public Text scoreText;protected void Awake(){//初始化cardListfor (int i = 0; i < cardTrans.childCount; i++){//遍历cardTrans,把他的每个子物体都加到list里cardList.Add(cardTrans.GetChild(i));int id = i;//给卡背添加点击的监听,每张卡都绑定了一个IdcardTrans.GetChild(i).Find("Fade").GetComponent<Button>().onClick.AddListener(() => { CardClick(id); });}for (int i = 0; i < cardList.Count / 2; i++){for (int j = 0; j < 2; j++){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 <= 0)//时间用完了还没结束游戏,则游戏失败CardResult(false);}/// <summary>/// 开始游戏/// </summary>private void CardStart(){if (isStart)//如果游戏在进行中,则点击无效return;m_time = maxTime;Count = 0;//计数归0indexList = RandomList(indexList);//把编号随机排序,相当于洗牌for (int i = 0; i < cardList.Count; i++){cardList[i].name = indexList[i] + "";//我这里直接用卡名作为判断依据,每两张卡如果卡名一样则为一组cardList[i].Find("Icon").GetComponent<Image>().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;}/// <summary>/// List随机排序/// </summary>/// <typeparam name="T"></typeparam>/// <param name="list"></param>/// <returns></returns>public List<T> RandomList<T>(List<T> list){var random = new System.Random();var newList = new List<T>();foreach (var item in list){newList.Insert(random.Next(newList.Count), item);}return newList;}/// <summary>/// 点击卡背/// </summary>/// <param name="id"></param>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));//还没翻完,开启一个等待的协程}}}/// <summary>/// 等待牌翻过来/// </summary>/// <param name="a">这两张牌是否一致</param>/// <returns></returns>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;}/// <summary>/// 游戏结果/// </summary>/// <param name="isSuccess">是否成果</param>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

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

  1. unity ui框架_用unity制作简单的太空游戏(2)-简单炮台

    多铆蒸刚,炮塔至大! 亿万星辰,亿万炮塔! 多铆蒸刚,炮塔至上! 亿万炮塔,亿万荣光! (PS:我没有咕咕咕,就是比较惨,一口气出了半个月的差,人瘦了,也黑了,心塞塞--赶紧写个文章压压惊--) 这一 ...

  2. 翻译:如何用Cocos2d来开发简单的IPhone游戏教程

    这一周接触到Cocos2D开发,在它的官网上看到Ray Wenderlic写的关于cocos2d开发的文章,感觉写的挺好,翻译了一下.  原文链接地址大家可以在上面看到作者的更多内容 初次翻译文章,望 ...

  3. 如何使用cocos2d-x 3.0来做一个简单的iphone游戏教程(第一部分)

    游戏截图: cocos2d-x 是一个支持多平台的开源框架,用于构建游戏.应用程序和其他图形界面交互应用.Cocos2d-x项目可以很容易地建立和运行在iOS,Android的三星Bada,黑莓Bla ...

  4. 用unity制作简单的太空游戏(1):简单飞船控制

    最近沉迷<Dreadnought>(中文名:无畏战舰,B站CG链接),回想起作为十余年EVE老油条的太空生涯,又萌生了做个太空游戏的情怀,所以这一次就讲讲怎么做个简单的太空飞船的小游戏好了 ...

  5. unity贪吃蛇c 语言代码,unity实现简单贪吃蛇游戏

    本文实例为大家共享了unity实现贪吃蛇游戏的详细代码,供大家参考,详细内容如下 首先创建一个头部,编写脚本利用WASD控制头部的移动. Vector3 up=new Vector3(0,1,0); ...

  6. Unity:简单易懂小游戏

    这篇博文并不讲述整个游戏的制作流程,如果您感兴趣,可以访问这里,如果访问遇到什么困难,在B站有一摸一样的视频. 这是完成以后的样子: 运行效果: 作为个人小结,下面写一些做这个游戏的收获: 1.什么是 ...

  7. Unity 3D-learning 简单打飞碟游戏

    一.编写一个简单的打飞碟游戏 游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial: 每个 trial 的飞碟的色彩.大小.发射位置.速度.角度.同时出现的个数都可 ...

  8. unity实现简单巡逻兵

    unity实现简单巡逻兵 游戏视频 游戏要求 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次确定下一个目标位置,用自己当前位置为原点计算: 巡 ...

  9. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例

    C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...

最新文章

  1. 北师大历史系65 级同学聚会宁夏【之七】——在中阿之轴、西夏王陵、董府、板桥道堂、鸿乐府及告别宴会...
  2. python好学吗一般要学多久-转行学Python开发难吗,月薪过万需要多久
  3. c语言重定义不同的基类型_简述usb连接器输出类型定义和不同环境下的用法
  4. python中set怎么循环_python如何遍历set
  5. ASP.NET Core 1.0到底是什么?
  6. Mysql 的隔离级别与锁
  7. 如何在Linux上使用端口敲门(以及为什么不应该这样做)
  8. MyEclipse配置Tomcat 6
  9. OSI七层模型与TCP/IP五层模型详解
  10. 使用Python编写数独游戏自动出题程序
  11. 关于使用C#编写一个简单的日志类
  12. 客流分析江湖争端再起,新旧势力谁更胜一筹?
  13. 浅析数据中心交换机芯片,中国自主可控国产化交换机已是历史必然
  14. 如何利用迅捷PDF编辑器在PDF文档上修改文字大小和颜色
  15. 联想 Newifi mini Y1 Padavan固件设置5Ghz桥接
  16. 机器学习在重度抑郁症患者中的应用:从分类到治疗结果预测
  17. 正则校验IP及端口和域名和手机号、座机同步校验
  18. android画cci指标代码,大智慧CCI画线指标源码 副图公式
  19. matplotlib中关于极坐标轴的控制
  20. java.sql.SQLException: 无效的列类型: 1111 报错问题解决

热门文章

  1. 手机为什么蓝牙搜索不到设备
  2. 如何将PDF转换成可编辑的Excel表格?手机也可以操作。
  3. Fritzing0.9.10下载安装和简单使用
  4. phar php 应用,使用php -phar来理解composer
  5. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xd5 in position 84: invalid continuation byte
  6. 上传iso文件至linux主机,Docker 镜像文件的上传
  7. 2022年起重机械指挥考试模拟100题及答案
  8. ELK实践系列-测试环境环境搭建
  9. [威客任务]¥800.00 JS实现网站联动三级选项
  10. 鼠标滚轮失灵了,最后换了鼠标编码器,才算修好。