siki学院_Unity初级案例_愤怒的小鸟_学习笔记3/3
说明:本次学习开始于2018年9月23日,至9月26日已看完全部教学视频,并已基本完成该案例的制作,历时四天。本文档为我在学习过程中,通过记事本记录的学习过程,对于该游戏案例的制作过程并不十分详尽,不作为教程使用,仅用于自己学习参考,记录于此,聊表心意。
★★黄色加速小鸟(继承自红色)
基本思路,在红色小鸟的脚本中添加是否处于飞行中的判断,具体做法是,声明一个bool变量isfly,初始值为false,在鼠标按下调用飞行函数的时候,设置值为true,在小鸟碰撞检测的函数中设置为false。
然后添加一个释放技能函数showskill,在update中,在双重判断下执行(是否处于飞行中,和是否按下了鼠标左键),showskill函数中首先写上将isfly值改为false,以保证只能释放一次技能。
public virtual void ShowSkill() {
isFly = false;
}
为了继承,将释放技能函数设置为虚函数,并将Rigidbody2D属性设置为保护,以便子类中调用。
子类的设置,新建脚本,继承birds,重写showskill函数,先调用基类的函数,然后将速度设置为原来的两倍。
public override void ShowSkill()
{
base.ShowSkill();
rg.velocity *= 2;
}
新的黄色小鸟添加脚本后,需要在面板中重新赋值。
★★绿色回旋小鸟
方法同黄色,只是技能代码不同
public override void ShowSkill()
{
base.ShowSkill();
Vector3 speed = rg.velocity;
speed.x *= -1;
rg.velocity = speed;
}
★★小鸟受伤
与小猪受伤类似,先声明
private SpriteRenderer render;
public Sprite hurt;
在awake中得到组件
render = GetComponent<SpriteRenderer>();
在碰撞时改变图集
if (isShoot) {
render.sprite = hurt;
}
注意,这里为了避免一开始小鸟就受伤,所以用一个bool变量来标记小鸟是否被发射出。
★★黑色爆炸小鸟
首先制作黑色小鸟
复制一个红色的,改图片,给赋值,去掉原来的代码,加上黑色的代码,再加一个碰撞器,注意勾选上触发器trigger,改大些(爆炸范围,碰到就死)。
然后来说代码,用一个pig类型的表来装在爆炸范围内的猪和木头。
public List<Pig> block = new List<Pig>();
//进入触发区
private void OnTriggerEnter2D(Collider2D collsion) {
if (collsion.gameObject.tag == "Enemy") {
block.Add(collsion.gameObject.GetComponent<Pig>());
}
}
//出触发区
private void OnTriggerExit2D(Collider2D collsion) {
if (collsion.gameObject.tag == "Enemy")
{
block.Remove(collsion.gameObject.GetComponent<Pig>());
}
}
其中,用标签类识别敌人。
在技能释放中销毁这些物体。
while (block.Count > 0 && block != null) {
block[0].PigDead();
}
★注意【foreach循环中是能对list集合进行读取,而不能去销毁表中的内容。】
【for循环会记录当前读取到的下标位置,而物体销毁掉后,剩余物体在表中的位置会发生变化,导致销毁不完全。】
黑鸟爆炸后,原地隐藏,及后事处理。
void OnClear() {
rg.velocity = Vector3.zero;
Instantiate(boom, transform.position, Quaternion.identity);
render.enabled = false;
GetComponent<CircleCollider2D>().enabled = false;
}
其中,包括对小鸟速度的设置(刚体速度设为0,小鸟不再动),生成爆炸预制体,不再渲染显示,取消激活其碰撞体。
重写销毁方法,只需去掉生成爆炸预制体。
protected override void DestoryBird()
{
GameManager._instance.birds.Remove(this);
Destroy(gameObject);
GameManager._instance.NextBird();
}
★★场景补全
★★好吧从这里开始要划水水了
添加布置木头和猪猪。
★★选择地图界面的UI
添加画布,图片。
可以更改画布的尺寸。有三种UI尺寸模式。
★★地图选择实现
在每一个关卡地图上,有锁定和已激活两个ui界面,同时只显示一个。
为地图UI添加代码,添加一个变量(激活该关卡需要的星星数量),和一个标志符(是否能激活),在start函数中写,如果总星星数大于激活需要星星数,则设置标识符为已激活。继续判断是否激活,若激活则显示星星数量UI,未激活显示锁定UI。
void Start () {
if (PlayerPrefs.GetInt("totalStar", 0) >= starNum) {
isSelect = true;
}
if (isSelect) {
locks.SetActive(false);
stars.SetActive(true);
}
}
其中,锁定UI和星星UI需要在编辑器赋值。总星星数用Unity提供的键值对存储给出。
这样在每一次进入关卡选择场景,都会判断激活的地图(根据事先确定好的限制星星数量)
★★关卡界面UI
多是一些图集的设置,主要关键点是逻辑和层次关系要理清楚,在此简述逻辑。
首先是空物体的关卡面板(下有如返回这样的按钮,空物体的关卡容器(加grid layout group组件对其内的每个关卡进行排布管理)),容器中装统一的关卡图标,每个关卡为一个图集,其下还有要显示用的关卡数字,获得的星星。
代码逻辑部分
public bool isSelect = false;
public Sprite levelBG;
private Image image;
void Awake() {
image = GetComponent<Image>();
}
void Start () {
if (transform.parent.GetChild(0).name == gameObject.name) {
isSelect = true;
}
if (isSelect) {
image.overrideSprite = levelBG;
transform.Find("num").gameObject.SetActive(true);
}
}
其中,每个关卡都放上脚本,默认时为显示锁图标,在开始时对其判断是否解锁,每一个可以选择的关卡,重写图片为激活状态的图片,将数字激活显示,其中用第一个子物体名字相等确保第一关处于激活。
★★实现从地图到关卡的选择
在mapselect脚本中添加选择事件,激活levelpanel的UI,隐藏map的UI。
public GameObject panel;
public GameObject map;
public void Select() {
if (isSelect) {
panel.SetActive(true);
map.SetActive(false);
}
}
其中,需要给不同的map赋上不同的值,map属性的值都一样,levelpanel的值则需对应起来,并在每个map中都添加鼠标点击事件,分别调用各自的select函数。
★★游戏结束,星星数据的存储
首先在关卡选择处,选择成功后,存储当前关卡信息。
if (isSelect)
{
PlayerPrefs.SetString("newLevel", "level"+gameObject.name);
}
在游戏管理类中,写存储信息函数。
public void SaveData() {
if (starNum > PlayerPrefs.GetInt(PlayerPrefs.GetString("nowLevel"), 0)) {
PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starNum);
}
}
在游戏结束,显示星星面板中,结算星星后调用存储。
总星星数的存储。
int sum = 0;
for (int i = 1; i <= totalStar; i++) {
sum += PlayerPrefs.GetInt(PlayerPrefs.GetString("level" + i.ToString()));
}
PlayerPrefs.SetInt("totalStar", sum);
}
其中每次都从第一个关卡开始求和,计算出总数后存到totalStar中。
★★场景加载
将已制作好的游戏场景中的除了主摄像机都放到level01空物体下,制成预制体,类似的制作不同关卡的预制体,放到Resources资源目录下,以备调用。
在主摄像机上挂载加载代码。
private void Awake() {
Instantiate(Resources.Load(PlayerPrefs.GetString("nowLevel")));
}
在关卡选择时加载游戏场景。
if (isSelect)
{
PlayerPrefs.SetString("nowLevel", "level"+gameObject.name);
SceneManager.LoadScene(2);
}
}
并将其注册到每一个关卡按钮点击事件中。
★★后续关卡的解锁
在关卡选择代码中,在start函数中判断了第一个关卡后,再判断后面的的关卡是否可选
if (transform.parent.GetChild(0).name == gameObject.name)
{
isSelect = true;
}
else {
int beforeStar = int.Parse(gameObject.name) - 1;
if (PlayerPrefs.GetInt("level" + beforeStar.ToString()) > 0) {
isSelect = true;
}
}
其中,先获得前一个关卡的星星数量,若果大于0则可以选则。
★★文本框中星星数量的实现。
int counts = 0;
for (int i = startLevel; i <= endLevel; i++) {
counts += PlayerPrefs.GetInt("level" + i.ToString(), 0);
}
starText.text = counts.ToString() + "/20";
★★异步加载
void Start () {
PlayerPrefs.DeleteAll();
SceneManager.LoadSceneAsync(1);
}
★★完善与发布
★★bug修复
1,待定小鸟可以点击的问题:将canMove属性默认为false,在初始化小鸟函数中再设置为true。
2,暂停时小鸟可以点击的问题:个人觉得其解决方法不是很妥当,此处略去。
3,小鸟飞行中点击暂停会释放技能的问题:可以通过设置UI界面的【raycast target】属性,不勾选可以不做交互,让鼠标点击穿过这层UI。
siki学院_Unity初级案例_愤怒的小鸟_学习笔记3/3相关推荐
- siki学院_Unity初级案例_愤怒的小鸟_学习笔记1/3
说明:本次学习开始于2018年9月23日,至9月26日已看完全部教学视频,并已基本完成该案例的制作,历时四天.本文档为我在学习过程中,通过记事本记录的学习过程,对于该游戏案例的制作过程并不十分详尽,不 ...
- siki学院_Unity初级案例_愤怒的小鸟_学习笔记2/3
说明:本次学习开始于2018年9月23日,至9月26日已看完全部教学视频,并已基本完成该案例的制作,历时四天.本文档为我在学习过程中,通过记事本记录的学习过程,对于该游戏案例的制作过程并不十分详尽,不 ...
- siki学院unity初级案例炸弹人取空位置点的Bug
问题描述: 在学习Unity初级案例炸弹人时,当取地图上的空位置点时,出现InitMap(2,2)取值不正确的情况. 程序获取的空位置点数 空位置图如下: 从图中可以看出空位置点数应为 ...
- python语言有哪两个系列_(转)Python学习笔记系列——Python是一种纯粹的语言
在摸索适合自己的语言学习方法,看到一篇好文章,转之,侵删. Python的语法范式相当多.知识点相当细,但是Python是一种内在一致性很好的语言,理解了几条基本的规则,就很容易理解大部分语法与现象. ...
- y空间兑换代码_【CV学习笔记】色彩空间
关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间来源:知乎链接:https://zhuanlan.zhihu.com/p/103387082 ...
- cs客户端 实时权限_【CS学习笔记】7、SMBbean的作用
0x00 SMB Beacon 简介 SMB Beacon 使用命名管道通过一个父 Beacon 进行通信.这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效.Windows ...
- 得到app文稿导出_得到app学习笔记作为知识付费者,如何把所学内容快速输出?...
原标题:得到app学习笔记作为知识付费者,如何把所学内容快速输出? 零.引子 昨天看到老公票圈更新了一条段子: 我就是那个伪勤奋者,在知识焦虑的胁迫下,这些年买了不知多少视频.微课.教程还有得到专栏. ...
- 案例驱动式Python学习笔记【第一篇】便捷水果店
前言 后续的此系列博文用于记录案例式Python学习笔记记录,供本人和感兴趣的小伙伴一起学习!!人生苦短,我学Python! 驱动案例 便捷水果店:请为水果店开发一个收银的小程序,已知水果单价和购买重 ...
- group by rollup 变量名为空值_【Python学习笔记】07、数据类型和变量
在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,包括负整数,例如:1,100,-8080,0,等等. 计算机由于使用二进制,所以,有时候用十六进制表示整 ...
最新文章
- Java NIO与IO的区别和比较
- ubuntu下连接mysql出现Access denied for user ‘rose‘@‘localhost‘ (using password: NO)的解决方法
- java super object,java学习记录笔记--继承,super,Object类
- python数字信号处理应用中文pdf_人邮新书 Python数字信号处理应用 Python在DSP中应用教程 Python基础 Pytho...
- 作者:张岩,男,北京大学教授、博士生导师。
- 随便选一张扑克牌_教大家怎么快速记忆扑克牌?一学就会
- 2场直播丨MySQL 数据库最常见的 6 类故障的排除方法、2020数据技术嘉年华·金融峰会暨数据库大咖讲坛(第4期)...
- C++20 模式下将启用协程支持 CC 11
- cad的font文件夹有字体但是标注显示问号的问题
- bc547可以用8050代换吗_常用三极管代换型号
- 浅谈12306核心模型设计思路和架构设计
- U8C报表模板已设置,任务已分配仍无法查看报表数据
- 乔治城大学计算机科学硕士2019,[2019世界大学排名]2019乔治城大学排名
- vue获取地址栏参数
- json.decoder.JSONDecodeError: Expecting value: line column (char )
- 以树莓派为控制中心的软硬件之开发之脑电波模块
- 用SVD压缩彩色图片(MATLAB代码)
- C语言小记:结构体及其在内存中的储存形式
- 机器学习:决策树的预剪枝和后剪枝
- 高校教师开计算机培训中心,计算中心
热门文章
- 北理计算机学院高扬,北理工MBA戚高扬备考故事:| 为梦起航 圆梦北理
- 老戚的黑科技之ssh无密码登录
- QQ全量上云的技术解析
- 苹果手机怎么查看WiFi密码?无需下载软件,快速分享密码给其他人
- 赛尔网——Wifi 分享
- AdobePhotoshopCS3-full1224 (绿色版)
- OKLink行业观察:投资数字资产的机构版图(二)微策略
- 2017百度之星总结
- job运行失败分析方法
- Killer KCC(Killer control center/Killer Intelligence Center)安装失败问题解决 Windows 10 应用需要FAT32或ExFAT格式