Пример #1
0
        public override void EnterState()
        {
            base.EnterState();
            cmd = aiCharacter.lastCmd;
            aiCharacter.blackboard[AIParam.SkillCmd] = new AIEvent()
            {
                cmd = cmd.proto
            };

            var target       = cmd.skillAction.Target;
            var targetPlayer = ObjectManager.objectManager.GetPlayer(target);

            activeSkill = GetAttr().GetComponent <SkillInfoComponent>().GetActiveSkill();

            skillStateMachine     = SkillLogic.CreateSkillStateMachine(GetAttr().gameObject, activeSkill.skillData, GetAttr().transform.position, targetPlayer);
            skillStateMachine.cmd = cmd.proto;

            var time    = Util.FrameToFloat(aiCharacter.lastCmd.skillAction.RunFrame);
            var dir     = cmd.skillAction.Dir;
            var physics = aiCharacter.GetAttr().GetComponent <IPhysicCom>();

            physics.TurnToDir(dir);
            holdTime = time;

            var npcConfig = aiCharacter.attribute.npcConfig;
            var actConfig = npcConfig.GetActionBySkillId(cmd.proto.SkillAction.SkillId);

            if (actConfig == null)
            {
                Debug.LogError("NpcSkill:" + MobaUtil.PrintObj(npcConfig) + ":" + cmd.proto);
            }
            var aniName = actConfig.aniName;

            aiCharacter.PlayAniInTime(aniName, time);
        }
Пример #2
0
        /// <summary>
        /// MoveController 摇杆输入
        /// MobaMeSync 网络输入
        /// 两个综合考虑
        /// </summary>
        /// <returns></returns>
        public override IEnumerator RunLogic()
        {
            networkMove = GetAttr().GetComponent <ISyncInterface>();
            var physics = GetAttr().GetComponent <CreepMeleeAI>();

            while (!quit)
            {
                var curInfo   = networkMove.GetServerVelocity();
                var isNetMove = MobaUtil.IsServerMove(curInfo);
                if (isNetMove)
                {
                    if (isNetMove)//依赖服务器寻路
                    {
                        MoveByNet();
                    }
                    yield return(null);
                }
                else
                {
                    break;
                }
            }
            if (!quit)
            {
                aiCharacter.ChangeState(AIStateEnum.IDLE);
            }
        }
Пример #3
0
        /// <summary>
        /// 服务器还需要同步Speed用于表示Entity是否移动的一个状态
        /// </summary>
        /// <returns></returns>
        public override Vector3 GetServerPos()
        {
            if (positions.Count > 0)
            {
                var p1       = positions[positions.Count - 1];
                var passTime = NetworkScene.Instance.GetPredictPassServerTime(p1.FrameID);
                var speed    = NetworkUtil.FloatPos(p1.SpeedX, 0, p1.SpeedY);
                if (passTime > 0)
                {
                    return(MobaUtil.FloatPos(p1) + speed * (passTime + Util.FrameSecTime));
                }
                else
                {
                    return(MobaUtil.FloatPos(p1) + speed * Util.FrameSecTime);
                }
            }
            else
            {
                return(MobaUtil.FloatPos(curInfo));
            }

            /*
             * var passTime = NetworkScene.Instance.GetPredictPassServerTime(curInfo.FrameID);
             * //客户端跑的比服务器快 外插值
             * if (passTime > 0)
             * {
             *  var c = positions.Count;
             *  if (c >= 2)
             *  {
             *      var p1 = positions[c - 1];
             *      var p0 = positions[c - 2];
             *      var deltaFrame = p1.FrameID - p0.FrameID;
             *      //速度没有归0
             *      if (deltaFrame > 0)
             *      {
             *          var tm = MobaUtil.DeltaFrameToTime(deltaFrame);
             *          var sp = MobaUtil.DeltaPos(p1, p0);
             *          var speed = MobaUtil.Speed(sp, tm);
             *
             *          //var speed = new Vector3(curInfo.SpeedX, 0, curInfo.SpeedY);
             *          speed = Util.NetToGameVec(speed);
             *          var extraPos = passTime * speed;
             *          return MobaUtil.FloatPos(curInfo) + extraPos;
             *      }else
             *      {
             *          return MobaUtil.FloatPos(curInfo);
             *      }
             *  }else
             *  {
             *      return MobaUtil.FloatPos(curInfo);
             *  }
             * }else
             * {
             *  return MobaUtil.FloatPos(curInfo);
             * }
             */
        }
