/* * 执行当前的移动命令 * 若上一个命令是移动命令则替换 * 若上一个命令是技能命令则等待 */ IEnumerator CommandHandle() { while (true) { if (commandList.Count > 0) { var peekCmd = commandList [0]; if (peekCmd.commandID == ObjectCommand.ENUM_OBJECT_COMMAND.OC_MOVE) { if (currentLogicCommand != null && currentLogicCommand.commandID == ObjectCommand.ENUM_OBJECT_COMMAND.OC_MOVE) { currentLogicCommand = peekCmd; commandList.RemoveAt(0); } } if (currentLogicCommand == null) { var cmd = commandList [0]; commandList.RemoveAt(0); int logicCommandCount = commandList.Count; logicSpeed = logicCommandCount * 0.5f + 1.0f; DoLogicCommand(cmd); } } yield return(null); } }
public void NetworkAttack(SkillAction sk) { var cmd = new ObjectCommand(ObjectCommand.ENUM_OBJECT_COMMAND.OC_USE_SKILL); cmd.skillId = sk.SkillId; Log.GUI("Other Player Attack LogicCommand"); gameObject.GetComponent <LogicCommand> ().PushCommand(cmd); }
//所有命令执行函数需要注意命令执行结束的时候 设定当前命令为null void EnterUseSkill(ObjectCommand cmd) { //判断是否可以使用技能 var msg = new MyAnimationEvent.Message(MyAnimationEvent.MsgType.DoSkill); msg.skillData = Util.GetSkillData(cmd.skillId, 1); GetComponent <MyAnimationEvent>().InsertMsg(msg); currentLogicCommand = null; }
/* * Write Message Send To Server * PlayerManagerment PhotonView Manager */ public void NetworkMove(AvatarInfo info) { var mvTarget = new Vector3(info.X / 100.0f, info.Y / 100.0f + 0.2f, info.Z / 100.0f); var cmd = new ObjectCommand(); cmd.targetPos = mvTarget; cmd.dir = info.Dir; cmd.commandID = ObjectCommand.ENUM_OBJECT_COMMAND.OC_MOVE; GetComponent <LogicCommand>().PushCommand(cmd); if (info.HasHP) { GetComponent <NpcAttribute>().SetHPNet(info.HP); } if (info.HasTeamColor) { GetComponent <NpcAttribute>().SetTeamColorNet(info.TeamColor); } }
bool DoLogicCommand(ObjectCommand cmd) { Log.AI("DoLogicCommad " + cmd.commandID); currentLogicCommand = cmd; bool ret = false; switch (cmd.commandID) { case ObjectCommand.ENUM_OBJECT_COMMAND.OC_MOVE: StartCoroutine(Move()); break; case ObjectCommand.ENUM_OBJECT_COMMAND.OC_USE_SKILL: EnterUseSkill(cmd); break; default: Debug.LogError("LogicCommand:: UnImplement Command " + cmd.commandID.ToString()); break; } return(ret); }
/* * NetWork Command Input */ public void PushCommand(ObjectCommand cmd) { Log.Important("Push Command What " + cmd.commandID); commandList.Add(cmd); }
/* * 监督执行移动命令当有新的移动命令注入的时候当前的移动命令则失效 * 异常拯救函数 */ IEnumerator Move() { var samplePos = transform.position; //new List<Vector3>(){transform.position}; var lastSameTime = 0f; while (currentLogicCommand != null) { Vector3 mypos = transform.position; var lastOne = samplePos; var diff = Util.XZSqrMagnitude(lastOne, mypos); if (diff < 1) { if (lastSameTime == 0) { lastSameTime = Time.time; } } else { lastSameTime = 0; samplePos = mypos; } Vector3 tarPos = currentLogicCommand.targetPos; float dx = tarPos.x - mypos.x; float dz = tarPos.z - mypos.z; Vector2 vdir = new Vector2(dx, dz); if (vdir.sqrMagnitude < 0.1f) { mvController.vcontroller.inputVector.x = 0; mvController.vcontroller.inputVector.y = 0; break; } //超过1s卡在某个位置 和目标位置相差超过1距离 使用超能移动 和目标相距3长时间 if (lastSameTime != 0 && (Time.time - lastSameTime > 1) && vdir.sqrMagnitude >= 2) { transform.position = tarPos; break; } vdir.Normalize(); Vector2 mRight = new Vector2(mvController.camRight.x, mvController.camRight.z); Vector2 mForward = new Vector2(mvController.camForward.x, mvController.camForward.z); float hval = Vector2.Dot(vdir, mRight); float vval = Vector2.Dot(vdir, mForward); mvController.vcontroller.inputVector.x = hval; mvController.vcontroller.inputVector.y = vval; yield return(null); } //两个阶段问题 //移动到目标和确保朝向一致性 //方向平滑过渡 /* * while(currentLogicCommand != null) { * var myDir = transform.localRotation.eulerAngles.y; * var tarDir = currentLogicCommand.dir; * var dd = tarDir - myDir; * } */ //简单实现 if (currentLogicCommand != null) { transform.localRotation = Quaternion.Euler(new Vector3(0, currentLogicCommand.dir, 0)); } //再次检测Move位置状态,如果不正常则重新开始 currentLogicCommand = null; }