Unity3D_(游戏)卡牌记忆03_主菜单界面

(游戏)卡牌记忆01_启动屏界面: 传送门

(游戏)卡牌记忆02_主菜单界面: 传送门

(游戏)卡牌记忆03_主菜单界面  未完

实现过程

  关卡数据结构

  设置关卡序列化,实现选关效果

[System.Serializable]
public class LevelInfo
{
    public int row;
    public int col;
    public int count;   //  本关从定集合中随机几个素材
    public Sprite[] sprites;
}

public LevelInfo[] levels;

添加关卡提示信息

[System.Serializable]
public class LevelInfo
{
    public int row;
    public int col;
    public int count;   //  本关从定集合中随机几个素材
    public string desc;     //关卡简要描述
    public Sprite[] sprites;
}

  设置第0关为3行4列,默认三种素材,在Element中添加素材贴纸,这里游戏设置了17关

将LevelDataLogo设置为预设体

    预设是Unity中的一种特殊资源。

    一般来说预设就是一个或者一系列组件的集合体,你可以在创建了预设以后,对预设进行实例化。

    举个例子给你,在UI中,如果你用到了选择不同英雄的列表,这个时候你可以创建一个英雄头像+名称+攻防的UI预设,同时对这个预设绑定相关的类。当你收到数据需要展示的时候,那么你就可以动态创建预设,然后通过GetComponent来获取到绑定的脚本,并且工作脚本来对当前的预设对象进行赋值
Unity中预设体

  

  复制一个新的预设体,将第一个预设体复制粘贴,得到一个预设体副本,将预设体副本中卡牌贴纸换一个主题,选择不同主题玩不同类型的卡牌游戏

选关界面

selectLeval场景创建画布作为背景,存放关卡信息

  

  下方创建画布,存放关卡备注信息

  LevelPanelCell是表格画布,用来存放总关卡

LevelItemCell用来存放单个表格

  bg:Image图片放置关卡背景

  num:Image图片上的数字

  lock:Image为锁的图片

  mask_lock:给锁设置黑色图片,默认处于不开启状态

  mask_press:点击锁的时候给锁上颜色

复制多个LeveIItemCell放置游戏关卡

为了动态生成关卡和存放关卡界面,可以把LevelItemCell和LevelPanelCell设置成预设体(注意预设体存放的位置)

  将预设体LevelItemCell绑定LevelItemCell脚本,并创建LevelManager脚本

  根据我们关卡数据定义,判断一共多少个关卡按钮。LevelManager脚本来创建LevelPanelCell表格,LevelPanelCell表格里的单元格是LevelItemCell

  添加完脚本后,LevelManager绑定Mask,可用第一个表格来对第二个表格进行覆盖

脚本

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

//用来管理所有关卡按钮
//根据我们关卡数据定义,判断一共多少个关卡按钮。LevelManager来创建LevelPanelCell表格,LevelPanelCell表格里的单元格是LevelItemCell

public class LevelManager : MonoBehaviour {
    
    int totalCount = 18 ;   //临时测试,一共18关
    readonly int ITEM_COUNT_PER_PAGE = 15;      //每页显示15个关卡
    readonly float PANEL_SPACE = 10f;

    public RectTransform contentTrans;
    float panelCelloffset;
    int pageCount;
    GameObject levelPanelCellPreb;
    GameObject levelItemCellPreb;
    Text levelDescText;

    private void Awake()
    {
        levelPanelCellPreb = Resources.Load<GameObject>("Prefabs/SelectLevel/LevelPanelCell");
        levelItemCellPreb = Resources.Load("Prefabs/SelectLevel/levelItemCell") as GameObject;
        levelDescText = GameObject.Find("LevelDesc/text").GetComponent<Text>();
    }

    // Use this for initialization
    void Start () {
        //计算panel的偏移,需要动态的计算
        panelCelloffset = contentTrans.rect.width + PANEL_SPACE;
        //计算出一共需要多少页
        pageCount = Mathf.CeilToInt((float)totalCount / ITEM_COUNT_PER_PAGE);

        for(int i = 0; i < pageCount; i++)
        {
            CreateLevelPanelCell(i);
        }
    }
    
