2D小游戏--猜对应卡牌(unity)

2d,小游戏,对应,unity · 浏览次数 : 46

小编点评

**项目名称:Guess Card Game** **参考源码链接:** * 2D游戏引擎 Unity 示例代码 * 2D卡牌游戏脚本 **步骤:** **1. 创建场景及对象** * 创建一个新的场景。 * 在场景中创建一个新的 GameObject,将其设置为背景。 * 选择背景对象的 GameObject,并将其拖到场景中。 **2. 选择一张卡牌作为对象** * 在 Hierarchy窗口中,创建一个新 GameObject,将其设置为卡牌对象。 * 将卡牌对象拖到场景中的 Memory Card 下方。 * 修改卡牌对象的名称为 "Memory Card3"。 **3. 创建其他对象** * 创建一个空 GameObject,将其命名为 "Card Back"。 * 将卡背对象拖到 Memory Card 下方。 * 将卡背对象的子对象命名为 "Card Back"。 **4. 修改代码** * 创建一个名为 "MemoryCard.cs" 的新的 C# 文件。 * 在文件中添加以下代码: ```c# 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); } // 其他方法省略 } ``` **5. 创建脚本** * 创建一个名为 "SceneController.cs" 的新的 C# 文件。 * 在文件中添加以下代码: ```c# 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; } // 其他方法省略 } ``` **6. 配置游戏** * 在 Unity 编辑器中,在 Inspector 面板中设置游戏变量。 * 在 "Memory Card" 中设置卡牌的初始位置。 * 在 "SceneController" 中设置背景图片和卡牌数量。 **7. 运行游戏** * 启动游戏,即可体验游戏。

正文

博客地址: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)相似的内容:

2D小游戏--猜对应卡牌(unity)

博客地址:https://www.cnblogs.com/zylyehuo/ 项目名称 guess_card_game 参考源码链接: https://www.manning.com/books/unity-in-action 效果图预览 step1: 创建一个3D项目 step2: 修改2D相关设

手写签名-微信小程序

index.wxml

我用 GitHub 9.8k 的 Go 语言 2D 游戏引擎写了个游戏

游戏引擎的贡献者依旧在积极维护,是一个兼具学习 & 娱乐的项目!为此我也用这个引擎写了一个生存游戏: avoid-the-enemies

[转帖]shell删除文件前几行或后几行

https://www.cnblogs.com/1394htw/p/14852207.html shell删除文件前几行或后几行 #!/bin/bash #删除前两行 sed -i '1,2d' filename #删除后两行 sed -i '$d' filename sed -i '$d' fil

基于ZXing.NET实现的二维码生成和识别客户端

一、前言 ZXing.Net的一个可移植软件包,是一个开源的、多格式的1D/2D条形码图像处理库,最初是用Java实现的。已经过大量优化和改进,它已经被手动移植。它与.Net 2.0、.Net 3.5、.Net 4.x、.Net 5.x、.Net 6.x、.Net 7.x、Windows RT类库和

基于深度卷积神经网络的时间序列图像分类,开源、低功耗、低成本的人工智能硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 卷积神经网络(CNN)通过从原始数据中自动学习层次特征表示,在图像识别任务中取得了巨大成功。虽然大多数时间序列分类(TSC)文献都集中在1D信号上,但本文使用递归图(RP)将时间序列转换为2D纹理

记录 Ucharts 的使用

1.开启 2d 渲染 线上运行开启 canvas2d 可以解决图表显示问题 canvasId 可以不传,官方内置生成随机字符串id的方法 注: 开启 2d 后,不能真机调试,只能开发者工具调试或扫二维码"预览"。 开启 2d 后,模拟

[转帖]Unixbench的使用(综合性能测试、2D测试)和问题解决(跑不出多线程分数,调不出窗口,报错等)

一、Unixbench简介 Unixbench一个基于系统的基准测试工具,不单纯是CPU 内存 或者磁盘测试工具。测试结果不仅仅取决于硬件,也取决于系统、开发库、甚至是编译器。Unixbench是一个老牌的性能测试工具,下载主要是针对Unixbench进行综合性能以及使用Unixbench进行2D性

[转帖]三星固态硬盘总结

https://www.cnblogs.com/hongdada/p/17260098.html 年代颗粒消费级产品制程企业级产品oem产品 2012 平面2D 840Pro,840Evo 21nm Sm843t Sm841 2015 平面2D 19nm Sm951 2013 第一代V-NAND 2

.NET遍历二维数组-先行/先列哪个更快?

上周在.NET性能优化群里面有一个很有意思的讨论,讨论的问题如下所示: 请教大佬:2D数组,用C#先遍历行再遍历列,或者先遍历列再遍历行,两种方式在性能上有区别吗? 据我所知,Julia或者python的 pandas,一般建议先遍历列,再遍历行 在群里面引发了很多大佬的讨论,总的来说观点分为以下三