【游戏开发】unity教程8 用IMGUI和UGUI实现血条

github传送门:https://github.com/dongzizhu/unity3DLearning/tree/master/hw8/enhancedDisk

视频传送门:https://space.bilibili.com/472759319

目前做的比较完善的且有对抗性质的就是打飞碟的那个小游戏了,所以这次我们直接在这个项目上做改动,将原本计分的位置改为血条。

两种实现

IMGUI

因为之前的GUI就是用IMGUI制作的,所以改起来比较方便。

首先我们在UserGUI中添加三个变量,分别表示当前的体力值health,以及当前变化的目标体力值resulthealth,以及标志着resulthealth是否需要更新的信号flag。

接下来就是在所有改动score的地方将UserGUI的flag设为true,比如在每次得分的时候,如下图所示。

最后就是将原本用一个Label来显示分数的地方改成HorizontalScrollbar;其中health的变化我们可以应用Mathf中的Lerp函数来平滑,使得滚轴均匀变化,在视觉上不那么突兀;然后每次只要flag为true就更新一下resulthealth的值即可。

最终的效果如下图所示。

 

UGUI

UGUI则相对复杂一些。

首先我们在main下面新建一个UI中的Canvas命名为bloodC,然后在Canvas下新建一个Slider命名为bloodS。

我们将Slider的Background和Handle Slide Area全部勾选为非激活的状态,然后将Fill Area中的color选为红色,因为我们只需要它就可以实现血条的效果了。最后还需要调一下bloodC的position和scale就大功告成了。

为了用代码控制slider,我们还需要三个新的对象分别是GameObject、Canvas以及Slider。

然后我们通过GameObject.Find()找到canvas,通过transform.Find()找到子对象bloodC以及bloodS。

这里需要指出的是,我们需要将canvas调用SetActive设为false,这样保证在大多数情况下都不会显示血条;然后在需要显示血条的时候将其设为true。但是需要注意,如果一开始就将它勾选掉,那么Find函数将找不到它,因为都没有激活那么自然也就不是子对象了;所以要在程序开始运行的时候将其设为激活状态,然后在这里也就是start函数中首先用Find找到这个对象,然后再设为false。

最后在游戏进行的时候,因为之前已经设置好了位置,所以这里直接改动value也就是滚动条的位置即可。

最终效果如下所示。

 

两种实现的对比

总体来说,IMGUI的实现较为简单,不需要使用UI组件,可以快速完成;但是缺点就是因为操作简单,所以很多想要的效果很难实现,而且调整整体布局会是一件很困难的事情,每个部件之间是彼此分离的。

而UGUI则是通过游戏对象来进行管理的,符合unity3d的总体设计逻辑,与其他对象之间的联系更加紧密(如Camera);而且可以很轻易的用几行代码做到让血条保持在对象头顶并时刻正对玩家。

综上所述,IMGUI其实是一种临时凑合的工具,只有在极少数简陋的情况下可以直接使用IMGUI;大多数都是用于在游戏中显示调试信息。若想真正在成品中实现交互,还是需要用UGUI。

 

有关预制

这里生成的Canvas就可以直接拖入下方的Assets面板中,成为一个预制。这样如果在其他scene中想要再次使用,就可以直接脱出来;或者如果想用代码直接控制生成,也需要将设置好的结构保存为预制,然后直接load进当前场景。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章