obsidian/笔记文件/2.笔记/UGUI整体解决方案-案例篇_第六章.md
2025-03-26 00:02:56 +08:00

4.7 KiB
Raw Blame History

血条场景,运行后的效果,如图所示

!Pasted image 20240327105853.png

这个血条,是可以支持,多个不同的血条状态; 其中血条数据是通过LifeBarData结构体进行控制 结构体包含图片BarSprite和颜色BarMainColor这里的demo只测试了不同的颜色血条切换暂时没测试不同的图片切换

!Pasted image 20240327114604.png

血条对应的预制体是这个其中NextBar和CurrentBar分别是下一个血条和当前血条两者都包含的AdditionBar是用来添加血条增减的动画特效

!Pasted image 20240327114908.png

血条本身会挂载两个脚本其中一个就是LifeBarItem其中包含位置信息RectTransform 和 图片Image 俩组件的获取器

!Pasted image 20240327115218.png

然后还会弄一个子item就是用作增减动效的AdditionBar节点也是新增这个LifeBarItem组件另外_defaultWidth默认宽度就是 RectTransform 本身的宽度width SetData设置数据函数传参就是LifeBarData结构体自身的颜色和图片还有子物体的颜色和图片都是使用同一个data即可

!Pasted image 20240327115420.png

增减过程,有可能会出现,越界的情况,就需要两个函数,分别是设置尺寸,实现归零、恢复默认尺寸

!Pasted image 20240327115636.png

GetOutOfRange调用以上越界的逻辑判断

!Pasted image 20240327115729.png

通过调用ChangeLife函数如果动效子节点不为空就通过Dotween动画插件使用DOFade透明化接口0.5秒内,子节点完成血条增减的动画特效处理; 自身的RectTransform的sizeDelta尺寸根据修改生命值的value修改即可正负代表增减 然后调用上述的越界检测处理GetOutOfRange函数即可

!Pasted image 20240327115953.png

血条挂载的另一个脚本就是LifeBar其中声明的_target指的是挂载在对应的目标物体上 offset是对于目标物体而言进行的位置偏移数值 data就是多个血条的数据队列容器 nextbar和currentbar就是下一、当前血条在逻辑上会根据血条增减过程切换两者 unitLifeScale是血条RectTransform的width宽度配合总血条数据数目和最大生命值换算得到的缩放用来配合修改血条增减的显示比例 currentIndex就是当前血条数据的索引

!Pasted image 20240327120425.png

设置血条数据的SetBarData接口是根据index血条数据索引和总的血条数据队列容器对当前血条currentBar和下一血条nextBar调用上述SetData完成数据的赋值

!Pasted image 20240327121227.png

这是LifeBar修改生命值的接口外部调用血条修改生命也是通过这个逻辑接口进行调用 配合unitLifeScale调用LifeBarItem组件的ChangeLife接口得到血条偏移的width判断是否已经减少到当前血条currentBar为0%或者已经增加到当前血条currentBar到达100%就调用Exchange函数切换当前和下一血条 同时再通过ResetToWidth或者ResetToZero修正尺寸即可

!Pasted image 20240327121516.png

!Pasted image 20240327122321.png

获取血条偏移值,是根据目标的Renderer渲染器使用Vector3.up配合bounds.max.y轴最大坐标向上偏移即可

!Pasted image 20240327124715.png

在Init初始化函数中调用上述各个函数对各个参数进行赋值初始化最终通过SetBarData设置当前血条数据索引即可

!Pasted image 20240327125144.png

血条的更新函数中,通过空间转换Camera.WorldToScreenPoint接口,让摄像头下,血条一直位于,目标实体的上方

!Pasted image 20240327125712.png

这个直升机会挂载控制血条相关的Controller逻辑

!Pasted image 20240327125348.png

对应的脚本逻辑在Start初始化函数中拿到Canvas画布调用SpwanLifeBar函数 是通过Resource.Load函数加载LifeBar血条预制体实例化出来然后弄一个颜色队列容器data其中包含绿、红、黄三种颜色 容器data传参到LifeBar实体的Init初始化函数而且设定最大生命值是350

!Pasted image 20240327125417.png

再弄一个Move函数是控制飞机移动的

!Pasted image 20240327125848.png

在控制脚本的Update更新函数中wasd按键是控制飞机移动的用来测试血条是否一直保持偏移在飞机正上方

!Pasted image 20240327125918.png

更新函数还有两个逻辑,是鼠标左右键,控制血条的增减逻辑

!Pasted image 20240327130004.png

运行游戏,按键,可以看到,表现正常

!Pasted image 20240327130042.png