コード例 #1
0
 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();
 }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
 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();
 }
コード例 #4
0
        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();
            }
        }
コード例 #5
0
        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;
            }
        }
コード例 #6
0
        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;
            }
        }