(游戏)卡牌记忆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来获取到绑定的脚本,并且工作脚本来对当前的预设对象进行赋值
复制一个新的预设体,将第一个预设体复制粘贴,得到一个预设体副本,将预设体副本中卡牌贴纸换一个主题,选择不同主题玩不同类型的卡牌游戏
选关界面
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; } }
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 () { } }
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(); } }