博客地址:https://www.cnblogs.com/zylyehuo/

项目名称 guess_card_game

参考源码链接:
https://www.manning.com/books/unity-in-action

效果图预览

step1: 创建一个3D项目

step2: 修改2D相关设置

点击Edit/Project Settings 再选择Editor选项 修改Default Behaviour Mode的Mode为2D

修改选项卡为2D模式

step3: 准备工作

创建需要的文件夹

记住场景名字

在Sprites文件夹下准备相应的图片

卡牌图案: 150*200px

卡背: 能盖住卡牌即可

重置按钮: 无要求

背景: 无要求

step4: 相关代码

MemoryCard.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class MemoryCard : MonoBehaviour
{
[SerializeField] private GameObject cardBack;
public void OnMouseDown()
{
if (cardBack.activeSelf && controller.canReveal) {
cardBack.SetActive(false);
controller.CardRevealed(this);
}
} public void Unreveal() {
cardBack.SetActive(true);
} [SerializeField] private SceneController controller;
private int _id;
public int id
{
get { return _id; }
}
public void SetCard(int id, Sprite image)
{
_id = id;
GetComponent<SpriteRenderer>().sprite = image;
} // Start is called before the first frame update
void Start()
{ }
// Update is called once per frame
void Update()
{ } }

SceneController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class SceneController : MonoBehaviour
{
public const int gridRows = 2;
public const int gridCols = 4;
public const float offsetX = 2;
public const float offsetY = 2.5f; private MemoryCard _firstRevealed;
private MemoryCard _secondRevealed;
private int _score = 0;
public bool canReveal {
get { return _secondRevealed == null; }
} [SerializeField] private MemoryCard originalCard;
[SerializeField] private Sprite[] images;
[SerializeField] private TextMesh scoreLabel; public void CardRevealed(MemoryCard card) {
if (_firstRevealed == null)
{
_firstRevealed = card;
}
else {
_secondRevealed = card;
StartCoroutine(CheckMatch());
}
} private IEnumerator CheckMatch() {
if (_firstRevealed.id == _secondRevealed.id)
{
_score++;
Debug.Log("Score:" + _score);
}
else {
yield return new WaitForSeconds(.5f);
_firstRevealed.Unreveal();
_secondRevealed.Unreveal();
} _firstRevealed = null;
_secondRevealed = null;
} // Start is called before the first frame update
void Start()
{
Vector3 startPos = originalCard.transform.position; int[] numbers = {0, 0, 1, 1, 2, 2, 3, 3 };
numbers = ShuffleArray(numbers); for (int i = 0; i < gridCols; i++) {
for (int j = 0; j < gridRows; j++) {
MemoryCard card;
if (i == 0 && j == 0)
{
card = originalCard;
}
else {
card = Instantiate(originalCard) as MemoryCard;
} int index = j * gridCols + i;
int id = numbers[index];
card.SetCard(id, images[id]); float posX = (offsetX * i) + startPos.x;
float posY = - (offsetY * j) + startPos.y;
card.transform.position = new Vector3(posX,posY,startPos.z);
}
} } private int[] ShuffleArray(int[] numbers) {
int[] newArray = numbers.Clone() as int[];
for (int i = 0; i < newArray.Length; i++) {
int tmp = newArray[i];
int r = Random.Range(i,newArray.Length);
newArray[i] = newArray[r];
newArray[r] = tmp;
}
return newArray;
} // Update is called once per frame
void Update()
{ }
}

UIButton.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class UIButton : MonoBehaviour
{
[SerializeField] private GameObject targetObject;
[SerializeField] private string targetMessage;
public Color highlightColor = Color.cyan;
public void OnMouseEnter()
{
SpriteRenderer sprite = GetComponent<SpriteRenderer>();
if (sprite != null)
{
sprite.color = highlightColor;
}
}
public void OnMouseExit()
{
SpriteRenderer sprite = GetComponent<SpriteRenderer>();
if (sprite != null)
{
sprite.color = Color.white;
}
} public void OnMouseDown()
{
transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);
}
public void OnMouseUp()
{
transform.localScale = Vector3.one;
if (targetObject != null)
{
targetObject.SendMessage(targetMessage);
}
} // Start is called before the first frame update
void Start()
{ } // Update is called once per frame
void Update()
{ }
}

step5: 创建场景及对象

1、将背景从Project中拖到场景中

2、选择一张卡牌作为对象,拖到Hierarchy窗口,并修改名称为 Memory Card

3、将卡背拖到Memory Card下方作为子对象

4、创建空对象,依次修改名称

5、脚本挂载

Memory Card

card_back

Controller

Score

start-button

