实现LOL游戏中英雄技能的释放

今天咱们要实现的是LOL中英雄技能的释放,当鼠标点击该技能或者按下表明该技能的按键时,出现技能的攻击范围圈,以及只能指示(线性指示或者范围圈指示等),在这里演示的为非指定向技能,也就是能够在范围内随意释放,没必要对着敌方英雄释放的技能,用法同样,难点就是如何在一个脚本中区分各个按键的释放,在这里使用的是一个 bool开关,详细代码参照以下:web

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<UnityEngine.UI.Image>().fillAmount = CD_Q * 1f / 5;

                //让图片下的文本组件的内容为处于变化中的CD的数字,实现倒计时的效果
                GameObject.Find("Q_Top").GetComponent<UnityEngine.UI.Image>().transform.FindChild("Text").GetComponent<UnityEngine.UI.Text>().text = CD_Q.ToString();
                if (CD_Q <= 0)//当CD转完(由于每一帧的不稳定性所以加上小于号以避免出问题)
                {
                    Q = false;//关闭Q的入口
                    CD_Q = 5;//让CD从新等于5
                    CD_Q_Open = false;//把倒计时开关关闭
                    GameObject.Find("Q_Top").GetComponent<UnityEngine.UI.Image>().transform.FindChild("Text").GetComponent<UnityEngine.UI.Text>().text = null;//倒计时的数字消失
                }
            }
        }
        IEnumerator hideSkill_Q()//协程实现Q的延迟存在
        {
            yield return new WaitForSeconds(1.5f);//等待1.5秒
            Skill_Q.SetActive(false);//让技能释放消失
        }

        public void Open_Q()//拓展方法:实现鼠标点击该技能也能实现操做,绑定在该技能的button上
        {
            if (AttackCircle_Q.activeSelf == false)//若果Q的范围圈没有打开
            {
                AttackCircle_Q.SetActive(true);//打开
                SkillCircle_Q.SetActive(true);//打开攻击范围圈
                Q = true;//得到Q的入口
            }
       }

先展现一下UI界面,须要了解的是该技能为一张图片,上方复制并粘贴了一个图片并添加了button组件,且将上方的图片改成 Fillde 图片类型,同时 Fill Method 类型为Radial 360 ,在 button 组件上绑定以上的脚本的方法 Open_Q()。
技能展现ide

这里展现了Q技能的释放,正在旋转的技能指示器须要本身绑定一个旋转的脚本,把技能指示器、技能释放效果、技能范围圈都一开始设置为不激活状态,其余技能按照这个模板编写即可达到同样的效果:
技能释放
鼠标也能进行操做:
鼠标释放
好啦!技能的释放就介绍到这里啦~~我是博主小磊,欢迎关注、分享、留言给我哦!!svg