public override void CalcOutput(PlayerEntity player, ICameraMotorInput input, ICameraMotorState state, SubCameraMotorState subState, DummyCameraMotorOutput output, ICameraNewMotor last, int clientTime) { output.Far = input.GetPoseConfig(_modeId).Far; output.Near = input.GetPoseConfig(_modeId).Near; output.ForbidDetect = input.GetPoseConfig(_modeId).ForbidDetect; _transitionTime = CameraUtility.GetPostureTransitionTime(_motorType, subState); var elapsedPercent = ElapsedPercent(clientTime, subState.ModeTime, _transitionTime); var realPercent = EaseInOutQuad(0, 1, elapsedPercent); if (state.IsFristPersion()) { //一人称和瞄准相机没有偏移 output.Fov = Mathf.Lerp(input.GetPoseConfig(last.ModeId).Fov, input.GetPoseConfig(_modeId).Fov, realPercent); } else { if (last is AirplanePoseMotor || last is DrivePoseMotor) { realPercent = 1; } output.ArchorOffset = Vector3.Lerp(input.GetPoseConfig(last.ModeId).AnchorOffset, input.GetPoseConfig(_modeId).AnchorOffset, realPercent); output.ArchorPostOffset = Vector3.Lerp(input.GetPoseConfig(last.ModeId).ScreenOffset, input.GetPoseConfig(_modeId).ScreenOffset, realPercent); output.Offset = Vector3.Lerp(new Vector3(0, 0, -input.GetPoseConfig(last.ModeId).Distance), new Vector3(0, 0, -input.GetPoseConfig(_modeId).Distance), realPercent); output.ArchorEulerAngle = Vector3.Lerp(last.FinalEulerAngle, FinalEulerAngle, realPercent); output.Fov = Mathf.Lerp(input.GetPoseConfig(last.ModeId).Fov, input.GetPoseConfig(_modeId).Fov, realPercent); } }