示例#1
0
    float AttackSelectTargetDis = 8;//攻击目标选择范围
    public void PressAttackBtn(int touchstate, Vector2 dir)
    {
        if (m_MyMainUnit == null)
        {
            return;
        }
        //AttackRange
        float showattackrange = AttackSelectTargetDis;

        if (m_MyMainUnit.AttackRange > showattackrange)
        {
            showattackrange = m_MyMainUnit.AttackRange;
        }

        if (touchstate == 1)
        {
            if (m_TargetUnit == null)
            {
                m_TargetUnit = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange);
                if (m_TargetUnit == null)
                {
                    m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit);
                }
            }
            else
            {
                m_TargetUnit.TargetShow(false);
                m_TargetUnit.TargetShowRedCircle(false);

                if (UnityEntityManager.Instance.CheckIsEnemy(m_TargetUnit, m_MyMainUnit) == false)
                {
                    m_TargetUnit = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange);
                    if (m_TargetUnit == null)
                    {
                        m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit);
                    }
                }

                //不在范围内都重新寻找
                //如果是普通单位且不在寻找攻击范围内 则重新寻找最近单位
                var dis = Vector2.Distance(new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y), new Vector2(m_TargetUnit.X, m_TargetUnit.Y));
                if (showattackrange < dis)
                {
                    m_TargetUnit = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange);
                    if (m_TargetUnit == null)
                    {
                        m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit);
                    }
                }
                else
                {
                    //单位类型(1:英雄 2:普通单位 3:远古 4:boss)
                    //如果不是大仇恨敌方单位
                    if (m_TargetUnit.IsBigUnit() == false)
                    {
                        var bigenemy = UnityEntityManager.Instance.GetNearestBigEnemy(m_MyMainUnit, showattackrange);
                        if (bigenemy != null)
                        {
                            m_TargetUnit = bigenemy;
                        }
                        else
                        {
                            //不在攻击范围内
                            if (m_MyMainUnit.AttackRange < dis)
                            {
                                m_TargetUnit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit);
                            }
                        }
                    }
                }
            }

            if (m_TargetUnit == null)
            {
                return;
            }

            m_TargetUnit.TargetShow(true);
            m_TargetUnit.TargetShowRedCircle(true);
            m_MyMainUnit.ShowSkillAreaLookAt(true, new Vector2(m_TargetUnit.X, m_TargetUnit.Y));
            m_MyMainUnit.ShowOutCircle(true, showattackrange);
        }
        else if (touchstate == 2)
        {
            var target = UnityEntityManager.Instance.GetMinAngleEnemy(m_MyMainUnit, dir, showattackrange);
            if (target != null)
            {
                if (m_TargetUnit != null)
                {
                    m_TargetUnit.TargetShow(false);
                    m_TargetUnit.TargetShowRedCircle(false);
                }
                m_TargetUnit = target;
                m_TargetUnit.TargetShow(true);
                m_TargetUnit.TargetShowRedCircle(true);

                var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * showattackrange);

                //m_MyMainUnit.ShowSkillAreaLookAt(true, new Vector2(m_TargetUnit.X, m_TargetUnit.Y));
                m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos);
            }
            else
            {
                if (m_TargetUnit != null)
                {
                    m_TargetUnit.TargetShow(true);
                    m_TargetUnit.TargetShowRedCircle(true);
                    var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * showattackrange);
                    m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos);
                }
            }
        }
        else if (touchstate == 3)
        {
            if (m_TargetUnit == null)
            {
                return;
            }

            Protomsg.CS_PlayerAttack msg1 = new Protomsg.CS_PlayerAttack();
            msg1.IDs.AddRange(m_MyControlUnit);
            msg1.TargetUnitID = m_TargetUnit.ID;
            MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerAttack", msg1);

            NextAutoAttackTime = 1;

            //Debug.Log("PressAttackBtn");

            m_TargetUnit.TargetShow(false);
            m_MyMainUnit.ShowOutCircle(false, 10);
            m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero);
        }

        return;
    }