Пример #4
0
        /*
         * private IEnumerator MoveSmooth()
         * {
         *  var netPos = networkMove.GetServerPos();
         *  var curPos = GetAttr().transform.position;
         *  Log.AI("MoveSmooth:"+netPos+":"+curPos);
         *  var tarDir = netPos - curPos;
         *  tarDir.y = 0;
         *
         *  var speedCoff = MobaUtil.GetSpeedCoff(curPos, netPos);
         *  var oriSpeed = aiCharacter.GetAttr().GetSpeed() * speedCoff;
         *  var mdir = tarDir.normalized;
         *  physics.TurnTo(mdir);
         *  var sp = mdir * oriSpeed;
         *
         *  var passTime = 0.0f;
         *  var totalTime = tarDir.magnitude / oriSpeed;
         *  //不要玩家预测移动之后又回头 最终停下来的时候
         *  if (totalTime > 0.1f)
         *  {
         *      while (!quit && passTime < totalTime)
         *      {
         *          passTime += Time.deltaTime;
         *          var newPos = Vector3.Lerp(curPos, netPos, Mathf.Clamp01(passTime / totalTime));
         *          physics.MoveToIgnorePhysic(newPos);
         *          yield return null;
         *      }
         *  }else
         *  {
         *      yield return null;
         *  }
         *  //var newPos = GetAttr().transform.position + sp * Time.deltaTime;
         * }
         */

        /// <summary>
        /// 自己玩家正常速度移动
        /// </summary>
        private void MoveByNet()
        {
            var netPos = networkMove.GetServerPos();
            var curPos = GetAttr().transform.position;
            var tarDir = netPos - curPos;

            tarDir.y = 0;
            var deltaDist = tarDir.magnitude;


            var speedCoff = MobaUtil.GetSpeedCoff(curPos, netPos);
            var oriSpeed  = aiCharacter.GetAttr().GetSpeed() * speedCoff;

            /*
             * var sp = tarDir / Util.FrameSecTime;
             * var mag = sp.magnitude;
             * if(mag > oriSpeed*2)
             * {
             *  mag = oriSpeed*2;
             * }
             */

            Log.AI("MoveMe:" + curPos + ":" + netPos + ":" + networkMove.GetServerVelocity() + ":" + networkMove.GetCurInfoPos() + ":" + networkMove.GetCurInfoSpeed());

            /*
             * var dist = tarDir.magnitude;
             * var serverVel = networkMove.GetServerVelocity();
             * if (!MobaUtil.IsServerMove(serverVel) && dist < 1)
             * {
             *  return;
             * }
             */



            var mdir   = tarDir.normalized;
            var netDir = MobaUtil.GetNetTurnTo(vcontroller.inputVector, mdir, deltaDist, physics.transform.forward);

            physics.TurnTo(netDir);

            if (Mathf.Abs(deltaDist) < 0.1f)
            {
            }
            else
            {
                //sp = mdir * mag;
                //var speed2X = speed * 2;
                var sp     = mdir * oriSpeed;
                var newPos = GetAttr().transform.position + sp * Time.fixedDeltaTime;
                physics.MoveToIgnorePhysic(newPos);
            }
            //physics.MoveToIgnorePhysic(newPos);
        }
Пример #5
0
        //迭代加权平滑 弹簧 物理运动平滑手段
        private Vector3 GetInfoPredictPos(AvatarInfo p1)
        {
            var passTime = NetworkScene.Instance.GetPredictPassServerTime(p1.FrameID);
            var speed    = NetworkUtil.FloatPos(p1.SpeedX, 0, p1.SpeedY);

            if (passTime > 0)
            {
                return(MobaUtil.FloatPos(p1) + speed * (passTime + Util.FrameSecTime));
            }
            else
            {
                return(MobaUtil.FloatPos(p1) + speed * Util.FrameSecTime);
            }
        }
