-------小基原创,转载请给我一个面子

  上回书说道,英雄和魔王都做完了,子弹也能发射了,就是不知道啥时候能干死魔王。那小基得做个血条来展示一下,他离死不远了(•౪• ) 其实血条也可以看作是进度条的一种用法,大家经常看到的loading图各式各样,无非都是在表示进度的百分比。所以下面小基来演示怎么做一个比较low的通用进度条。

上面是几个例子,最后一个什么鬼小基也不知道,有会做的老司机请手把手教我,谢谢( ᐛ )

第一步先把组件拼装好

创建空物体起名叫做BossHpBar,本例非常直观的叫法,当然起通用的名字更好一下比如ProgressBar(whatever)

里面放三个图片,分别叫做bg(底),up(上),damage(损血可回复)

注意红色箭头,锚点要修改好。意思是up停靠在bg最左边距离0个像素位置,damage在up的最右边距离0个像素位置。

血量减少,或者进度增加的过程,就是改变up图片的scale大小,左边位置固定了,如果scale的x变大,就相当于变长(进度增加),x变小就对应变短(血量减少)。

damage这个有的游戏“损血可恢复”这一说,比如“一定时间内可缓慢回复”,“交换队员后台回血”(铁拳TT2),“攻击对方可回复损血部分”(血源诅咒)

当然如果你不需要这个功能,不加这个东西就是了~

最后你应该能够做出下面这个效果。白色是血条整体,红色为血量,黄色为损血部分(就这么叫吧)

此时你可以自己改变up和damage的scale的x值,看看变化效果。

第二步准备上代码,让它“自己动”

给父节点BossHpBar上添加一个脚本,名字叫做BossHpBar吧

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; [ExecuteInEditMode]
public class ProgressBar : MonoBehaviour { [SerializeField]
private Image Bg;
[SerializeField]
private Image Up;
[SerializeField]
private Image ChangeImg;
[SerializeField]
private float _maxValue;
[SerializeField]
private float _value;
[SerializeField]
private float _changeValue; private float size = ;
private float changeSize = ; //最大值
public float MaxValue
{
get
{
return _maxValue;
}
set
{
_maxValue = value;
}
} //当前值
public float Value
{
get
{
return _value;
}
set
{
_value = value;
UpdateBar();
}
} //变化值
public float ChangeValue
{
get
{
return _changeValue;
}
set
{
_changeValue = value;
UpdateBar();
}
} public void SetValue(float value, float maxValue)
{
SetValue(value, , maxValue);
} public void SetValue(float value, float changeValue, float maxValue)
{
_value = value;
_changeValue = changeValue;
_maxValue = maxValue;
UpdateBar();
} void UpdateBar()
{
if (Bg == null || Up == null)
return; size = Mathf.Clamp01(_value / _maxValue);
//Debug.Log("size:" + size);
Up.rectTransform.localScale = new Vector3(size, , );

if(size != 0)
{
             changeSize = -Mathf.Clamp01(_changeValue / _maxValue)/size;
}
ChangeImg.rectTransform.localScale = new Vector3(changeSize, , );
} //面板调试
[SerializeField]
bool refresh = false;
#if UNITY_EDITOR
void Update()
{
if(refresh)
{
refresh = false;
UpdateBar();
}
}
#endif
}

上面总揽全局,下面小基具体分析

[SerializeField]这个作用是让下面的对象可以在Inspector面板里显示,方便拖动物体与其绑定。不用这个的话就把private改成public是一个道理,不过public尽量少用(优化,规范,性能这些不打算在这个系列里面提及太多,增加对新人的学习成本。这个系列目的就是让零基础的童鞋也能做出效果,体验成就感爆棚的感觉!)

MaxValue,Value,ChangeValue这三个属性,里面可以get获取到对应的值,也可以set给对应的值赋值(小基让你满血就满血,让你残血就残血,氪金的话,小基让你锁血无敌吼不吼啊~)

  

这里在set设置血量或者损血量的时候,会调用刷新血条UpdateBar()这个方法,这样UI那边才能反映出变化对吧。注意,MaxValue一般来说,固定了就不需要再变化了,所以小基就没有加UpdateBar() 如果你是杠精可能会说“使用道具提升血量上限”这个事,那就在MaxValue里面也加个UpdateBar()就好了。万能的ctrl+c,ctrl+v

接下来提供设置血量的方法吧(A脚本直接调用B脚本的 .XXX这种赋值方式,一旦多人开发,会让你崩溃的。 最好不要这么写 bScript.MaxValue = 100,上面几个属性不要set会更好吧。大家自行选择吧,群众的眼睛是雪亮的)