2D小游戏--猜对应卡牌(unity)的更多相关文章

  1. 玩Python小游戏猜数字,在游戏中掌握基础,你还能学不会?

    学python怎么离得开案例呢? 今天再继续给大家分享一个Python教程里的猜数字游戏     我最近也是在学python,从事编程工作几年了,但是python还是今年才开始玩的,不得不说,这真是一 ...

  2. Python小游戏 -- 猜单词

    Python初学者小游戏:猜单词 游戏逻辑:就像我们曾经英语学习机上的小游戏一样,电脑会从事先预置的词库中抽取单词,然后给出单词的字母数量,给定猜解次数,然后让玩家进行猜测,并给出每次猜测的正确字母与 ...

  3. Python小游戏 -- 猜数字

    Python初学者小游戏:猜数字 游戏逻辑:电脑随机生成一个数字,然后玩家猜数字,电脑提示猜的数字大了还是小了,供玩家缩小数字范围,达到既定次数后,玩家失败.若在次数内猜对,玩家获胜. 涉及知识点:r ...

  4. 解压小游戏之打砖块(C#+unity)

    z这个小游戏很简洁,很简单,非常适合一个人玩,特别减压

  5. Python小游戏——猜数字教程(random库教程)

    今天来开发一个简单的数字逻辑游戏,猜数字(数字炸弹) 首先开发游戏第一件事,了解需求. 猜数字游戏规则: 计算机随机生成一个指定范围的数字,由玩家来猜测, 之后计算机会根据玩家提供数字来与自己生成的数 ...

  6. 利用while循环写的简单小游戏猜数字

    猜数字的大小游戏 C:\Users\Administrator>python Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 23 2018, 23:31:1 ...

  7. Python小游戏——猜数字

    1 print("--------------我爱鱼-----------") 2 temp = input("不妨猜一下甲鱼现在心里想的是哪个数字:") 3 ...

  8. python写的第一个简单小游戏-猜数字

    #Filename:game1.py guess=10 running=True while running: try: answer=int(raw_input('Guess what i thin ...

  9. 使用canvas通过js制作一个小型英雄抓怪兽的2D小游戏

    首先,这是一个HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  10. Python学习-55 小游戏- 猜大小

    #游戏开始,首先玩家选择大小,选择完成后开始摇骰子(11<=总值<=18为大,3<=总值<=10为小) import random def roll_dice(numbers= ...

随机推荐

  1. MySQL版本是8.0.3,数据库连接字符串都检查无误,驱动类名加不加cj都试过了,URL是否加时区、是否加useSSL都试过了,都无法正常登录进去!

    我在运行library这个web程序登录时(我的MySQL版本是8.0.3,数据库连接字符串都检查无误,驱动类名加不加cj都试过了,URL是否加时区.是否加useSSL都试过了,都无法正常登录进去!) ...

  2. JavaScript设计模式与开发实践 PDF——带完整书签

    下载链接:JavaScript设计模式与开发实践 带完整书签:

  3. [转]怎么使用PyCharm编写Python程序,简单教程

    原文链接:怎么使用PyCharm编写Python程序,简单教程.

  4. 【狂神说Java】Java零基础学习笔记-面向对象

    [狂神说Java]Java零基础学习笔记-面向对象 面向对象01:什么是面向对象 面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么.... 面对过程适合处理一些较为简 ...

  5. JpaRepository动态代理执行原理

    本文基于spring-boot-starter-data-jpa:2.7.17分析 SpringBoot 里集成Jpa自动配置是如何处理的 通过分析SpringBoot 自动配置核心源码可以找到Jpa ...

  6. 前端学习openLayers配合vue3(加载矢量图标)

    今天我们来进行矢量图标的加载 关键代码 有一个比较注意的点就是,图片路径必须引入不能直接写路径,我找半天也没发现问题所在 let anchorLayer=new VectorLayer({ sourc ...

  7. vue基础2

    1.表单 表单里面有单选框,多选框,下拉框,文本域 vue单页应用 SPA:signal page application(单页应用) 多页面:1个url->1个html文件 多个url-> ...

  8. 谈谈flutter的线程

    本文同步发布于公众号:移动开发那些事谈谈flutter的线程 刚接触flutter的同学肯定会对fluter所谓的单线程架构很蒙逼,因为这与我们学开发时,各种语言里的多线程的介绍有点出入,而且手机的C ...

  9. 使用ffmpeg去除音频静音

    直接使用cmd命令ffmpeg -i input.wav -af silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-30dB ...

  10. .net core 用 identitymodel 请求token。

    identitymodel  也有在Nuget里搜索和安装. identitymodel 扩展了HttpClient的一些方法用于token请求. 例如:client.RequestTokenAsyn ...