Пример #6
0
        public override IEnumerator RunLogic()
        {
            var playerMove  = GetAttr().GetComponent <MoveController>();
            var vcontroller = playerMove.vcontroller;
            var curInfo     = GetAttr().GetComponent <ISyncInterface>();

            while (!quit)
            {
                var isNetMove = MobaUtil.IsServerMove(curInfo.GetServerVelocity());
                //只有网络移动
                if (isNetMove)
                {
                    aiCharacter.ChangeState(AIStateEnum.MOVE);
                }
                yield return(null);
            }
        }
Пример #7
0
 //预测其它玩家的控制位置
 //服务器上的FrameId 都是整数
 //客户端的FrameId是浮点数
 //计算得到这一阵结束时候的位置
 public override Vector3 GetServerPos()
 {
     if (NetworkScene.Instance != null)
     {
         if (positions.Count > 0)
         {
             return(MobaUtil.FloatPos(curInfo));
         }
         else
         {
             return(MobaUtil.FloatPos(curInfo));
         }
     }
     else
     {
         return(transform.position);
     }
 }
Пример #8
0
        private void MoveByHand()
        {
            float v = 0;
            float h = 0;

            h = vcontroller.inputVector.x; //CameraRight
            v = vcontroller.inputVector.y; //CameraForward
            var targetDirection = h * camRight + v * camForward;
            var mdir            = targetDirection.normalized;

            var localPos  = physics.transform.position;
            var netPos    = networkMove.GetServerPos();
            var speedCoff = MobaUtil.GetSpeedDecCoff(localPos, netPos);

            physics.TurnTo(mdir);
            var speed  = aiCharacter.GetAttr().GetSpeed() * speedCoff;
            var sp     = mdir * speed;
            var newPos = GetAttr().transform.position + sp * Time.fixedDeltaTime;

            physics.MoveToWithPhysic(newPos);
        }
Пример #9
0
        public override IEnumerator RunLogic()
        {
            var playerMove  = GetAttr().GetComponent <MoveController>();
            var vcontroller = playerMove.vcontroller;
            var curInfo     = GetAttr().GetComponent <ISyncInterface>();

            while (!quit)
            {
                var isLocalMoving = MobaUtil.IsLocalMove(vcontroller);
                var isNetMove     = MobaUtil.IsServerMoveBySpeedOrPos(curInfo);
                //增加假的移动帧 降低启动时间
                if (isLocalMoving)
                {
                    //sync.AddFakeMove();
                }
                if (isNetMove || isLocalMoving)
                {
                    aiCharacter.ChangeState(AIStateEnum.MOVE);
                }
                yield return(null);
            }
        }
Пример #10
0
        /// <summary>
        /// MoveController 摇杆输入
        /// MobaMeSync 网络输入
        /// 两个综合考虑
        /// </summary>
        /// <returns></returns>
        public override IEnumerator RunLogic()
        {
            networkMove = GetAttr().GetComponent <ISyncInterface>();
            var physics = GetAttr().GetComponent <CreepMeleeAI>();

            while (!quit)
            {
                //var curInfo = networkMove.GetServerVelocity();
                var isLocalMove = MobaUtil.IsLocalMove(vcontroller);
                var isNetMove   = MobaUtil.IsServerMoveBySpeedOrPos(networkMove);
                if (isLocalMove || isNetMove)
                {
                    if (isNetMove)//依赖服务器寻路
                    {
                        //MoveByNet();
                        //多个服务器发过来的帧率 有可能导致预测失败 现在的位置超过了预测位置导致玩家不断回头
                        //yield return GetAttr().StartCoroutine(MoveSmooth());
                        MoveByNet();
                        yield return(new WaitForFixedUpdate());
                    }
                    else if (isLocalMove) //依赖本地的寻路
                    {
                        MoveByHand();
                        yield return(new WaitForFixedUpdate());
                    }
                }
                else
                {
                    break;
                }
            }
            if (!quit)
            {
                aiCharacter.ChangeState(AIStateEnum.IDLE);
            }
        }
Пример #11
0
 public override Vector3 GetCurInfoSpeed()
 {
     return(MobaUtil.FloatPos(new Vector3(curInfo.SpeedX, 0, curInfo.SpeedY)));
 }
