unity3D学习中NGUI多技能冷却制作.docx
《unity3D学习中NGUI多技能冷却制作.docx》由会员分享,可在线阅读,更多相关《unity3D学习中NGUI多技能冷却制作.docx(4页珍藏版)》请在冰豆网上搜索。
![unity3D学习中NGUI多技能冷却制作.docx](https://file1.bdocx.com/fileroot1/2023-2/1/4d20c2e6-ffa6-4e5e-8010-35970e5e00f9/4d20c2e6-ffa6-4e5e-8010-35970e5e00f91.gif)
unity3D学习中NGUI多技能冷却制作
技能是游戏的一个重要组成部分,例如下图,现在很多手机游戏都需要用到技能效果,现在我给大家讲讲用NGUI制做技能冷却的效果。
一般技能由技能栏,技能图标和冷却遮罩组成,我们需要自己准备一下相应的图集
1.新建一个UIRoot2D,在下面新建一个空对象,更名为“Skill”,用来存放所有的技能。
2.新建一个sprite作为我们的技能栏,也就是技能背景,更名为“Skill_Kill”。
3.新建一个sprite作为我们的技能图标,更名为“Kill”。
4.新建一个sprite作为我们的冷却遮罩,更名为“Kill_CoolinMask”,Type选择Filled,FillDir是我们遮罩的类型,默认是Radial360,其他类型也可以用,大家可以自己试一试,点击ColorTint调节透明度,我这里是用145的透明度,让冷却遮罩在冷却时也可以看到技能,大家可以根据自己的需求自己设置。
冷却遮罩最重要的一个属性是FillAmoun,当他为0时,遮罩不会显示,当他为1时,遮罩会完全显示,我们默认他为0不显示遮罩,现在大家应该知道他的作用了吧。
文章来自【狗刨学习网】
5.根据步骤4再做一个其他技能,一般我们都是把技能放在屏幕的右下角并设置好锚,如下图
6.好了,UI我们做完了,现在我们新建一个脚本“Skill”,我们把它绑定到所有技能的父对象“Skill”上,在这里我把脚本贴出来
usingUnityEngine;
usingSystem.Collections;
publicclassSkill:
XMBaseMonoBehaviour{
//冷却时间
publicfloatm_coolTime=2f;
//是否正在冷却
publicboolm_isLightningCooling=false;
publicboolm_isKillCooling=false;
//是否按下
publicboolisDownLightning=false;
publicboolisDownkill=false;
//技能
GameObjectm_go_skill_lightning;
GameObjectm_go_skill_kill;
//冷却遮罩
GameObjectm_go_Lightning_coolMask;
UISpritem_spr_Lightning_coolMask;
GameObjectm_go_Kill_CoolingMask;
UISpritem_spr_Kill_CoolingMask;
//绑定控件
protectedoverridevoidXMAwake()
{
base.XMAwake();
//技能
Bind(refm_go_skill_lightning,"Skill_Lightning");
UIEventListener.Get(m_go_skill_lightning).onClick=OpenSkill_Lightning;
Bind(refm_go_skill_kill,"Skill_Kill");
UIEventListener.Get(m_go_skill_kill).onClick=OpenSkill_Kill;
//冷却遮罩
Bind(refm_go_Lightning_coolMask,"Lightning_CoolingMask");
m_spr_Lightning_coolMask=m_go_Lightning_coolMask.GetComponent();
Bind(refm_go_Kill_CoolingMask,"Kill_CoolingMask");
m_spr_Kill_CoolingMask=m_go_Kill_CoolingMask.GetComponent();
}
//打开必杀技能
privatevoidOpenSkill_Kill(GameObjectgo)
{
//开启按下技能的状态
isDownkill=true;
}
//打开闪电技能
privatevoidOpenSkill_Lightning(GameObjectgo)
{
isDownLightning=true;
}
//Usethisforinitialization
voidStart(){
}
//Updateiscalledonceperframe
voidUpdate(){
if(isDownkill)
{
Skill_Kil();
}
if(isDownLightning)
{
Skill_Lightning();
}
}
//闪电技能
voidSkill_Lightning()
{
//如果没有进入冷却状态,就打开冷却状态
if(!
m_isLightningCooling)
{
m_spr_Lightning_coolMask.fillAmount=1f;
m_isLightningCooling=true;
}
//如果进入冷却状态,冷却遮罩就随设定的时间减少
if(m_isLightningCooling)
{
//减少冷却遮罩
m_spr_Lightning_coolMask.fillAmount-=(1f/m_coolTime)*Time.deltaTime;
//当冷却遮罩快没有的时候,关闭冷却遮罩,并且退出按下技能的状态
if(m_spr_Lightning_coolMask.fillAmount<=0.01f)
{
m_isLightningCooling=false;
m_spr_Lightning_coolMask.fillAmount=0;
isDownLightning=false;
}
}
}
//必杀技能
voidSkill_Kil()
{
if(!
m_isKillCooling)
{
m_spr_Kill_CoolingMask.fillAmount=1f;
m_isKillCooling=true;
}
if(m_isKillCooling)
{
m_spr_Kill_CoolingMask.fillAmount-=(1f/m_coolTime)*Time.deltaTime;
if(m_spr_Kill_CoolingMask.fillAmount<=0.01f)
{
m_isKillCooling=false;
m_spr_Kill_CoolingMask.fillAmount=0;
isDownkill=false;
}
}
}
}
运行点击技能,效果如下
注:
脚本中的protectedoverridevoidXMAwake方法是重写我自己写的另一个脚本,用来绑定控件,避免了拖拽,当然你也可以把对象引用改为public,用拖拽的方式进行实例。
之前的代码我是用枚举来判断按下技能的类型和一个是否按下的布尔类型来判断是否按下,结果只能实现单技能的冷却遮罩,经过修改代码总结每一个技能都需要两个布尔类型的变量来判断,即是否按下,是否冷却。
其实之前写的脚本也可以用,只不过每一个技能都需要绑定该脚本,作为程序员怎么可以容忍这种事情发生了,万一有千千万个技能呢,哈哈开玩笑的!