问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity3D记忆翻牌小游戏开发教程

创作时间:
作者:
@小白创作中心

Unity3D记忆翻牌小游戏开发教程

引用
CSDN
1.
https://blog.csdn.net/zhurouwanzi/article/details/129832671

项目:记忆翻牌小游戏

unity版本:unity2020.3.30f1c1

这是一篇关于如何使用Unity3D开发记忆翻牌小游戏的详细教程。文章包含了游戏的完整制作过程,包括Unity版本、项目结构、代码实现等,并配有详细的图文说明。

一、游戏内容说明

  1. 两两翻牌,一样则标记成功,不一样,两个都恢复原样。
  2. 步数记数,可以规定步数,在规定步数内全发出游戏成功,没全翻出则游戏失败。
  3. 游戏成功和游戏失败都弹出相应的面板。

二、游戏最终成品

开始时:

三、游戏制作过程(图文)

  1. 新建一个背景图,一个用来放翻牌的面板,一个显示步数的文本

  2. 给panel添加上Grid Layout Group组件和Content Size Fitter组件。然后在panel下面新建一个image,然后根据你自己需要的数量进行复制。我这里是弄了30个格子。(Content Size Fitter组件是对panel的大小进行约束。Grid Layout Group组件是对panel下面的子物体进行排列,大家可以根据需求调整数值。)

  3. 将刚刚为了查看布局新建的很多image删除,只留下一个,改名为CardPre,为其添加button组件,然后将Transition的属性设置为none。然后新建一个Card脚本并挂载上去。然后制成预制体,然后将它也删除,一会儿会自己生成。

Card脚本:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class Card : MonoBehaviour
{
    public int ID
    {
        get
        {
            return id;
        }
    }
    private int id;
    private Sprite frontImg;//未翻开前看到的图片
    private Sprite backImg;//翻看后看到的图片
    private Sprite successImg;//显示表示已经为正确翻开过的图片
    private Image showImg;//挂载的图片组件
    public Button cardBtn;//挂载的按钮组件
    public void InitCard(int Id, Sprite FrontImg, Sprite BackImg, Sprite SuccessImg)
    {
        this.id = Id;
        this.frontImg = FrontImg;
        this.backImg = BackImg;
        this.successImg = SuccessImg;
        showImg = GetComponent<Image>();
        showImg.sprite = this.backImg;
        cardBtn = GetComponent<Button>();
    }
    public void SetFanPai()
    {
        showImg.sprite = frontImg;
        cardBtn.interactable = false;
    }
    public void SetSuccess()
    {
        showImg.sprite = successImg;
    }
    public void SetRecover()
    {
        showImg.sprite = backImg;
        cardBtn.interactable = true;
    }
}
  1. 新建一个成功面板和失败面板

  2. 新建一个空物体,新建一个Card_GameManager脚本,挂载到空物体上

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Card_GameManager : MonoBehaviour
{
    private const int winCardCouples = 15;
    private int curCardCouples = 0;
    private bool canPlayerClick = true;
    public Sprite BackSprite;
    public Sprite SuccessSprite;
    public Sprite[] FrontSprites;
    public GameObject CardPre;
    public Transform CardsView;
    private List<GameObject> CardObjs;
    private List<Card> FaceCards;
    public int count = 0;
    public int limitCount = 50;//限制步数
    public Text stepCount;
    public GameObject winPanel;
    public GameObject losePanel;
    
    void Start()
    {
        CardObjs = new List<GameObject>();
        FaceCards = new List<Card>();
        //将12张卡牌制作完成后添加到CardObjs数组
        for (int i = 0; i < 15; i++)
        {
            Sprite FrontSprite = FrontSprites[i];
            for (int j = 0; j < 2; j++)
            {
                //实例化对象
                GameObject go = (GameObject)Instantiate(CardPre);
                //获取Card组件进行初始化,点击事件由游戏管理器统一处理
                //所以卡牌的点击事件的监听在管理器指定
                Card card = go.GetComponent<Card>();
                card.InitCard(i, FrontSprite, BackSprite, SuccessSprite);
                card.cardBtn.onClick.AddListener(() => CardOnClick(card));
                CardObjs.Add(go);
            }
        }
        while (CardObjs.Count > 0)
        {
            //取随机数,左闭右开区间
            int ran = Random.Range(0, CardObjs.Count);
            GameObject go = CardObjs[ran];
            //将对象指定给Panel作为子物体,这样就会被我们的组件自动布局
            go.transform.parent = CardsView;
            //local就表示相对于父物体的相对坐标系,此处做校正处理
            go.transform.localPosition = Vector3.zero;
            go.transform.localScale = Vector3.one;
            //从CardObjs列表中移除该索引指向对象,列表对象数量减少1个
            CardObjs.RemoveAt(ran);
        }
    }
    private void Update()
    {
        if (count == limitCount)
        {
            losePanel.SetActive(true);
        }
    }
    private void CardOnClick(Card card)
    {
        if (canPlayerClick)
        {
            //先判断是否可以点击,可点击则直接翻牌
            card.SetFanPai();
            //添加到比对数组中
            FaceCards.Add(card);
            //步数+1
            count++;
            stepCount.text = "步数:"+count;//文本内容的显示
            //如果有两张牌了,则不可再点击,进入协同程序
            if (FaceCards.Count == 2)
            {
                canPlayerClick = false;
                StartCoroutine(JugdeTwoCards());
            }
        }
    }
    IEnumerator JugdeTwoCards()
    {
        //获取到两张卡牌对象
        Card card1 = FaceCards[0];
        Card card2 = FaceCards[1];
        //对ID进行比对
        if (card1.ID == card2.ID)
        {
            yield return new WaitForSeconds(0.8f);
            card1.SetSuccess();
            card2.SetSuccess();
            curCardCouples++;
            if (curCardCouples == winCardCouples)
            {
                winPanel.SetActive(true);
            }
        }
        else
        {
            //配对失败,停1.5f,然后两张都翻过去
            yield return new WaitForSeconds(1.5f);
            card1.SetRecover();
            card2.SetRecover();
        }
        FaceCards = new List<Card>();
        canPlayerClick = true;
    }
    public void Retry()
    {
        SceneManager.LoadScene(0);//重新加载场景
    }
}
  1. 最后赋值一下

  2. 为button按钮添加点击事件(即重新开始按钮)

(过程到这里就结束了,如果没什么问题的话就已经完成了,因为我是做完才想起来写的,不是一开始就一步步记录,所以如果有遗漏的地方给我说,我会补上。)

四、修改格子数量

五、修改限制步数

这是一篇关于如何使用Unity3D开发记忆翻牌小游戏的详细教程。文章包含了游戏的完整制作过程,包括Unity版本、项目结构、代码实现等,并配有详细的图文说明。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号