Пример #12
0
 public override void DoNetworkDamage(GCPlayerCmd cmd)
 {
     MobaUtil.DoNetworkDamage(gameObject, cmd);
 }
Пример #13
0
 public override void SetLevel(AvatarInfo info)
 {
     MobaUtil.SetLevel(gameObject, info);
 }
Пример #14
0
 public override void NetworkAttack(GCPlayerCmd proto)
 {
     MobaUtil.DoNetworkAttack(gameObject, proto);
 }
Пример #15
0
 public override Vector3 GetCurInfoPos()
 {
     return(MobaUtil.FloatPos(curInfo));
 }
Пример #16
0
        public override void NetworkAttribute(GCPlayerCmd cmd)
        {
            var info = cmd.AvatarInfo;

            if (attr == null)
            {
                attr = GetComponent <NpcAttribute>();
            }

            Log.Net("OtherSync: " + info);
            if (info == null)
            {
                Debug.LogError("NetMatchInfo is Null ");
                return;
            }
            NetworkMove(info);

            //服务器通知瞬间传送位置
            if (info.ResetPos)
            {
                if (aiBase != null)
                {
                    aiBase.GetAI().ChangeState(AIStateEnum.IDLE);
                }

                var netPos = MobaUtil.FloatPos(info);
                transform.position = netPos;
                positions.Clear();
            }


            if (info.HasTeamColor)
            {
                attr.SetTeamColorNet(info.TeamColor);
                curInfo.TeamColor = info.TeamColor;
            }
            if (info.HasIsMaster)
            {
                attr.SetIsMasterNet(info.IsMaster);
                curInfo.IsMaster = info.IsMaster;
            }

            var dataChanged = false;
            var skillCount  = curInfo.KillCount;

            if (info.HasKillCount)
            {
                skillCount        = info.KillCount;
                curInfo.KillCount = info.KillCount;
                dataChanged       = true;
            }

            var deadCount = curInfo.DeadCount;

            if (info.HasDeadCount)
            {
                deadCount         = info.DeadCount;
                curInfo.DeadCount = info.DeadCount;
                dataChanged       = true;
            }

            var secondaryAttackCount = curInfo.SecondaryAttackCount;

            if (info.HasSecondaryAttackCount)
            {
                secondaryAttackCount         = info.SecondaryAttackCount;
                curInfo.SecondaryAttackCount = info.SecondaryAttackCount;
                dataChanged = true;
            }

            if (info.HasScore)
            {
                curInfo.Score = info.Score;
                dataChanged   = true;
            }

            if (dataChanged)
            {
                var sid = attr.GetNetView().GetServerID();
                ScoreManager.Instance.NetSyncScore(sid, curInfo.Score, sid, skillCount, deadCount, secondaryAttackCount);
            }

            if (info.HasContinueKilled)
            {
                curInfo.ContinueKilled = info.ContinueKilled;
                if (curInfo.ContinueKilled > 0)
                {
                }
            }
            if (info.HasPlayerModelInGame && curInfo.PlayerModelInGame != info.PlayerModelInGame)
            {
                curInfo.PlayerModelInGame = info.PlayerModelInGame;
                GetComponent <MobaModelLoader>().LoadModel(curInfo.PlayerModelInGame);
                var unitData = Util.GetUnitData(true, curInfo.PlayerModelInGame, 0);
                attr.SetObjUnitData(unitData);

                //SkillDataController.skillDataController.InitSkillShotAfterSelectSkill(curInfo.PlayerModelInGame);
            }
            if (info.HasHP)
            {
                curInfo.HP = info.HP;
                attr.SetHPNet(info.HP);
            }
            if (info.HasLevel)
            {
                curInfo.Level = info.Level;
                attr.ChangeLevel(info.Level);
            }
            if (info.HasState)
            {
                curInfo.State = info.State;
            }
        }
Пример #17
0
 public override void Dead(GCPlayerCmd cmd)
 {
     MobaUtil.Dead(gameObject);
 }
Пример #18
0
 public override void NetworkAttack(GCPlayerCmd cmd)
 {
     MobaUtil.DoNetworkAttack(gameObject, cmd);
 }