今天我们要实现的是LOL中英雄技能的释放,当鼠标点击该技能或者按下代表该技能的按键时,出现技能的攻击范围圈,以及只能指示(线性指示或者范围圈指示等),在这里演示的为非指定向技能,也就是可以在范围内随意释放,不必对着敌方英雄释放的技能,用法一样,难点就是如何在一个脚本中区分各个按键的释放,在这里使用的是一个 bool开关,详细代码参照如下:
public GameObject AttackCircle_Q; //传入攻击范围
public GameObject AttackCircle_W;
public GameObject AttackCircle_E;
public GameObject AttackCircle_R;
public GameObject SkillCircle_Q;//传入技能指示圈
public GameObject SkillCircle_W;
public GameObject SkillCircle_E;
public GameObject SkillCircle_R;
public GameObject Skill_Q;//传入Q技能的释放效果
public GameObject Skill_W;
public GameObject Skill_E;
bool Q = false;//进入Q技能生效的条件
bool W = false;
bool E = false;
bool R = false;
float CD_Q = 5;//Q的CD计时器
bool CD_Q_Open = false;//进入Q计时器的条件
void Update () {
RaycastHit hit;//射线点
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//获取鼠标位置 从主摄像机发出射线
Physics.Raycast(ray, out hit, 1000);//得到hit值(时刻检测射线的射点)
//获取Q键 且Q 的CD状态为满,否则按下Q则不生效(可在else设计提示该技能未准备完毕的提示)
if (Input.GetKeyDown(KeyCode.Q) && CD_Q == 5)
{
if (AttackCircle_Q.activeSelf == false)//若果Q的攻击范围圈没有打开
{
AttackCircle_Q.SetActive(true);//打开攻击范围圈
SkillCircle_Q.SetActive(true);//打开技能指示圈
Q = true;//Q的入口开放(按下Q只能激活Q的入口)
}
}
if (Q==true )//Q的入口打开
{
if (SkillCircle_Q.activeSelf == true)//如果技能指示圈打开
{
//改变技能圈的位置为鼠标的位置,调整一下Y轴位置即可
SkillCircle_Q.transform.position = new Vector3(hit.point.x, 0.4f, hit.point.z);
}
if (Input.GetMouseButtonDown(1) && SkillCircle_Q.activeSelf == true)//如果鼠标右键按下(取消释放)
{
AttackCircle_Q.SetActive(false);//攻击范围圈关闭
SkillCircle_Q.SetActive(false);//技能指示圈关闭
}
if (Input.GetMouseButtonDown(0) && SkillCircle_Q.activeSelf == true)//如果左键按下(可在此时判定伤害等操作)
{
CD_Q_Open = true; //CD计时器开始倒数
AttackCircle_Q.SetActive(false);//攻击范围圈关闭
SkillCircle_Q.SetActive(false);//技能指示圈关闭
Skill_Q.transform.position = SkillCircle_Q.transform.position;//改变技能释放效果的位置
Skill_Q.SetActive(true);//激活释放效果
StartCoroutine(hideSkill_Q());//让技能通过协程存在一段时间后失活
}
if (CD_Q_Open == true)//计时器开始运行
{
CD_Q -= Time.deltaTime;//开始减实时时间
//让CD的时间在总CD的比例等于覆盖在技能栏上方的另一张图片改变其fillAmount值实现冷却中转圈的效果
GameObject.Find("Q_Top").GetComponent().fillAmount = CD_Q * 1f / 5;
//让图片下的文本组件的内容为处于变化中的CD的数字,实现倒计时的效果
GameObject.Find("Q_Top").GetComponent().transform.FindChild("Text").GetComponent().text = CD_Q.ToString();
if (CD_Q |