这两个方法名字一样,区别是参数不同(数量多一个),装X术语讲应该叫做overload(重载),不是那个动漫啦。还有个叫overwrite(重写)这俩完全两回事,别弄混,面试会考的。

当你调用SetValue()方法的时候,会根据你传的参数,自行找到合适代码(传2个参数就用上面的,传3个参数就调用下面的)

意思就是:如果你调用方法时候,传2个参数,我就默认你changeValue为0,毕竟可能你整个游戏都没有这个需要,每次非传3个参数还必须中间填个0,多无聊。如果你调用方法时候传递3个参数,那么这3个参数的值你自己掌控就好。代码里面就是给三个变量赋值,然后更新血条

下面是本代码重头戏,血条更新

如果Bg,Up这俩都没图片的话,等着报错吧,所以为了安全,所以加个判断是否为null吧,啥都没准备好,那就return返回就是了。

接下来算scale到底要缩小到多少。当前/总血量 是计算百分比,然后用Mathf.Clamp01这个限制这个值最终为0~1之间(你血量超出上限的话,那你也是棒棒哒)

接下来对Up的localScale赋值做缩放,改变长就ok了,y,z两个保持1就行了(其实这里不好,万一控件y,z不是1,你这么写就要粗事。最好是提前保存下来y,z 的值,然后这里附近去。还是不想增加阅读成本,怎么简单怎么来吧,这里的坑小基就指一下)

再下面是对damage损血那个图片的长度进行计算,不过因为damage是up的子物体,再localScale是在up缩放后的基础上再次缩放,所以后面多 /size 一下,是去掉up的缩放影响。这样如果up跟damage值是一样的话,看起来长度也应该是一样的。

最后说一下方便调节的东东

类前面增加这个标签,可以在unity没有运行的条件下,操作面板来调用代码(这样就不用老去运行的时候看效果了)

那么需要非运行条件下看效果的部分就是这个,如果我点击refresh这个勾选,就立刻看一下血条的刷新情况。这样调节MaxValue,Vaule,ChangeValue的效果就非常方便了

挂上脚本后的样子,绑定好对应的物体

这样就可以通过设置值,来控制血条的变化了。

别急,事还没完呢!

我们要打怪啊,他要掉血啊!

上一篇文章中大家还记得Enemy那个脚本吧,就是被打后,移动那个ByHit方法那个事,现在我们来把它改成掉血

 using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Enemy : MonoBehaviour { private GameObject bossHpBar;
private ProgressBar bossHpBarCpnt; public float MaxHp = ; // Use this for initialization
void Start () {
bossHpBar = Instantiate((GameObject)Resources.Load("Prefab/BossHpBar"));
bossHpBar.transform.SetParent(GameObject.Find("Canvas").transform, false);
bossHpBarCpnt = bossHpBar.GetComponent<ProgressBar>();
bossHpBarCpnt.MaxValue = MaxHp;
bossHpBarCpnt.Value = MaxHp;
bossHpBarCpnt.ChangeValue = ;
//Debug.Log("bossHpBar:" + bossHpBar);
} private float curHp = ;
void ByHit(int damageValue)
{
curHp = bossHpBarCpnt.Value - damageValue;
bossHpBarCpnt.SetValue(curHp, MaxHp); if(curHp <= )
{
Destroy(this.gameObject);
Destroy(bossHpBar);
Debug.Log("You Win");
}
}
}

这次我们像子弹一样,动态创建血条,不然三个boss圈踢你一个,你还想在场景里放三个血条,然后拖动绑定么?那玩割草无双那么多血条,怕不是累成dog

这里就是老规矩,把BossHpBar制作成Prefab方法特定目录下,然后start()里面创建出来并附上初始值,这些方法之前博客里面都有讲过,相信你肯定都记得。

GameObject.Find("Canvas")就是动态查找到Canvas,不像之前似得还得拖动绑定了,有点low

GetComponent<ProgressBar>就是获取预制体BossHpBar上面的ProgressBar脚本,然后错误示范 bossHpBarCpnt.MaxValue = MaxHp。最好用bossHpBarCpnt.SetValue(MaxHp,0,MaxHp)这么调用赋值

这回我们挨揍后不移动了,改为取当前血量,然后减去要扣的血量,给血条赋值。(damageValue是子弹那边传过来的)

if判断里面是,如果敌人挂了,就删除掉自身,和自己的血条。顺便恭喜你一下

你已经成功干掉了敌人,而且学会了如何制作血条(进度条)( ˶ˇωˇ˶ )

