【前言】
前两篇文章发布了几天,收获了2个赞,虽然很少,但也给了继续更新的动力,如果你刷到这篇文章且觉得不错的话,拜托点个赞让更多的人看到,感谢!
【着手制作简单的战斗】
目前为止,我们已经学会了如何使用按钮,如果我们的战斗方式只是简单的点击怪物,怪物就会扣血,当血量为0时,怪物就会死亡,除了生命条,其他的功能目前我们所学的知识是不是已经可以实现了?动手~
本期素材自取:
链接:https://pan.baidu.com/s/1iIDziENVV0VUOq8zLdVEOQ
提取码:4141
1、将素材导入UI工程,右键素材设置为导出 (为什么之前的背景图和按钮不需要设置为导出呢?因为之前的两张图在LobbyPanel中有使用到,而LobbyPanel本身已经选择了导出,就不需要再设置图片资源的导出了,这边怪物的三张图我们需要用到代码添加,所以要手动选择一下导出)
2、制作一个生命条(这边要用到一个新的控件,叫做进度条)
在Widgets文件夹下创建一个进度条,取名为HpBar,参数如下
创建完之后把他自带的两个东西给删掉,不要他生成的,我们自己做,然后将尺寸改为400*40
这边会用到图形工具,在HpBar内部创建2个,一个用于作底图(白色),一个用于做生命(红色,红色的需要取名为bar否则不会生效)
选中图形,在右侧可以更改颜色
做完后的效果如图
点击测试按钮(快捷键:F5)可以看到半血时的展示效果~ 搞定
3、制作一个怪物按钮(这边会用到一个新的控件,叫做装载器,在新建的怪物按钮内创建一个装载器,取名叫做icon)
装载器:简单理解就是用来放置图片资源的
点击生成的icon ,将一个怪物的图片资源拖拽至URL区域
再将上一步做好的HpBar拖到Monsterbtn中,取名为hpBar
怪物按钮别忘记了:①设置按下效果②删除创建时自带的控制器
怪物按钮制作完成~
将制作完成的怪物按钮拖到LobbyPanel下(上一期做的blueBtn和numTxt可以先删除掉了,代码记得回头一起删了,不然会报错),如图
UI完成,别忘了点击发布~
4、回到Unity,打开Main脚本,开始撸代码(上一期写的代码可以删了,咱们重头写)
首先明确咱们的需求:
①共三只怪物,第一只死亡时切换为第二只,直到击败全部三只
②三只怪物的血量分别为10、20、30
③每次点击造成3点伤害
代码如下:
using FairyGUI;
using UnityEngine;
public class Main : MonoBehaviour
{
private GButton _monsterBtn; //怪物按钮,定义在这边方便在不同的方法代码块中使用
private GProgressBar _hpBar; //血条,定义在这边方便在不同的方法代码块中使用
private int[] _monsterHp; //用于存放怪物的血量
private int _curMonsterIndex; //当前的怪物
private int _clickDamage; //点击时造成的伤害
// Start方法在启动Unity的调试时会调用,因此我们只要把我们的代码写在这里面即可
void Start()
{
GRoot.inst.SetContentScaleFactor(720, 1280); //设置我们游戏的尺寸
UIPackage.AddPackage("Assets/RawResources/UIPanels/LobbyBasis"); //加载我们的UI资源包,这边加载的就是提前做好的LobbyBasis包
GComponent panel = UIPackage.CreateObject("LobbyBasis", "LobbyPanel").asCom; //加载完包就可以获取包内的资源了,这边获取到LobbyPanel
GRoot.inst.AddChild(panel); //把LobbyPanel添加到舞台中
_monsterBtn = panel.GetChild("monsterBtn").asButton; //从LobbyPanel中获取到怪物按钮
_monsterBtn.onClick.Add(OnClickMonster); //添加点击怪物按钮时的监听方法
_hpBar = _monsterBtn.GetChild("hpBar").asProgress; //从怪物按钮上获取到血条
InitGame(); //初始化游戏信息
}
//游戏初始化(在这边初始化游戏的怪物数据等)
private void InitGame()
{
_curMonsterIndex = 0; //当前的怪物设置为0(就是第一只)
_monsterHp = new[] {10, 20, 30}; //三只怪物分别的血量
_clickDamage = 3; //设置每次点击时的伤害
RenderMonster(); //刷新当前的怪物
}
//刷新怪物
private void RenderMonster()
{
_hpBar.max = _monsterHp[_curMonsterIndex]; //设置血条上限为第一只怪物的总血量
_hpBar.min = 0; //设置血条最小值为0
_hpBar.value = _monsterHp[_curMonsterIndex]; //设置当前血量,一开始是满血
_monsterBtn.icon = "ui://LobbyBasis/monster00" + (_curMonsterIndex + 1); //当前怪物对应的图片资源路径
}
private void OnClickMonster()
{
//每次点击时,根据伤害进行扣血,如果扣完之后剩余0点血,就换下一只,如果没有下一只了就结束
_hpBar.value = _hpBar.value - _clickDamage;
if (_hpBar.value <= 0)
{
//如果还有下一只怪物,就切换到下一只
if (_curMonsterIndex + 1 < _monsterHp.Length)
{
_curMonsterIndex = _curMonsterIndex + 1;
RenderMonster();//刷怪
}
//否则就结束
else
{
//简单处理一下,没怪了就隐藏掉按钮
_monsterBtn.visible = false;
}
}
}
}
运行看看效果:
OK 完全与咱们的需求效果一致,搞定
本篇本章开始会在文末整理一下文章中用到的东西
来回顾一下本期用到的东西:
①GprogressBar:FariyGUI中的进度条工具,使用的场景一般为血条、经验条、游戏过场加载进度条使用起来很简单,设置好max和min之后,只要在合适的实际更改value值即可
②Gbutton:FariyGUI中的按钮工具,在按钮中的装载器(GLoader)控件要取名为icon,是因为这样就可以在代码上很方便的修改按钮内的图片(btn.icon= "资源路径"),否则你就得先使用GetChild获取到按钮下的GLoader控件才能够更改图片资源,进度条中的bar也是类似的原因,当你修改value值时就会立刻看到进度条的变化。
③GLoader:与其他控件类似,FariyGUI中的控件都是以G开头,GLoaderFariyGUI中的装载器,一般用于装载一张图片,你只要修改loader.icon即可,使用场景很多,使用起来也很简单
目前功能还很简单,但我们已经有了一个雏形了,接下来就是往里面加东西,不过目前所有的代码都写在了一个脚本文件里,这显然是不好的,近近期还是会以熟悉FariyGUI的控件为主,另外把我们的框架给慢慢搭起来
在实际操作过程中遇上任何问题,欢迎加入讨论Q群46791957找我或站内私信我,有看到都会回复!
都看到这了,点个赞加个关注收个藏吧,感谢!
下篇文章见~