说一说关于ngui技能控制的问题,由于本人之前比较喜欢玩LOL所以想做一个关于LOL技能释放的简单功能,包括按qwer释放技能,冷却时间倒计时等一下简单粗暴的功能。照旧先看下效果吧。
哈哈,玩lol的人都知道这个的德玛的技能。不过第二张的有点不对,因为按照原本游戏来说4个技能是不能同时放的。这个只是为了让大家看得到遮罩倒计时效果特意放这张图的。本教程例子是会解决到这个问题(说得有点不清楚,大家可以忽略这段话)。下面就开始吧。
1、首先是素材:4个技能图标和一张mask图(ps下吧,只是一张纯色图)
2、接下来是通过NGUI制作ngui技能控制的ui。
把5张图片选中,打包成Atlas。然后我们制作一个Sprite是放技能图标的。Sprite下放一个Sprite(mask这种图)mask的Sprite我们需要设置下透明度,这样可以看到下面的技能UI。一个label(倒计时label)。把这三个重叠在一起。怎么制作就不多说了。去看siki老师的教程吧。
3、我们设置下maskSprite的Type类型为(如图),设置fill dir。大家改变下amout的值就知道为什么要这么做了,会有按比例去旋转(我不知这旋转怎么说,大家知道的话告诉我哈,语文老师是体育老师教的》。。。)。
4、label就不用多说了。然后我们复制一下,4个技能UI就完工了。(看着很漂亮是不是,哈哈哈哈哈)
5、下面是脚本部分了。我现在是功能是这样的。根据lol的按键,按下Q,W,E,R就释放相应的技能,但某一技能释放后其他技能就不能触发,不过也有例外,有时候有些是增加防御或者什么的技能可以同时释放。现在我就设计按下W键技能之后,也可以触发其他三个之一的技能,但按下Q,E,R的不能同时存在(不知天狼讲得清楚不?不清楚就反馈下)
6、首先一开始我的脚本是这样的
每个技能挂一个脚本,获取到mask的Sprite Script和Label的Script。然后当按下按键我们就调用每个技能的相应脚本
问题:当这样子的问题就出来了。我们可以想下,这4个技能的脚本基本上是一样的,我们相当于写了4个一样的类。我们能不能想办法只用一个类,然后每个技能都调用这个脚本呢。是可以的,看下面的脚本吧。
- using UnityEngine;
- using System.Collections;
- public class SKillUIManager : MonoBehaviour
- {
- //4个技能的类型
- public enum SkillType
- {
- BigMask,Defend,SweepAttack,KoAtttack
- }
- public PlayerSkillHandler skillHandlerScript;//这个脚步控制着技能的释放
- public SkillType skillType;//技能的类型
- public UISprite maskSpriteScript;//遮罩的sprite script
- public UILabel label;//显示冷却的时间倒计时
- private bool _isCooling=false;//是否冷却
- private bool _isSkill = false;//是否释放技能
- private float coolingTime;//冷却时间
- private float coolingTemp;//这个也是冷却时间,不过是临时的,变化的。用来设计倒计时
- public bool isSkill
- {
- set { _isSkill = value; }
- get { return _isSkill; }
- }
- public bool isCooling
- {
- set { _isCooling = value; }
- get { return _isCooling; }
- }
- void Start ()
- {
- //这里判断你的技能类型
- maskSpriteScript.fillAmount = 0;
- switch (skillType)
- {
- case SkillType.BigMask:
- coolingTime = 10;
- coolingTemp = 10;
- break;
- case SkillType.Defend:
- coolingTime = coolingTemp = 15;
- break;
- case SkillType.SweepAttack:
- coolingTime = coolingTemp = 20;
- break;
- case SkillType.KoAtttack:
- coolingTime = coolingTemp = 200;
- break;
- }
- label.gameObject.SetActive(false);
- }
- void Update ()
- {
- if(isSkill)
- {
- //释放了技能,技能进入冷却状态,判断是否冷却了,没有就设true
- if (!_isCooling)
- {
- //设置遮罩为1
- maskSpriteScript.fillAmount = 1.0f;
- _isCooling = true;
- label.gameObject.SetActive(true);
- }
- if (_isCooling)
- {
- //遮罩旋转效果
- maskSpriteScript.fillAmount -= (1.0f / coolingTime) * Time.deltaTime;
- //倒计时
- coolingTemp -= Time.deltaTime;
- label.text = "" + (int)coolingTemp;
- //到达接近0时。把一些变量设为初始值
- if(maskSpriteScript.fillAmount<=0.01f)
- {
- _isCooling = false;
- isSkill = false;
- coolingTemp = coolingTime;
- label.gameObject.SetActive(false);
- maskSpriteScript.fillAmount = 0;
- skillHandlerScript.isAttack = true;
- }
- }
- }
- }
- }</font>
-
- 这个脚本和上面的有什么区别呢,区别就再也多加了一个枚举类型。我们在Start方法里首先判断这个属于技能类型,那我们按下键盘后就会触发相应的技能,而且键盘类里只需要调用一个脚本的方法就可以实现释放4个技能。下面给大家看看技能键盘控制类
-
- <font style="color:rgb(102, 102, 102)">using UnityEngine;
- using System.Collections;
- public class PlayerSkillHandler : MonoBehaviour
- {
- public enum KeyCodes //键盘值码
- {
- KEY_Q,
- KEY_W,
- KEY_E,
- KEY_R,
- KEY_F,
- KEY_D,
- KEY_B,
- NULL
- }
- public KeyCodes currentKeyCode = KeyCodes.NULL;
- public GameObject bigAttack;
- public GameObject sweepAttack;
- public GameObject koAttack;
- public GameObject defend;
- private bool _isAttack=true;
- public bool isAttack
- {
- set { _isAttack = value; }
- get { return _isAttack; }
- }
- void Start ()
- {
- }
- void Update ()
- {
- if (Input.GetKeyDown(KeyCode.Q) )
- {
- UsedTheSkill(PlayerSkillHandler.KeyCodes.KEY_Q);
- }
- if (Input.GetKeyDown(KeyCode.W) )
- {
- UsedTheSkill(PlayerSkillHandler.KeyCodes.KEY_W);
- }
- if (Input.GetKeyDown(KeyCode.E))
- {
- UsedTheSkill(PlayerSkillHandler.KeyCodes.KEY_E);
- }
- if (Input.GetKeyDown(KeyCode.R) )
- {
- UsedTheSkill(PlayerSkillHandler.KeyCodes.KEY_R);
- }
- }
- /// <summary>
- /// 使用技能
- /// </summary>
- public void UsedTheSkill(KeyCodes currentKey)
- {
- currentKeyCode=currentKey;
- switch (currentKeyCode)
- {
- case KeyCodes.KEY_Q:
- //这里我们判断是否是冷却状态了,如果是就不能再触发
- if (bigAttack.GetComponent<SKillUIManager>().isCooling)
- return;
- //if(isAttack) 这里的意思是不要让他4个技能可以同时放,只要某个技能释放了,还没过冷却时间,其他技能就不能释放。第二个技能是例外的。
- //{
- //isAttack = false;
- //释放技能
- bigAttack.GetComponent<SKillUIManager>().isSkill = true;
- currentKeyCode = KeyCodes.NULL;
- print("释放Skill...Q");
- // }
- break;
- case KeyCodes.KEY_W:
- if (defend.GetComponent<SKillUIManager>().isCooling)
- return;
- currentKeyCode = KeyCodes.NULL;
- defend.GetComponent<SKillUIManager>().isSkill = true;
- print("释放Skill...W");
- break;
- case KeyCodes.KEY_E:
- if (sweepAttack.GetComponent<SKillUIManager>().isCooling)
- return;
- // if (isAttack)
- // {
- // isAttack = false;
- sweepAttack.GetComponent<SKillUIManager>().isSkill = true;
- currentKeyCode = KeyCodes.NULL;
- print("释放Skill...E");
- // }
- break;
- case KeyCodes.KEY_R:
- if (koAttack.GetComponent<SKillUIManager>().isCooling)
- return;
- // if(isAttack)
- // {
- // isAttack = false;
- koAttack.GetComponent<SKillUIManager>().isSkill = true;
- currentKeyCode = KeyCodes.NULL;
- print("释放Skill...R");
- // }
- break;
- default:
- break;
- }
- }
- }
5、我们把这个脚本挂载panel下,然后赋予参数
我们还要每个技能都挂一个SKillUIManager脚本
5、这样大家运行起来按下QWER之后就可以看到最前面那张图的效果了。
如果大家想实现在一个技能进入冷却状态有些技能不能同时触发可以把我键盘控制类里的脚本注释删除掉就可以实现了。
好了,这样这个模仿lol技能释放效果已经可以说是完成了。今天话有点多了,我也比较晕了。如果大家发现了什么问题的话即使提出来吧。