2D小游戏--猜对应卡牌(unity)
Posted zylyehuo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2D小游戏--猜对应卡牌(unity)相关的知识,希望对你有一定的参考价值。
2D小游戏--猜对应卡牌(unity)
项目名称 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)的主要内容,如果未能解决你的问题,请参考以下文章