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; }
/// <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); * } * } */ } }
//迭代加权平滑 弹簧 物理运动平滑手段 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); } }
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); } }
//预测其它玩家的控制位置 //服务器上的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); } }
public override void Dead(GCPlayerCmd cmd) { MobaUtil.Dead(gameObject); }
public override void DoNetworkDamage(GCPlayerCmd cmd) { MobaUtil.DoNetworkDamage(gameObject, cmd); }
public override void SetLevel(AvatarInfo info) { //throw new NotImplementedException(); MobaUtil.SetLevel(gameObject, info); }
public override void NetworkAttack(GCPlayerCmd proto) { MobaUtil.DoNetworkAttack(gameObject, proto); }
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; } }
public override Vector3 GetCurInfoPos() { return(MobaUtil.FloatPos(curInfo)); }
public override void EnterState() { base.EnterState(); aiCharacter.SetIdle(); MobaUtil.SetPosWithHeight(GetAttr().gameObject, GetAttr().gameObject.transform.position); }