Unity实现记忆翻牌Game

举报
心疼你的一切 发表于 2024/12/18 10:22:25 2024/12/18
【摘要】 实现翻牌game

1. 场景搭建

  • 创建一个 Canvas(右键点击 Hierarchy 面板,选择 UI -> Canvas)用于放置 UI 元素。在 Canvas 下创建多个 Image 组件(右键点击 Canvas -> UI -> Image),比如创建 16 个,这些 Image 用来当作卡片的正面和背面,正面可以放不同的图案(提前准备好相应的精灵图或者纹理资源),背面可以统一放一个默认的背面图案。
  • 给每个 Image 组件添加 Button 组件(点击 Add Component -> Button),使其可点击。
  • 创建一个空物体挂载游戏管理脚本(稍后介绍),用于控制整个游戏流程。

2.卡片代码如下:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class Card : MonoBehaviour, IPointerClickHandler
{
    public Sprite frontSprite;  // 卡片正面的精灵图
    public Sprite backSprite;  // 卡片背面的精灵图
    private Image image;
    private bool isFlipped = false;  // 是否已翻开
    private bool isMatched = false;  // 是否已匹配

    void Start()
    {
        image = GetComponent<Image>();
        image.sprite = backSprite;
    }

    public void OnPointerClick(PointerEventData eventData)
    {
        if (!isFlipped &&!isMatched)
        {
            Flip();
            // 这里可以通知游戏管理脚本,有卡片被翻开了,以便进行匹配判断等后续操作(后续结合游戏管理脚本完善逻辑)
        }
    }

    public void Flip()
    {
        isFlipped = true;
        image.sprite = frontSprite;
    }

    public void SetMatched()
    {
        isMatched = true;
    }

    public bool IsMatched()
    {
        return isMatched;
    }

    public bool IsFlipped()
    {
        return isFlipped;
    }
}

3.管理脚本代码如下:

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;

public class MemoryGameManager : MonoBehaviour
{
    public Card[] cards;  // 所有卡片的数组
    private int numPairs = 8;  // 卡片对数
    private List<Card> flippedCards = new List<Card>();  // 已翻开的卡片列表

    void Start()
    {
        // 初始化卡片
        InitializeCards();
    }

    void InitializeCards()
    {
        List<Sprite> sprites = new List<Sprite>();
        for (int i = 0; i < numPairs; i++)
        {
            // 假设有多个不同的精灵图,这里重复添加两次,模拟成对的卡片
            sprites.Add(cards[i].frontSprite);
            sprites.Add(cards[i].frontSprite);
        }

        // 打乱精灵图顺序
        ShuffleSprites(sprites);

        for (int i = 0; i < cards.Length; i++)
        {
            cards[i].frontSprite = sprites[i];
        }
    }

    void ShuffleSprites(List<Sprite> sprites)
    {
        for (int i = 0; i < sprites.Count; i++)
        {
            int randomIndex = Random.Range(0, sprites.Count);
            Sprite temp = sprites[i];
            sprites[i] = sprites[randomIndex];
            sprites[randomIndex] = temp;
        }
    }

    public void CardClicked(Card card)
    {
        if (flippedCards.Count < 2)
        {
            card.Flip();
            flippedCards.Add(card);

            if (flippedCards.Count == 2)
            {
                // 检查两张卡片是否匹配
                CheckMatch();
            }
        }
    }

    void CheckMatch()
    {
        if (flippedCards[0].frontSprite == flippedCards[1].frontSprite)
        {
            flippedCards[0].SetMatched();
            flippedCards[1].SetMatched();
            flippedCards.Clear();
        }
        else
        {
            // 若不匹配,等待一定时间后将卡片翻回去
            Invoke("FlipBackCards", 1f);
        }
    }

    void FlipBackCards()
    {
        foreach (Card card in flippedCards)
        {
            card.Flip();
        }
        flippedCards.Clear();
    }
}

4.使用方法

  •  Card.cs 脚本挂载到每个 Image(代表卡片)上,并在 Inspector 面板中为每个卡片分别设置对应的正面和背面精灵图。
  • 将所有的 Card 组件拖放到 MemoryGameManager.cs 脚本挂载物体的 cards 变量上(在 Inspector 面板操作),以便游戏管理脚本能管理所有卡片。
  • 运行后,点击卡片就能实现翻牌、匹配判断等记忆翻牌游戏的基本操作了。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。