Пример #1
0
        IEnumerator Shoot()
        {
            var trans  = GetAttr().transform;
            var enemy  = SkillLogic.FindNearestEnemy(trans.gameObject);
            var physic = GetAttr().GetComponent <GeneraPhysic>();

            Log.Sys("FindEnemyIs: " + enemy);
            if (enemy != null)
            {
                var dir = enemy.transform.position - trans.position;
                dir.y = 0;
                Log.Sys("EnemyIs: " + dir);
                //forward = dir;
                forward = tower.forward;

                //physic.TurnToImmediately(dir);
                physic.TurnTower(dir);
            }
            else
            {
                forward = trans.forward;
                physic.TurnTower(forward);
            }

            attackAniName = GetAttackAniName();

            /*
             * var realAttackTime = activeSkill.skillData.AttackAniTime / GetAttr().GetSpeedCoff();
             * var rate = GetAttr().animation [attackAniName].length / realAttackTime;
             * PlayAni(attackAniName, rate, WrapMode.Once);
             */
            yield return(GetAttr().StartCoroutine(WaitForAttackAnimation(GetAttr().GetComponent <Animation>())));

            yield return(new WaitForSeconds(0.1f));
        }
Пример #2
0
        /// <summary>
        /// 技能的朝向
        /// 攻击目标由服务器决定
        /// </summary>
        /// <param name="skillId"></param>
        /// <param name="skillLevel"></param>
        public static void FastUseSkill(int skillId, int skillLevel)
        {
            Log.Sys("FastUseSkill: " + skillId + " lev " + skillLevel);
            var sc = WorldManager.worldManager.GetActive();

            if (sc.IsNet && sc.CanFight)
            {
                var me  = ObjectManager.objectManager.GetMyPlayer();
                var pos = me.transform.position;
                var dir = (int)me.transform.localRotation.eulerAngles.y;

                /*
                 * var tower = me.GetComponent<TankPhysicComponent>().tower;
                 * if (tower == null)
                 * {
                 *  return;
                 * }
                 * var dir = (int)tower.transform.eulerAngles.y;
                 */


                var cg     = CGPlayerCmd.CreateBuilder();
                var skInfo = SkillAction.CreateBuilder();
                skInfo.Who        = ObjectManager.objectManager.GetMyServerID();
                skInfo.SkillId    = skillId;
                skInfo.SkillLevel = skillLevel;

                var ip = NetworkUtil.ConvertPos(pos);
                skInfo.X   = ip[0];
                skInfo.Y   = ip[1];
                skInfo.Z   = ip[2];
                skInfo.Dir = dir;

                /*
                 * if (skillId == 1)
                 * {
                 *  var attribute = me.GetComponent<NpcAttribute>();
                 *  skInfo.IsStaticShoot = attribute.GetStaticShootBuff();
                 * }
                 */

                var target   = SkillLogic.FindNearestEnemy(me);
                var targetId = 0;
                if (target != null)
                {
                    targetId = target.GetComponent <NpcAttribute>().GetNetView().GetServerID();
                }
                skInfo.Target = targetId;

                cg.SkillAction = skInfo.Build();
                cg.Cmd         = "Skill";
                //sc.BroadcastMsg(cg);
                sc.BroadcastKCP(cg);
            }
        }
Пример #3
0
        IEnumerator AdjustTower(NpcAttribute attr)
        {
            var passTime = 0.0f;
            var trans    = attr.transform;

            while (true)
            {
                var curDir = transform.forward;
                curDir.y = 0;
                var forwardDir = trans.forward;
                var diffDir    = Quaternion.FromToRotation(curDir, forwardDir);
                var diffY      = diffDir.eulerAngles.y;

                if (diffY > 180)
                {
                    diffY = diffY - 360;
                }
                if (diffY < -180)
                {
                    diffY = 360 + diffY;
                }

                var dy     = Mathf.Clamp(diffY, -maxRotateChange, maxRotateChange);
                var curRot = transform.rotation.eulerAngles.y;
                var tarDir = Quaternion.Euler(new Vector3(0, curRot + dy, 0));
                transform.rotation = tarDir;
                //yield return null;
                yield return(new WaitForFixedUpdate());

                if (Mathf.Abs(diffY) <= 0.1f)
                {
                    break;
                }

                passTime += Time.deltaTime;
                if (passTime >= 1)
                {
                    var tempEnemy = SkillLogic.FindNearestEnemy(trans.gameObject);
                    if (tempEnemy != null)
                    {
                        break;
                    }
                    passTime = 0;
                }
            }
        }
Пример #4
0
        //自适应炮塔调整
        IEnumerator AutoEnemy()
        {
            var attr  = NetworkUtil.GetAttr(gameObject);
            var phy   = attr.GetComponent <GeneraPhysic>();
            var trans = attr.transform;

            while (true)
            {
                var enemy = SkillLogic.FindNearestEnemy(trans.gameObject);
                if (enemy != null)
                {
                    yield return(StartCoroutine(AutoTarget(trans, enemy)));
                }
                else
                {
                    yield return(StartCoroutine(AdjustTower(attr)));
                }
                yield return(new WaitForSeconds(0.3f));
            }
        }
Пример #5
0
        //根据配置锁定目标 开火
        //最近攻击目标
        //目标惯性持续目标多久 目标脱离攻击范围多久仍然持续攻击
        //
        IEnumerator AutoTarget(Transform trans, GameObject enemy)
        {
            var attr     = trans.GetComponent <NpcAttribute>();
            var passTime = 0.0f;

            while (true)
            {
                var dir = enemy.transform.position - trans.position;
                dir.y = 0;
                var curDir = transform.forward;
                curDir.y = 0;
                var forwardDir = dir;
                var diffDir    = Quaternion.FromToRotation(curDir, forwardDir);
                var diffY      = diffDir.eulerAngles.y;

                if (diffY > 180)
                {
                    diffY = diffY - 360;
                }
                if (diffY < -180)
                {
                    diffY = 360 + diffY;
                }
                var dy     = Mathf.Clamp(diffY, -maxRotateChange, maxRotateChange);
                var curRot = transform.rotation.eulerAngles.y;
                var tarDir = Quaternion.Euler(new Vector3(0, curRot + dy, 0));
                transform.rotation = tarDir;
                yield return(new WaitForFixedUpdate());

                passTime += Time.deltaTime;
                if (passTime >= 1)
                {
                    var tempEnemy = SkillLogic.FindNearestEnemy(trans.gameObject);
                    if (tempEnemy != enemy)
                    {
                        break;
                    }
                    passTime = 0;
                }
            }
        }
Пример #6
0
 //TODO:后续做成全局Static函数  CommonAI 静态一次性函数
 //查找附近敌人不考虑方向
 GameObject NearestEnemy()
 {
     return(SkillLogic.FindNearestEnemy(GetAttr().gameObject));
 }