unity零基础开始学习做游戏(五)看看你的完成度,进度条了解一下?的更多相关文章

  1. unity零基础开始学习做游戏(三)鼠标输入,来个虚拟摇杆怎么样?

    -------小基原创,转载请给我一个面子 现在移动游戏越来越火,大家都拿手机平板玩游戏,没有键盘和手柄输入,所以就不得不看看虚拟摇杆怎么搞?(小基对于没有实体反馈不是很喜欢呢) 首先要清楚,鼠标操作 ...

  2. unity零基础开始学习做游戏(一)为了实现你的游戏,你需要提前做的准备工作

    -------小基原创,转载请给我一个面子 正所谓,工欲善其事,必现准备好电脑.接下来跟着小基一步一步来搭建你的开发环境吧 1.下载安装unity 上面的那个是破解软件,下面是unity5.5.6的安 ...

  3. unity零基础开始学习做游戏(四)biu~biu~biu发射子弹打飞机

    -------小基原创,转载请给我一个面子 主角都能移动了,那不得做点什么伸张正义,守护世界和平的事嘛,拿起家伙biu~biu~biu~ 首先得做一个好人和一个坏人 老规矩,Canvas下创建两个Im ...

  4. unity零基础开始学习做游戏(二)让你的对象动起来

    -------小基原创,转载请给我一个面子 小基认为电子游戏与电影最重要的区别就是交互,如果电子游戏没有让你输入的交互功能的话,全程都"只可远观,而不可鼓捣"的话,你可能是在看视频 ...

  5. unity零基础开始学习做游戏(六)背景给我“滚”~

    -------小基原创,转载请给我一个面子 一望无际的...空旷场景,看着实在是难受,不如添加些背景吧.如果要真的想好好设计关卡背景的话,最好是做一个地图编辑器,不过做开发工具毕竟有点点复杂且枯燥,以 ...

  6. 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令

         这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀.   1.[BX]的概念      [BX]和[0]类似 ...

  7. 零基础如何学习java更有效呢?

    零基础学java,不知道该如何入手?也不知道学习的方向,很多人会问零基础怎么样学习,有没有什么入门的书籍推荐:只要方法正确,零基础学好java也是有机会的哦. 一.理解Java思想 Java是一门面向 ...

  8. javascript入门视频第一天 小案例制作 零基础开始学习javascript

    JavaScript 是我们网页设计师必备的技能之一.我们主要用javascript来写的是网页特效.我们从零基础开始学习javascript入门. 但是,好的同学刚开始不知道怎么学习,接触js,因此 ...

  9. 零基础如何学习 Web 安全?(转)

    在网上看了一篇文章<零基础如何学习 Web 安全?>,虽然很多东西的都不是很懂,感觉挺好的copy过来,慢慢消化: 文章地址:https://www.zhihu.com/question/ ...

随机推荐

  1. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  2. UNIX环境高级编程——进程关系

    一.终端的概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们 ...

  3. Libgdx 1.6.1发布,跨平台游戏开发框架

    Libgdx 1.6.1发布 [1.6.1] 英文原文:http://www.badlogicgames.com/wordpress/?p=3694 译文翻译:宋志辉 - Net.newServerS ...

  4. Spring AOP 初探

    本文可作为北京尚学堂spring课程的学习笔记 首先谈谈什么是AOP 它能干什么 AOP Aspect Oriented Programming(面向切面的编程) 什么叫面向切面? 就是我们可以动态的 ...

  5. ABB机器人基础培训资料整理与总结

    之前对机械臂了解较少,这方面知识比较匮乏.只使用过PowercCube六自由度机械臂. 感谢ABB公司何老师的耐心指导. 学习资料汇总:(最重要的ABB Robot 官网就不列出了,这里以中文资料为主 ...

  6. python import自己编写的模块:import json和simplejson

    python import的模块都是库里面的,而自己的模块也可以添加 比如python的json处理,库里没有json文件,import json不行. 网上大部分人告诉你处理json用 dumps和 ...

  7. Android必知必会--使用shape制作drawable素材

    前言 最近看到朋友制作的Android APP使用了极少的图片,但是图形却极其丰富,问了之后得知是使用shape绘制的,有很多优点. 下面是我整理的一些素材: 预览 下面是图片预览: 代码 布局文件 ...

  8. Mahout系列之-----相似度

    Mahout推荐系统中有许多相似度实现,这些组件实现了计算不能User之间或Item之间的相似度.对于数据量以及数据类型不同的数据源,需要不同的相似度计算方法来提高推荐性能,在mahout提供了大量用 ...

  9. libevent之Reactor模式

    通过前边的一篇博文轻量级网络库libevent初探,我们知道libevent实际上是封装了不同操作系统下的/dev/poll.kqueue.event ports.select.poll和epoll事 ...

  10. Java集合之Set

    Set也是继承自Collection,Set也是集合的一种,同时Set不允许重复的元素存在.Set的实现类都是基于Map来实现的,其中HashSet是通过HashMap来实现的,TreeSet是通过T ...