Unity:动态加载游戏等级.
标签: 动态加载游戏等级
我们知道在游戏中,游戏等级不是在搭建UI时写死的,而是动态加载的.
比如,消灭星星,等级的信息是根据玩家的数据而改变的,不同的等级可能得到的星星数量不同.
动态加载时在搭好的UI界面通过Resources,load动态加载进去,
资源工程文件:https://pan.baidu.com/s/1RIF_fdFOye6sFu82_7aUpw
项目目标.
步骤:
1.首先还是搭建UI界面,层次等级如下:
SelectLevelUI是UI界面背景,
TitleView 是TitleBar,不做解析
LevelCount: 游戏等级的承载体,游戏等级的直接背景,等级元素将动态生成在此下面,
需要对他进行预布局,作为元素的载体,同时,还会最为每个元素Toggle的组头,
每个元素都以此为分组.
其中,Cell Size是其内每个元素的大小设置,习惯上LevelCount的尺寸大小根据排列的Cell相关,
cell 直接填满LevelCount,每个元素的具体布局则在Cell内具体排布.
Cell 也就是此处的Level,是对具体游戏等级的具体排布.
背景有两种颜色的image,分别表示正常和被选中时,将分别拖入到Toggle里,
Target Graphic :Normal_bg
Graphic: Hight_bg
Group: 就是上面提到的levelCount父物体为分组;
将搭建好的level元素做成预制体防止丢失.
以上为UI的搭建
-------------------------------------------------------------------------------------------------------------------
2.代码编写:
2-1.制作Model;
一个level有多少数据,独处出来建一个数据类,取名LevelData
using System.Collections;using System.Collections.Generic;using UnityEngine;/** MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,* 一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,* 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,* 不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理* 和输出功能在一个逻辑的图形化用户界面的结构中。*///数据类,模型类,MPC->Model->View->Controller思想 这个类就属于M即 Model//level的显示依据于数据public class LevelData{public int level_id; //关卡的ID,通过ID我们可以读取本地的配置文件(CSV文件读取,本地数据库的读取)//来获取客户端应该显示的数据public string level_name; //关卡名字public int level_number; //关卡编号public int level_star_number; //关卡星星数public string level_icon; //关卡背景}
关卡背景Icon是有加载路径确认的,因此是字符串路径.
2-2,建好数据模型后,通过此模型创建数据,但是他创建出来只是数据,没有赋给模型.因此
还需要创建模型,赋值给模型,将数据赋值到模型,即挂载到模型上的值
初始化模型:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.UI;
- public class Level : MonoBehaviour
- {
- public int level_id; //每个关卡的ID号
- public Text level_name; //关卡名字
- public Text level_number; //关卡编号
- public Image level_icon; //关卡背景图标
- public Image level_star_one; //一星
- public Image level_star_two; //二星
- public Image level_star_three; //三星
- public void InitLevelWithLevelID(int id)
- {
- level_id = id;
- level_name = transform.Find("LevelInfo/LevelName").GetComponent<Text>();
- level_number = transform.Find("LevelInfo/LevelNumber").GetComponent<Text>();
- level_icon = transform.Find("LevelIcon").GetComponent<Image>();
- level_star_one = transform.Find("LevelStar/StarCenter").GetComponent<Image>();
- level_star_two = transform.Find("LevelStar/StarLeft").GetComponent<Image>();
- level_star_three = transform.Find("LevelStar/StarRight").GetComponent<Image>();
- }
- }
2-3,创建数据,创建模型,动态加载到UI中
2-3-1 创建临时数据,添加到链表List _datas上,
获取等及元素的父物体,获取等级元素模型
根据得到的临时数据创建每个等级元素.:
- void CreateLevel()
- {
- //因为我们以后的数据是网络请求而来,所以客户端不能保证一定能得到数据
- //所以一般在处理网络请求数据的时候,一定要在本地做好保护,因为一旦不写保护,
- //很可能因为的得不到数据崩溃,学医保护最多就是不显示数据而已,不会让程序中断.
- //客户端程序员要养成良好的习惯,任意数据(只要是从后台获取的就一定得做保护)
- //比如说前端要显示一个int数据,该数据从后端读取,没有意外获取的就是int,但是也有可能
- //因为后端手误,返回给你的是一个float数据,那我们知道高精度转呗低精度最多就是丢失精度而已
- //但是如果反过来,低转高,需要强转,一旦类型不匹配,你有没有强转,此时程序崩溃.
- if (_datas.Count>0)
- {
- for (int i = 0; i < _datas.Count; i++)
- {
- tempLevel= Instantiate(_level) as GameObject;
- //设置父节点
- tempLevel.transform.parent = _levelParent;
- //设置位置
- tempLevel.transform.localPosition = Vector3.zero;
- //设置缩放
- tempLevel.transform.localScale = Vector3.one;
- //设置旋转
- tempLevel.transform.localRotation = new Quaternion();
- //------------------->处理数据
- Level levelItem = tempLevel.AddComponent<Level>();
- //根据集合里的ID进行初始化
- levelItem.InitLevelWithLevelID(_datas[i].level_id);
- //设置名字
- levelItem.level_name.text = _datas[i].level_name;
- //设置关卡编号
- levelItem.level_number.text = _datas[i].level_number.ToString();
- //设置关卡的背景图片
- string path = string.Format("{0}{1}", "Icon/", _datas[i].level_icon);
- levelItem.level_icon.sprite = Resources.Load(path, typeof(Sprite)) as Sprite; //typeof (Sprite) as Sprite 制定类型
- //设置关卡星级
- ShowStar(_datas[i].level_star_number, levelItem);
- toggle = levelItem.GetComponent<Toggle>();
- toggle.onValueChanged.AddListener
- (
- (isOn) =>
- {
- SelectLevel(isOn, levelItem);
- });
- }
- }
- }
因为元素父物体有自动布局,因此只需创建出来,将元素的父物体设置好,就能自动布局.
创建一个真正的元素,给它添加脚本组件,将其他组件的具体属性赋值,显示其星星数量并监听被选中后的事件.
这样动态加载游戏等级做好了,详情见首部工程源代码!
智能推荐
Unity3D异步加载游戏场景
加载场景但不** 此处有个bug,或许是我做的不对,async.progress最大只能到9。 http://forum.unity3d.com/threads/using-allowsceneactivation.166106/ 导出webplayer版发现进入第一个场景后,第二个场景没有预加载,原因是勾选了Streamed。...
喵的Unity游戏开发之路 - 多场景:场景加载
如果丢失格式、图片或视频,请查看原文:https://mp.weixin.qq.com/s/RDVMg6l41uc2IHBsscc0cQ 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学。为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌...
学习动态加载游戏场景和异步加载游戏场景
LoadSceneMode:加载场景的模式 下面是我学习的异步加载场景的学习路程,我只是记录自己的学习过程,小白一个,如果有不对的地方还希望大家可以指出,我一定认真学习。 ...
Unity游戏开发——UnityUGUI——Button动态绑定事件
UGUI和NGUI一个作者写的所以很多东西基本类似,今天记录下UGUI动态绑定事件 UGUI支持的事件如下 Supported Events The Eventsystem supports a number of events, and they can be customised further in user custom user written InputModules. The eve...
猜你喜欢
unity制作预制体,动态加载预制体
1,制作预制体 可参考 创建预制体Prefab 新建一个物体拖到Assets下的任何一个文件夹下即可,预制体的颜色会变蓝色。 2 如果制作的预制体上有脚本,当预制体被动态加载时脚本也是可以加载的。 Rotate.cs 4, 动态加载预制体 LoadCube.cs 5 运行结果 6,经验告诉我,可以把一个工程里面常用的多个物体以及脚本制作为一个预制体。以后用会很方便,比如机械产品的装配体...
Unity2 学习 制作和动态加载预制体
1.制作预制体 把要制做预制体的物体home托到Resources文件夹中,然后删除Hierarchy中的物体Home即可。注意为了保持比例一致,设置好后,home在托到Resources中时不能是其它物体的子物体。 2, 在程序运行时通过代码实例化出预制体Home,把一个物体home做为另一个物体B的子物体。 如果不重新命名,则运行时动态加载的物体的名子会是Home(clone),这样如果要在其...
Mybatis源码的下载,搭建以及阅读源码的姿势
源码下载 mybatis的源码是在github上开源的,所以直接从github上搜索下载即可。 如上图,第一个就是mybatis3的源码项目,下面几个也是项目中常用的依赖项目,分页插件pagehelper,SSM项目需要引入的依赖mybatis-spring,mybatis-plus项目等。 当前最新版本是v3.5.5,可以选择合适的版本下载。我本地选择的是v3.5.4版本,小版本之间没有太大差异...
spring cloud + redis RedisTemplate Api搭建简单Demo
简介 Redis是一种NoSQL数据库,即非关系型数据库。redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,r...
c++在windows、linux下获取指定文件夹下所有文件名的方法
一般来说,获取指定文件夹下的所有文件名,用python是较为方便的,直接: import os files_name = os.listdir(“一个路径”) 但也有c++程序偶尔也有这个需求,下面就直接上c++在windows和linux去读取文件夹下文件名的方法,不同的系统代码上有一些差别 Windows(vs) vs的环境,主要是用到了头文件<io.h>,...