    // Update is called once per frame
    void Update () {
        
    }
    
    void CreateLevelPanelCell(int pageIdx)
    {
        GameObject panelObj = Instantiate(levelPanelCellPreb, contentTrans);
        RectTransform panelTrans = panelObj.GetComponent<RectTransform>();
        panelTrans.anchoredPosition = new Vector2(panelCelloffset * pageIdx, 0);

        //确定本页中 具有的关卡元素levelItemCellPreb个数
        int startID = ITEM_COUNT_PER_PAGE * pageIdx;
        int count = totalCount - startID;   //本页需要显示的按钮个数
        if (count > ITEM_COUNT_PER_PAGE)
        {
            count = ITEM_COUNT_PER_PAGE;
        }

        //创建本页中所有关卡按钮
        for(int i = 0; i < count; i++)
        {
            //创建每一个关卡按钮单元
            GameObject itemObj = Instantiate(levelItemCellPreb, panelTrans);
        
            LevelItemCell cell = itemObj.GetComponent<LevelItemCell>();
            cell.id = startID +i + 1;
            cell.lvlMgr = this;
            itemObj.name = cell.id.ToString();
        }
    }

    //设置关卡描述文字
    void SetLevelDesc(string content)
    {
        levelDescText.text = content;
    }
}
LevelManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//选关界面,没有个关卡按钮单元
public class LevelItemCell : MonoBehaviour {

    public int id;  //每个单元对应的关卡id(从1开始)
    public LevelManager lvlMgr;

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}
LevelItemCell.cs

Awake()获得UI社体对象

    private void Awake()
    {
        levelPanelCellPreb = Resources.Load<GameObject>("Prefabs/SelectLevel/LevelPanelCell");
        levelItemCellPreb = Resources.Load("Prefabs/SelectLevel/levelItemCell") as GameObject;
        levelDescText = GameObject.Find("LevelDesc/text").GetComponent<Text>();
    }

生成18关卡,没页显示15关卡

    int totalCount = 18 ;   //临时测试,一共18关
    readonly int ITEM_COUNT_PER_PAGE = 15;      //每页显示15个关卡
    readonly float PANEL_SPACE = 10f;

void Start () {
        //计算panel的偏移,需要动态的计算
        panelCelloffset = contentTrans.rect.width + PANEL_SPACE;
        //计算出一共需要多少页
        pageCount = Mathf.CeilToInt((float)totalCount / ITEM_COUNT_PER_PAGE);

        for(int i = 0; i < pageCount; i++)
        {
            CreateLevelPanelCell(i);
        }
    }

创建LevelPanelCell表格

 void CreateLevelPanelCell(int pageIdx)
    {
        GameObject panelObj = Instantiate(levelPanelCellPreb, contentTrans);
        RectTransform panelTrans = panelObj.GetComponent<RectTransform>();
        panelTrans.anchoredPosition = new Vector2(panelCelloffset * pageIdx, 0);

        //确定本页中 具有的关卡元素levelItemCellPreb个数
        int startID = ITEM_COUNT_PER_PAGE * pageIdx;
        int count = totalCount - startID;   //本页需要显示的按钮个数
        if (count > ITEM_COUNT_PER_PAGE)
        {
            count = ITEM_COUNT_PER_PAGE;
        }

        //创建本页中所有关卡按钮
        for(int i = 0; i < count; i++)
        {
            //创建每一个关卡按钮单元
            GameObject itemObj = Instantiate(levelItemCellPreb, panelTrans);
        
            LevelItemCell cell = itemObj.GetComponent<LevelItemCell>();
            cell.id = startID +i + 1;
            cell.lvlMgr = this;
            itemObj.name = cell.id.ToString();
        }
    }

猜你喜欢

转载自www.cnblogs.com/1138720556Gary/p/9472035.html