Ejemplo n.º 1
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;

        while (!quit && passTime < totalTime)
        {
            passTime += Time.deltaTime;
            var newPos = Vector3.Lerp(curPos, netPos, Mathf.Clamp01(passTime / totalTime));
            physics.MoveToIgnorePhysic(newPos);
            yield return(null);
        }
        //var newPos = GetAttr().transform.position + sp * Time.deltaTime;
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 实际移动的逻辑
    /// </summary>
    /// <returns></returns>
    public override IEnumerator RunLogic()
    {
        var playerMove = GetAttr().GetComponent <MoveController>();

        physics     = playerMove.GetComponent <IPhysicCom>();
        networkMove = GetAttr().GetComponent <MonsterSync>();
        while (!quit)
        {
            //var netPos = networkMove.GetServerVelocity();
            var isNetMove = MobaUtil.IsServerMoveBySpeedOrPos(networkMove);
            if (isNetMove)
            {
                //MoveByNet();
                yield return(GetAttr().StartCoroutine(MoveSmooth()));
            }
            else
            {
                aiCharacter.ChangeState(AIStateEnum.IDLE);
                break;
            }
            //yield return null;

            /*
             * physics.TurnTo(playerMove.directionTo);
             *
             * var runTime = playerMove.runTime;
             * var passTime = 0.0f;
             * var curPos = playerMove.curPos;
             * var tarPos = playerMove.targetPos;
             * var curLogicFrameId = playerMove.logicFrameId;
             *
             * while (passTime < runTime && !quit)
             * {
             *  var newPos = Vector3.Lerp(curPos, tarPos, Mathf.Clamp01(passTime / runTime));
             *  physics.MoveTo(newPos);
             *  passTime += Time.deltaTime;
             *  yield return null;
             * }
             * if (!quit)
             * {
             *  //继续执行移动命令
             *  //否则结束进入Idle状态
             *  if (curLogicFrameId != playerMove.logicFrameId)
             *  {
             *      aiCharacter.SetRun();
             *  }
             *  else
             *  {
             *      aiCharacter.ChangeState(AIStateEnum.IDLE);
             *  }
             * }
             */
        }
    }
Ejemplo n.º 3
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);
        }
    }
Ejemplo n.º 4
0
    public override IEnumerator RunLogic()
    {
        var monSync = GetAttr().GetComponent <MonsterSync>();

        while (!quit)
        {
            var isNetMove = MobaUtil.IsServerMoveBySpeedOrPos(monSync);
            if (isNetMove)
            {
                aiCharacter.ChangeState(AIStateEnum.MOVE);
            }
            yield return(null);
        }
    }
Ejemplo n.º 5
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);
     }
 }
Ejemplo n.º 6
0
 public override void Dead(GCPlayerCmd cmd)
 {
     MobaUtil.Dead(gameObject);
 }
Ejemplo n.º 7
0
 public override void DoNetworkDamage(GCPlayerCmd cmd)
 {
     MobaUtil.DoNetworkDamage(gameObject, cmd);
 }
Ejemplo n.º 8
0
 public override void SetLevel(AvatarInfo info)
 {
     //throw new NotImplementedException();
     MobaUtil.SetLevel(gameObject, info);
 }
Ejemplo n.º 9
0
 public override void NetworkAttack(GCPlayerCmd proto)
 {
     MobaUtil.DoNetworkAttack(gameObject, proto);
 }
Ejemplo n.º 10
0
    public override void NetworkAttribute(GCPlayerCmd cmd)
    {
        var info = cmd.AvatarInfo;

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

        Log.Net("MySelfSync: " + 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;
        }
    }
Ejemplo n.º 11
0
 public override Vector3 GetCurInfoPos()
 {
     return(MobaUtil.FloatPos(curInfo));
 }
Ejemplo n.º 12
0
 public override void EnterState()
 {
     base.EnterState();
     aiCharacter.SetIdle();
     MobaUtil.SetPosWithHeight(GetAttr().gameObject, GetAttr().gameObject.transform.position);
 }