首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【unity3D】unity记忆翻牌小游戏教程(简单详细)

  • 23-09-15 21:02
  • 3643
  • 9722
blog.csdn.net

游戏开发的学习记录⑨

项目:记忆翻牌小游戏

unity版本:unity2020.3.30f1c1

目录

    • 项目:记忆翻牌小游戏
    • unity版本:unity2020.3.30f1c1
    • 一、游戏内容说明
    • 二、游戏最终成品
    • 三、游戏制作过程(图文)
    • 四、修改格子数量
    • 五、修改限制步数

(最近在做得游戏里想加一个类似于记忆翻牌小游戏得部分,然后在网上收集了资料学习了一下,学会后写下这份制作记录,希望可以帮到你~)

?一位大佬的博客,写的很详细:【Unity3D游戏教程】记忆翻牌游戏

(大家可以先看大佬这篇,我写这篇主要补充一些修改。比如想改变格子数量,格子的大小位置,想添加结束后的显示面板等)

一、游戏内容说明

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

二、游戏最终成品

开始时:
在这里插入图片描述
游戏中:
在这里插入图片描述
挑战成功和挑战结束:
在这里插入图片描述
(成功会弹出成功面板的,我忘了截图,脑子也不想再玩一遍,就不放图了)


(然后,接下来是教程部分了,跟着一步步做,就能成)

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

  1. 新建一个背景图,一个用来放翻牌的面板,一个显示步数的文本
    在这里插入图片描述
  2. 给panel添加上Grid Layout Group组件和Content Size Fitter组件。然后在panel下面新建一个image,然后根据你自己需要的数量进行复制。 我这里是弄了30个格子。(Content Size Fitter组件是对panel的大小进行约束。Grid Layout Group组件是对panel下面的子物体进行排列,大家可以根据需求调整数值。)
    在这里插入图片描述

调节各属性的图示:
在这里插入图片描述

  1. 将刚刚为了查看布局新建的很多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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  1. 新建一个成功面板和失败面板
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 新建一个空物体,新建一个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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  1. 最后赋值一下
    在这里插入图片描述
  2. 为button按钮添加点击事件(即重新开始按钮)
    在这里插入图片描述

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


四、修改格子数量

在这里插入图片描述
在这里插入图片描述


五、修改限制步数

在这里插入图片描述


?有一段时间没写了,如果这篇哪里写的不好或不清楚的,欢迎在评论区留言,我会修改的。希望这篇记录可以帮到你~
?更多内容请前往主页置顶或点击链接直达:【unity3D】游戏开发专栏的目录

注:本文转载自blog.csdn.net的猪肉丸子~的文章"https://blog.csdn.net/zhurouwanzi/article/details/129832671"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top