private void MoveUser(UserInfo obj, long deltaTime) { MovementStateInfo msi = obj.GetMovementStateInfo(); if (null != obj.ControlledObject) { MovementStateInfo ctrlMsi = obj.ControlledObject.GetMovementStateInfo(); ctrlMsi.IsMoving = msi.IsMoving; ctrlMsi.SetFaceDir(msi.GetFaceDir()); ctrlMsi.SetMoveDir(msi.GetMoveDir()); } if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep) || obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition)) { return; } //玩家移动中忽略阻挡,由客户端与AI来规划路径。 if (!obj.IsDead() && msi.IsMoving && !msi.IsSkillMoving && !msi.IsMoveMeetObstacle) { Vector3 pos = msi.GetPosition3D(); float speed = (float)obj.GetRealControlledObject().GetActualProperty().MoveSpeed *(float)obj.VelocityCoefficient; float distance = (speed * (float)(int)deltaTime) / 1000.0f; //LogSystem.Debug("MovementSystem user:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance); float x = 0, y = 0; Vector2 newPos = new Vector2(); if (obj.GetAiStateInfo().CurState != (int)AiStateId.Invalid && msi.CalcDistancSquareToTarget() < distance * distance) { x = msi.TargetPosition.X; y = msi.TargetPosition.Z; AdjustPosition(obj.SpatialSystem, ref x, ref y); newPos = new Vector2(x, y); msi.SetPosition2D(newPos); } else { float cosV = (float)msi.MoveDirCosAngle; float sinV = (float)msi.MoveDirSinAngle; y = pos.Z + distance * cosV; x = pos.X + distance * sinV; AdjustPosition(obj.SpatialSystem, ref x, ref y); newPos = new Vector2(x, y); msi.SetPosition2D(newPos); } if (null != obj.ControlledObject) { obj.ControlledObject.GetMovementStateInfo().SetPosition2D(newPos); } } }