示例#2
0
    public void PressSkillBtn(int touchstate, Vector2 dir, Protomsg.SkillDatas skilldata, bool isno, bool ismy)
    {
        if (m_MyMainUnit == null)
        {
            return;
        }

        float showattackrange = AttackSelectTargetDis;

        if (skilldata.CastRange > showattackrange)
        {
            showattackrange = skilldata.CastRange;
        }



        //CastTargetType 施法目标类型 1:自身为目标 2:以单位为目标 3:以地面1点为目标
        //4:攻击时自动释放(攻击特效)5:以地面一点为方向
        if (touchstate == 1)
        {
            //第一次选择目标
            if (m_TargetUnit == null)
            {
                m_TargetUnit = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange);
                if (m_TargetUnit == null)
                {
                    m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata);
                }
            }
            else
            {
                m_TargetUnit.TargetShow(false);
                m_TargetUnit.TargetShowRedCircle(false);

                if (UnityEntityManager.Instance.CheckCastSkillTarget(m_TargetUnit, m_MyMainUnit, skilldata) == false)
                {
                    var target1 = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange);
                    //m_TargetUnit = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange);
                    if (target1 == null)
                    {
                        target1 = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata);
                    }
                    if (target1 != null)
                    {
                        m_TargetUnit = target1;
                    }
                }

                //不在范围内都重新寻找
                //如果是普通单位且不在寻找攻击范围内 则重新寻找最近单位
                var dis = Vector2.Distance(new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y), new Vector2(m_TargetUnit.X, m_TargetUnit.Y));
                if (showattackrange < dis)
                {
                    m_TargetUnit = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange);
                    if (m_TargetUnit == null)
                    {
                        m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata);
                    }
                }
                else
                {
                    //单位类型(1:英雄 2:普通单位 3:远古 4:boss)
                    //如果不是大仇恨敌方单位
                    if (m_TargetUnit.IsBigUnit() == false)
                    {
                        var bigenemy = UnityEntityManager.Instance.GetNearestBigUnitForSkillTarget(m_MyMainUnit, skilldata, showattackrange);
                        if (bigenemy != null)
                        {
                            m_TargetUnit = bigenemy;
                        }
                        else
                        {
                            //不在攻击范围内
                            if (skilldata.CastRange < dis)
                            {
                                m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata);
                            }
                        }
                    }
                }
            }



            switch (skilldata.CastTargetType)
            {
            case 4:
                Protomsg.CS_PlayerSkill msg4 = new Protomsg.CS_PlayerSkill();
                msg4.ID           = m_MyMainUnit.ID;
                msg4.TargetUnitID = 0;
                msg4.X            = 0;
                msg4.Y            = 0;
                msg4.SkillID      = skilldata.TypeID;
                MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg4);
                break;

            case 1:
                if (skilldata.HurtRange > 0.1)
                {
                    m_MyMainUnit.ShowOutCircle(true, skilldata.HurtRange);
                }
                break;

            case 2:
                if (m_TargetUnit == null)
                {
                    m_TargetUnit = UnityEntityManager.Instance.GetNearestUnitForSkillTarget(m_MyMainUnit, skilldata);
                    if (m_TargetUnit == null)
                    {
                        return;
                    }
                }
                m_TargetUnit.TargetShow(true);
                m_TargetUnit.TargetShowRedCircle(true);
                m_MyMainUnit.ShowSkillAreaLookAt(true, new Vector2(m_TargetUnit.X, m_TargetUnit.Y));
                //m_MyMainUnit.ShowOutCircle(true, skilldata.CastRange);
                break;

            case 3:
            {
                var targetPos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y);
                if (m_TargetUnit != null)
                {
                    targetPos = new Vector2(m_TargetUnit.X, m_TargetUnit.Y);
                }
                else
                {
                    //进攻性技能
                    var skillclientitem = ExcelManager.Instance.GetSkillManager().GetSkillByID(skilldata.TypeID);
                    if (skillclientitem != null)
                    {
                        //技能自动瞄准类型 1:普通 2:位移技能(朝目标方向最大距离) 3:进攻技能(瞄准敌人)
                        if (skillclientitem.AutoAimType == 3)
                        {
                            var targetunit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit);
                            if (targetunit != null)
                            {
                                targetPos = new Vector2(targetunit.X, targetunit.Y);
                            }
                        }
                        else if (skillclientitem.AutoAimType == 2)
                        {
                            var targetDir = new Vector2(m_MyMainUnit.DirectionX, m_MyMainUnit.DirectionY);
                            targetPos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (targetDir.normalized * skilldata.CastRange);
                        }
                    }
                }
                m_MyMainUnit.ShowInCircle(true, skilldata.HurtRange, new Vector3(targetPos.x - m_MyMainUnit.X, 0, targetPos.y - m_MyMainUnit.Y));

                break;
            }

            case 5:
            {
                var targetDir = new Vector2(m_MyMainUnit.DirectionX, m_MyMainUnit.DirectionY);
                if (m_TargetUnit != null)
                {
                    targetDir = new Vector2(m_TargetUnit.X - m_MyMainUnit.X, m_TargetUnit.Y - m_MyMainUnit.Y);
                }
                else
                {
                    //进攻性技能
                    var skillclientitem = ExcelManager.Instance.GetSkillManager().GetSkillByID(skilldata.TypeID);
                    if (skillclientitem != null)
                    {
                        //技能自动瞄准类型 1:普通 2:位移技能(朝目标方向最大距离) 3:进攻技能(瞄准敌人)
                        if (skillclientitem.AutoAimType == 3)
                        {
                            var targetunit = UnityEntityManager.Instance.GetNearestEnemy(m_MyMainUnit);
                            if (targetunit != null)
                            {
                                targetDir = new Vector2(targetunit.X - m_MyMainUnit.X, targetunit.Y - m_MyMainUnit.Y);
                            }
                        }
                        else if (skillclientitem.AutoAimType == 2)
                        {
                        }
                    }
                }
                var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (targetDir.normalized * skilldata.CastRange);
                //m_MyMainUnit.ShowInCircle(true, 1, new Vector3(targetPos.x - m_MyMainUnit.X, 0, targetPos.y - m_MyMainUnit.Y));
                m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos);
                break;
            }
            }
            if (skilldata.CastRange > 0.1)
            {
                m_MyMainUnit.ShowOutCircle(true, skilldata.CastRange);
            }
        }
        else if (touchstate == 2)
        {
            switch (skilldata.CastTargetType)
            {
            case 1:
                break;

            case 2:
                var target = UnityEntityManager.Instance.GetMinAngleUnitForSkillTarget(m_MyMainUnit, dir, skilldata);
                if (target != null)
                {
                    if (m_TargetUnit != null)
                    {
                        m_TargetUnit.TargetShow(false);
                        m_TargetUnit.TargetShowRedCircle(false);
                    }
                    m_TargetUnit = target;
                    m_TargetUnit.TargetShow(true);
                    m_TargetUnit.TargetShowRedCircle(true);

                    var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * skilldata.CastRange);

                    m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos);
                }
                else
                {
                    if (m_TargetUnit != null)
                    {
                        m_TargetUnit.TargetShow(true);
                        m_TargetUnit.TargetShowRedCircle(true);
                        var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * skilldata.CastRange);
                        m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos);
                    }
                }
                break;

            case 3:
            {
                if (m_TargetUnit != null)
                {
                    m_TargetUnit.TargetShow(false);
                    m_TargetUnit.TargetShowRedCircle(false);
                    m_TargetUnit = null;
                }
                m_MyMainUnit.ShowInCircle(true, skilldata.HurtRange, new Vector3(dir.x, 0, dir.y));
            }

            break;

            case 5:
            {
                if (m_TargetUnit != null)
                {
                    m_TargetUnit.TargetShow(false);
                    m_TargetUnit.TargetShowRedCircle(false);
                    m_TargetUnit = null;
                }
                var targetpos = new Vector2(m_MyMainUnit.X, m_MyMainUnit.Y) + (dir.normalized * skilldata.CastRange);

                m_MyMainUnit.ShowSkillAreaLookAt(true, targetpos);
                //m_MyMainUnit.ShowInCircle(true, 1, new Vector3(dir.x, 0, dir.y));
            }

            break;
            }
            if (skilldata.CastRange > 0.1)
            {
                m_MyMainUnit.ShowOutCircle(true, skilldata.CastRange);
            }
        }
        else if (touchstate == 3)
        {
            if (isno == true)
            {
                if (m_TargetUnit != null)
                {
                    m_TargetUnit.TargetShow(false);
                }
                m_MyMainUnit.ShowOutCircle(false, 10);
                m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero);
                m_MyMainUnit.ShowInCircle(false, 1, new Vector3(0, 0, 0));
                return;
            }
            if (ismy == true)
            {
                Protomsg.CS_PlayerSkill msgmy = new Protomsg.CS_PlayerSkill();
                msgmy.ID           = m_MyMainUnit.ID;
                msgmy.TargetUnitID = m_MyMainUnit.ID;
                msgmy.X            = 0;
                msgmy.Y            = 0;
                msgmy.SkillID      = skilldata.TypeID;
                MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msgmy);

                if (m_TargetUnit != null)
                {
                    m_TargetUnit.TargetShow(false);
                }
                m_MyMainUnit.ShowOutCircle(false, 10);
                m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero);
                m_MyMainUnit.ShowInCircle(false, 1, new Vector3(0, 0, 0));
                return;
            }
            switch (skilldata.CastTargetType)
            {
            case 1:
                Protomsg.CS_PlayerSkill msg2 = new Protomsg.CS_PlayerSkill();
                msg2.ID           = m_MyMainUnit.ID;
                msg2.TargetUnitID = 0;
                msg2.X            = 0;
                msg2.Y            = 0;
                msg2.SkillID      = skilldata.TypeID;
                MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg2);
                m_MyMainUnit.ShowOutCircle(false, 10);

                Debug.Log("CS_PlayerSkill 1111");
                break;

            case 2:
                if (m_TargetUnit == null)
                {
                    return;
                }

                Protomsg.CS_PlayerSkill msg1 = new Protomsg.CS_PlayerSkill();
                msg1.ID           = m_MyMainUnit.ID;
                msg1.TargetUnitID = m_TargetUnit.ID;
                msg1.X            = 0;
                msg1.Y            = 0;
                msg1.SkillID      = skilldata.TypeID;
                MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg1);

                Debug.Log("CS_PlayerSkill");
                m_TargetUnit.TargetShow(false);
                m_MyMainUnit.ShowOutCircle(false, 10);
                m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero);
                break;

            case 3:
            {
                var targetPos = new Vector2(m_MyMainUnit.X + dir.x, m_MyMainUnit.Y + dir.y);
                if (m_TargetUnit != null)
                {
                    targetPos = new Vector2(m_TargetUnit.X, m_TargetUnit.Y);
                }

                Protomsg.CS_PlayerSkill msg3 = new Protomsg.CS_PlayerSkill();
                msg3.ID           = m_MyMainUnit.ID;
                msg3.TargetUnitID = -1;
                //msg3.X = targetPos.x;
                //msg3.Y = targetPos.y;
                msg3.X = m_MyMainUnit.m_SkillAreaInCircleOffsetPos.x + m_MyMainUnit.X;
                msg3.Y = m_MyMainUnit.m_SkillAreaInCircleOffsetPos.z + m_MyMainUnit.Y;

                msg3.SkillID = skilldata.TypeID;
                MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg3);

                Debug.Log("CS_PlayerSkill");
                m_MyMainUnit.ShowOutCircle(false, 10);
                m_MyMainUnit.ShowInCircle(false, skilldata.HurtRange, new Vector3(dir.x, 0, dir.y));
                m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero);
            }

            break;

            case 5:
            {
                var targetPos = new Vector2(m_MyMainUnit.X + dir.x, m_MyMainUnit.Y + dir.y);
                if (m_TargetUnit != null)
                {
                    targetPos = new Vector2(m_TargetUnit.X, m_TargetUnit.Y);
                }

                Protomsg.CS_PlayerSkill msg3 = new Protomsg.CS_PlayerSkill();
                msg3.ID           = m_MyMainUnit.ID;
                msg3.TargetUnitID = -1;
                //msg3.X = targetPos.x;
                //msg3.Y = targetPos.y;
                msg3.X       = m_MyMainUnit.m_SkillAreaLookAtDir.x + m_MyMainUnit.X;
                msg3.Y       = m_MyMainUnit.m_SkillAreaLookAtDir.z + m_MyMainUnit.Y;
                msg3.SkillID = skilldata.TypeID;
                MyKcp.Instance.SendMsg(m_ServerName, "CS_PlayerSkill", msg3);

                Debug.Log("CS_PlayerSkill");
                m_MyMainUnit.ShowOutCircle(false, 10);
                m_MyMainUnit.ShowInCircle(false, 1, new Vector3(0, 0, 0));
                m_MyMainUnit.ShowSkillAreaLookAt(false, Vector2.zero);
            }

            break;
            }
        }

        return;
    }