protected override void OnDestruct() { for (int i = 0; i < m_movement_predicts.Count; ++i) { MovementPredict predict = m_movement_predicts[i]; RecyclableObject.Recycle(predict); } m_movement_predicts.Clear(); }
public void AddPredictOffset(Vector3 offset) { GridGraph grid_graph = m_position_component.GetGridGraph(); if (grid_graph != null) { Vector3 interpolation_position = m_interpolation_tr.localPosition + offset; Vector3 entity_position = m_model_component.GetCurrentPosition() + interpolation_position; Vector3FP entity_position_fp = RenderWorld.Vector3_To_Vector3FP(entity_position); GridNode node = grid_graph.Position2Node(entity_position_fp); if (node == null) { if (!GetRenderWorld().OnEntityOutOfEdge(GetRenderEntity())) { return; } } else if (!node.Walkable && m_locomotor_component.AvoidObstacle()) { Vector3FP offset_fp = RenderWorld.Vector3_To_Vector3FP(offset); //try z entity_position_fp.x -= offset_fp.x; node = grid_graph.Position2Node(entity_position_fp); if (node == null || !node.Walkable) { //try x entity_position_fp.x += offset_fp.x; entity_position_fp.z -= offset_fp.z; node = grid_graph.Position2Node(entity_position_fp); if (node == null || !node.Walkable) { return; } else { offset.z = 0; } } else { offset.x = 0; } } } for (int i = 0; i < m_movement_predicts.Count; ++i) { MovementPredict predict = m_movement_predicts[i]; if (predict.m_state == MovementPredict.AccumulateOffsetState || predict.m_state == MovementPredict.FollowLogicState) { predict.m_offset += offset; m_interpolation_tr.localPosition += offset; //LogWrapper.LogDebug("AddPredictOffset, predict.m_offset = ", predict.m_offset.ToString(), ", m_interpolation_tr = ", m_interpolation_tr.localPosition.ToString()); break; } } }
public void ClearAllPrediction() { m_interpolation_tr.localPosition = Vector3.zero; m_copy_state = NoCopy; m_accumulated_offset = Vector3.zero; m_offset_dir = Vector3.zero; m_interpolation_time = -1f; for (int i = 0; i < m_movement_predicts.Count; ++i) { MovementPredict predict = m_movement_predicts[i]; RecyclableObject.Recycle(predict); } m_movement_predicts.Clear(); }
public void OnLogicUpdatePosition(Vector3 offset) { if (m_copy_state == DoCopy /* || m_movement_predicts.Count == 0*/) { Interpolate(); return; } bool can_interpolate = false; bool done_offset = false; for (int i = 0; i < m_movement_predicts.Count; ++i) { MovementPredict predict = m_movement_predicts[i]; if (!can_interpolate) { if (predict.m_state == MovementPredict.AccumulateOffsetState || predict.m_state == MovementPredict.FollowLogicState) { can_interpolate = true; } } if (!done_offset) { if (predict.m_state == MovementPredict.FollowLogicState || predict.m_state == MovementPredict.EliminateOffsetState) { done_offset = true; predict.m_offset -= offset; m_interpolation_tr.localPosition -= offset; //LogWrapper.LogDebug("OnLogicUpdatePosition, predict.m_offset = ", predict.m_offset.ToString(), ", m_interpolation_tr = ", m_interpolation_tr.localPosition.ToString()); } } } if (!done_offset) { m_accumulated_offset -= offset; m_interpolation_tr.localPosition -= offset; ResetOffsetDirection(); //LogWrapper.LogError("OnLogicUpdatePosition, UNDONE, offset = ", offset.ToString()); } if (can_interpolate) { Interpolate(); } }
void ConfirmEntityMove(EntityMoveCommand cmd, bool result) { switch (cmd.m_move_type) { case EntityMoveCommand.DirectionType: { uint crc = CalculateMoveCommandCRC(cmd); //LogWrapper.LogDebug("ConfirmEntityMove, DirectionType, time =", GetCurrentTime(), ", crc = ", crc); for (int i = 0; i < m_movement_predicts.Count;) { MovementPredict predict = m_movement_predicts[i]; if (predict.m_command_crc != crc) { m_accumulated_offset += predict.m_offset; if (predict.m_state != MovementPredict.EliminateOffsetState) { LogWrapper.LogError("REMOVE UNCONFIRMED PREDICT ", predict.m_command_crc, ", predict.m_offset = ", predict.m_offset.ToString()); } ResetOffsetDirection(); RecyclableObject.Recycle(predict); m_movement_predicts.RemoveAt(i); continue; } else { if (predict.m_state == MovementPredict.AccumulateOffsetState) { predict.m_state = MovementPredict.FollowLogicState; predict.m_task.ResetMaxPredictTime(GetRenderWorld().CurrentTime, m_follow_logic_predict_time); } break; } } } break; case EntityMoveCommand.DestinationType: { if (m_copy_state == WaitCopy) { m_copy_state = DoCopy; } if (!result && m_copy_state == DoCopy) { StopMoveAnimation(); } //下面这段代码和EntityMoveCommand.StopMoving差不多 for (int i = 0; i < m_movement_predicts.Count;) { MovementPredict predict = m_movement_predicts[i]; if (predict.m_state != MovementPredict.CopyLogicState) { m_accumulated_offset += predict.m_offset; if (predict.m_state != MovementPredict.EliminateOffsetState) { LogWrapper.LogError("REMOVE UNCONFIRMED PREDICT ", predict.m_command_crc, ", predict.m_offset = ", predict.m_offset.ToString()); } ResetOffsetDirection(); RecyclableObject.Recycle(predict); m_movement_predicts.RemoveAt(i); continue; } else { m_movement_predicts.RemoveAt(i); break; } } if (m_movement_predicts.Count == 0) { //LogWrapper.LogDebug("ConfirmEntityMove, BEFOREE SET offset = ", m_accumulated_offset.ToString()); m_accumulated_offset = m_interpolation_tr.localPosition; ResetOffsetDirection(); //LogWrapper.LogDebug("ConfirmEntityMove, all stoped, m_accumulated_offset = ", m_accumulated_offset.ToString()); } } break; case EntityMoveCommand.StopMoving: { //LogWrapper.LogDebug("ConfirmEntityMove, STOP, time = ", GetCurrentTime()); for (int i = 0; i < m_movement_predicts.Count;) { MovementPredict predict = m_movement_predicts[i]; if (predict.m_state != MovementPredict.StopState) { m_accumulated_offset += predict.m_offset; if (predict.m_state != MovementPredict.EliminateOffsetState) { LogWrapper.LogError("REMOVE UNCONFIRMED PREDICT ", predict.m_command_crc, ", predict.m_offset = ", predict.m_offset.ToString()); } ResetOffsetDirection(); RecyclableObject.Recycle(predict); m_movement_predicts.RemoveAt(i); continue; } else { m_movement_predicts.RemoveAt(i); break; } } if (m_movement_predicts.Count == 0) { //LogWrapper.LogDebug("ConfirmEntityMove, BEFOREE SET offset = ", m_accumulated_offset.ToString()); m_accumulated_offset = m_interpolation_tr.localPosition; ResetOffsetDirection(); //LogWrapper.LogDebug("ConfirmEntityMove, all stoped, m_accumulated_offset = ", m_accumulated_offset.ToString()); } } break; default: break; } }
void PredictEntityMove(EntityMoveCommand cmd) { switch (cmd.m_move_type) { case EntityMoveCommand.DirectionType: { m_copy_state = NoCopy; bool exist = false; uint crc = CalculateMoveCommandCRC(cmd); //LogWrapper.LogDebug("PredictEntityMove, DirectionType, time =", GetCurrentTime(), ", dir = ", cmd.m_vector.ToString(), ", crc = ", crc); for (int i = 0; i < m_movement_predicts.Count; ++i) { MovementPredict predict = m_movement_predicts[i]; if (predict.m_command_crc == crc) { if (predict.m_state == MovementPredict.AccumulateOffsetState || predict.m_state == MovementPredict.FollowLogicState) { exist = true; } } else if (predict.m_state == MovementPredict.AccumulateOffsetState || predict.m_state == MovementPredict.FollowLogicState) { predict.m_state = MovementPredict.EliminateOffsetState; predict.m_task.Cancel(); } } if (!exist) { Vector3 direction = RenderWorld.Vector3FP_To_Vector3(cmd.m_vector); PredictLocomotionTask task = RenderTask.Create <PredictLocomotionTask>(); task.Construct(this, direction, m_max_predict_time); var task_scheduler = GetRenderWorld().GetTaskScheduler(); task_scheduler.Schedule(task, GetRenderWorld().CurrentTime, FixPoint.PrecisionFP); MovementPredict predict = RecyclableObject.Create <MovementPredict>(); predict.m_state = MovementPredict.AccumulateOffsetState; predict.m_command_crc = crc; predict.m_task = task; m_movement_predicts.Add(predict); PlayMoveAnimation(direction); } } break; case EntityMoveCommand.DestinationType: { if (m_copy_state == NoCopy) { m_copy_state = WaitCopy; } //下面这段代码和EntityMoveCommand.StopMoving差不多 for (int i = 0; i < m_movement_predicts.Count; ++i) { MovementPredict predict = m_movement_predicts[i]; if (predict.m_state == MovementPredict.AccumulateOffsetState || predict.m_state == MovementPredict.FollowLogicState) { predict.m_state = MovementPredict.EliminateOffsetState; predict.m_task.Cancel(); } } MovementPredict temp = RecyclableObject.Create <MovementPredict>(); temp.m_state = MovementPredict.CopyLogicState; m_movement_predicts.Add(temp); Vector3 direction = RenderWorld.Vector3FP_To_Vector3(cmd.m_vector) - m_model_component.GetCurrentPosition(); PlayMoveAnimation(direction); } break; case EntityMoveCommand.StopMoving: { m_copy_state = NoCopy; for (int i = 0; i < m_movement_predicts.Count; ++i) { MovementPredict predict = m_movement_predicts[i]; if (predict.m_state == MovementPredict.AccumulateOffsetState || predict.m_state == MovementPredict.FollowLogicState) { predict.m_state = MovementPredict.EliminateOffsetState; predict.m_task.Cancel(); } } MovementPredict temp = RecyclableObject.Create <MovementPredict>(); temp.m_state = MovementPredict.StopState; m_movement_predicts.Add(temp); StopMoveAnimation(); //LogWrapper.LogDebug("PredictEntityMove, StopMoving, time =", GetCurrentTime()); } break; default: break; } }