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