Exemplo n.º 1
0
        private void CalcuForNormal(IUserCmd cmd, PlayerEntity player, Vector3 archotRotation,
                                    CameraStateOutputNewComponent result)
        {
            DummyCameraMotorState.Convert(player.cameraStateNew, _state);

            DummyCameraMotorInput _input = (DummyCameraMotorInput)player.cameraStateNew.CameraMotorInput;

            _input.Generate(_context, player, cmd, archotRotation.y, archotRotation.x);

            for (int i = 0; i < (int)SubCameraMotorType.End; i++)
            {
                var type = (SubCameraMotorType)i;
                SetNextMotor(player, type, _state, _input);
            }

            CameraActionManager.OnAction(player, _state);

            player.cameraStateUpload.EnterActionCode = CameraActionManager.GetActionCode(CameraActionType.Enter);
            player.cameraStateUpload.LeaveActionCode = CameraActionManager.GetActionCode(CameraActionType.Leave);
            CameraActionManager.ClearActionCode();

            player.cameraStateNew.CameraMotorInput     = player.cameraStateNew.LastCameraMotorInput;
            player.cameraStateNew.LastCameraMotorInput = _input;

            CalcFinalOutput(player, (DummyCameraMotorInput)player.cameraStateNew.LastCameraMotorInput,
                            result, _state);
        }
Exemplo n.º 2
0
        private void CalcFinalOutput(PlayerEntity player, DummyCameraMotorInput input,
                                     CameraStateOutputNewComponent finalOutput, DummyCameraMotorState state)
        {
            _output.Init();
            _output.ArchorPosition =
                player.cameraArchor.ArchorPosition +
                player.cameraArchor.ArchorTransitionOffsetPosition;
            _output.ArchorEulerAngle = player.cameraArchor.ArchorEulerAngle;

            for (int i = 0; i < (int)SubCameraMotorType.End; i++)
            {
                var type = (SubCameraMotorType)i;
                _output.Append(CalcSubFinalCamera(player, input, state, _motors.GetDict(type), state.Get(type),
                                                  player.time.ClientTime));
            }

            finalOutput.ArchorPosition   = _output.ArchorPosition;
            finalOutput.ArchorEulerAngle = _output.ArchorEulerAngle;
            finalOutput.ArchorOffset     = _output.ArchorOffset;
            finalOutput.ArchorPostOffset = _output.ArchorPostOffset;
            finalOutput.EulerAngle       = _output.EulerAngle;
            finalOutput.Offset           = _output.Offset;
            finalOutput.PostOffset       = _output.PostOffset;
            finalOutput.Fov  = _output.Fov;
            finalOutput.Far  = _output.Far;
            finalOutput.Near = _output.Near;
            finalOutput.NeedDetectDistance = !_output.ForbidDetect;

            SmoothFov(player, input.GetViewConfig());
        }
Exemplo n.º 3
0
        private void CalcFinalOutput(PlayerEntity player, DummyCameraMotorInput input,
                                     CameraStateOutputNewComponent finalOutput, DummyCameraMotorState state)
        {
            player.cameraConfigNow.Config     = state.GetMainConfig();
            player.cameraConfigNow.PeekConfig = SingletonManager.Get <CameraConfigManager>().Config.PeekConfig;
            player.cameraConfigNow.DeadConfig = SingletonManager.Get <CameraConfigManager>().Config.DeadConfig;
            _output.Init();
            _output.ArchorPosition =
                player.cameraArchor.ArchorPosition +
                player.cameraArchor.ArchorTransitionOffsetPosition;
            _output.ArchorEulerAngle = player.cameraArchor.ArchorEulerAngle;

            for (int i = 0; i < (int)SubCameraMotorType.End; i++)
            {
                var type = (SubCameraMotorType)i;
                _output.Append(CalcSubFinalCamera(player, input, state, _motors.GetDict(type), state.Get(type),
                                                  player.time.ClientTime));
            }

            finalOutput.ArchorPosition   = _output.ArchorPosition;
            finalOutput.ArchorEulerAngle = _output.ArchorEulerAngle;
            finalOutput.ArchorOffset     = _output.ArchorOffset;
            finalOutput.ArchorPostOffset = _output.ArchorPostOffset;
            finalOutput.EulerAngle       = _output.EulerAngle;
            finalOutput.Offset           = _output.Offset;
            finalOutput.PostOffset       = _output.PostOffset;
            finalOutput.Fov  = _output.Fov;
            finalOutput.Far  = _output.Far;
            finalOutput.Near = _output.Near;

            SmoothFov(player);
        }
Exemplo n.º 4
0
        private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera,
                                      Vector3 punchRotation, PlayerEntity player, int curTime)
        {
            var doLag        = !player.appearanceInterface.Appearance.IsFirstPerson;
            var realRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation);

            var postOffset       = calsOut.ArchorPostOffset + calsOut.PostOffset;
            var realArchorOffset = calsOut.ArchorOffset;
            var realPostOffset   = postOffset;
            var archorRotation   = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0);

            //计算头顶位置
            _archoroffsetArm.Offset = realArchorOffset / 2;
            var heightTestStart = calsOut.ArchorPosition + archorRotation * realArchorOffset / 2;

            _archoroffsetArm.Update(heightTestStart, archorRotation, curTime - LastTime, doLag, calsOut.NeedDetectDistance);
            realArchorOffset = _archoroffsetArm.LastLoc - calsOut.ArchorPosition;

            //计算锚点位置
            _postOffsetArm.Offset = realPostOffset;
            _postOffsetArm.Update(_archoroffsetArm.LastLoc, archorRotation, curTime - LastTime, false, calsOut.NeedDetectDistance);
            realPostOffset = _postOffsetArm.LastLoc - _archoroffsetArm.LastLoc;
            var postOffsetFactor = Mathf.Max(realPostOffset.magnitude / postOffset.magnitude, 1);
            var startingPosition = calsOut.FinalArchorPosition =
                calsOut.ArchorPosition + postOffsetFactor * realArchorOffset + realPostOffset;

            //封闭建筑内拉近摄像机距离
//            if(BuildingRestrictTest(calsOut, player))
//                calsOut.Offset = calsOut.Offset.normalized * OffsetInBuilding;

            //相机位置计算
            _offsetArm.Offset = calsOut.Offset;
            _offsetArm.Update(startingPosition, realRotation, curTime - LastTime, doLag, true);

            camera.PlayerFocusPosition = startingPosition;
            camera.Position            = _offsetArm.LastLoc;
            camera.EulerAngle          = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation;
            camera.EulerAngle.x        = YawPitchUtility.Normalize(camera.EulerAngle.x);
            camera.EulerAngle.y        = YawPitchUtility.Normalize(camera.EulerAngle.y);
            camera.EulerAngle.z        = YawPitchUtility.Normalize(camera.EulerAngle.z);
            camera.Fov  = calsOut.Fov;
            camera.Far  = calsOut.Far;
            camera.Near = calsOut.Near;

#if UNITY_EDITOR
            var p1 = calsOut.ArchorPosition;
            var p2 = _archoroffsetArm.LastLoc;
            var p3 = startingPosition;
            var p4 = _offsetArm.LastLoc;

            Debug.DrawLine(p1, p2, Color.red);
            Debug.DrawLine(p2, p3, Color.green);
            Debug.DrawLine(p3, p4, Color.blue);
#endif
        }
Exemplo n.º 5
0
        private void CalcuForObserving(IUserCmd cmd, PlayerEntity player, Vector3 archotRotation,
                                       CameraStateOutputNewComponent result)
        {
            DummyCameraMotorState.Convert(player.cameraStateNew, _dummyState);
            _dummyState.Dict[(int)SubCameraMotorType.View].NowMode  = (byte)ECameraViewMode.ThirdPerson;
            _dummyState.Dict[(int)SubCameraMotorType.View].LastMode = (byte)ECameraViewMode.FirstPerson;
            DummyCameraMotorInput _input = (DummyCameraMotorInput)player.cameraStateNew.CameraMotorInput;

            _input.Generate(_context, player, cmd, archotRotation.y, archotRotation.x);
            CalcFinalOutput(player, _input, result, _dummyState);
            result.ArchorPosition = player.thirdPersonDataForObserving.ThirdPersonArchorPosition;
        }
Exemplo n.º 6
0
        private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera,
                                      Vector3 punchRotation, PlayerEntity player, bool doLag, int curTime)
        {
            var realRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation);
            var index        = (player.gamePlay.JobAttribute == (int)EJobAttribute.EJob_Variant) ? 0.75f : 1f;

            var postOffset       = calsOut.ArchorPostOffset + calsOut.PostOffset;
            var realArchorOffset = calsOut.ArchorOffset;
            var realPostOffset   = postOffset;
            var archorRotation   = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0);

            //计算头顶位置
            _archoroffsetArm.Offset = realArchorOffset / 2 * index;
            var heightTestStart = calsOut.ArchorPosition + archorRotation * realArchorOffset / 2 * index;

            _archoroffsetArm.Update(heightTestStart, archorRotation, curTime - LastTime, doLag, calsOut.NeedDetectDistance);
            realArchorOffset = (_archoroffsetArm.LastLoc - calsOut.ArchorPosition);

            //计算锚点位置
            _postOffsetArm.Offset = realPostOffset * index;
            _postOffsetArm.Update(_archoroffsetArm.LastLoc, archorRotation, curTime - LastTime, false, calsOut.NeedDetectDistance);
            realPostOffset = (_postOffsetArm.LastLoc - _archoroffsetArm.LastLoc);
            var postOffsetFactor = Mathf.Max(realPostOffset.magnitude / postOffset.magnitude, 1);
            var startingPosition = calsOut.FinalArchorPosition =
                calsOut.ArchorPosition + postOffsetFactor * realArchorOffset + realPostOffset;

            //相机位置计算
            _offsetArm.Offset = calsOut.Offset * index;
            _offsetArm.Update(startingPosition, realRotation, curTime - LastTime, doLag, true);

            camera.PlayerFocusPosition = startingPosition;
            camera.Position            = _offsetArm.LastLoc;
            camera.EulerAngle          = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation;
            camera.EulerAngle.x        = YawPitchUtility.Normalize(camera.EulerAngle.x);
            camera.EulerAngle.y        = YawPitchUtility.Normalize(camera.EulerAngle.y);
            camera.EulerAngle.z        = YawPitchUtility.Normalize(camera.EulerAngle.z);
            camera.Fov  = calsOut.Fov;
            camera.Far  = calsOut.Far;
            camera.Near = calsOut.Near;

#if UNITY_EDITOR
            var p1 = calsOut.ArchorPosition;
            var p2 = _archoroffsetArm.LastLoc;
            var p3 = startingPosition;
            var p4 = _offsetArm.LastLoc;

            Debug.DrawLine(p1, p2, Color.red);
            Debug.DrawLine(p2, p3, Color.green);
            Debug.DrawLine(p3, p4, Color.blue);
#endif
        }
Exemplo n.º 7
0
 private static void CalcuFreeMoveEularAngle(FreeMoveEntity observedFreeMove, CameraFinalOutputNewComponent camera,
                                             CameraStateOutputNewComponent calsOut)
 {
     if (observedFreeMove.hasFreeMoveController && observedFreeMove.freeMoveController.ControllType ==
         (byte)EFreeMoveControllType.FixFocusPos)
     {
         var aimAt = observedFreeMove.freeMoveController.FocusOnPosition.ShiftedVector3();
         var vect  = aimAt - observedFreeMove.position.Value;
         camera.EulerAngle = Quaternion.LookRotation(vect).eulerAngles;
     }
     else
     {
         camera.EulerAngle = calsOut.ArchorEulerAngle + calsOut.EulerAngle;
     }
 }
Exemplo n.º 8
0
 private bool BuildingRestrictTest(CameraStateOutputNewComponent calsOut, PlayerEntity player)
 {
     if (player.stateInterface.State.GetActionState() != ActionInConfig.Gliding &&
         player.stateInterface.State.GetActionState() != ActionInConfig.Parachuting &&
         player.gamePlay.GameState != Components.GameState.AirPlane)
     {
         var realHeight = HeightTest(player, MaxTestHeight);
         if (realHeight >= 0)
         {
             if (realHeight < MaxTestHeight)
             {
                 return(true);
             }
         }
     }
     return(false);
 }
Exemplo n.º 9
0
        public bool TestArchorOffset(CameraStateOutputNewComponent calsOut, PlayerEntity player, ref Vector3 startPoint)
        {
            float      radius      = player.characterContoller.Value.radius;
            var        center      = calsOut.ArchorPosition + calsOut.ArchorOffset.normalized * (player.characterContoller.Value.height - radius);
            var        direction   = calsOut.ArchorOffset.normalized;
            var        maxDistance = calsOut.ArchorOffset.magnitude - player.characterContoller.Value.height;
            RaycastHit hitInfo;

            if (Physics.CapsuleCast(center, center, radius, direction, out hitInfo, maxDistance))
            {
                var realdict = hitInfo.distance;
                if (realdict <= maxDistance)
                {
                    startPoint.y = hitInfo.point.y - calsOut.ArchorPosition.y - DistanceOffset;
                    return(true);
                }
            }
            return(false);
        }
Exemplo n.º 10
0
        private void CalcuForNormal(IUserCmd cmd, PlayerEntity player, CameraStateOutputNewComponent result)
        {
            DummyCameraMotorState.Convert(player.cameraStateNew, _state);

            DummyCameraMotorInput _input = (DummyCameraMotorInput)player.cameraStateNew.CameraMotorInput;

            _input.Generate(player, cmd, _state, LockView);

            if (!HasConfigInitialed(_input))
            {
                return;
            }

            for (int i = 0; i < (int)SubCameraMotorType.End; i++)
            {
                var type = (SubCameraMotorType)i;
                SetNextMotor(player, type, _state, _input);
            }

            HandleAction(player);

            _motors.ActionManager.ClearActionCode();

            player.cameraStateNew.CameraMotorInput     = player.cameraStateNew.LastCameraMotorInput;
            player.cameraStateNew.LastCameraMotorInput = _input;

            player.cameraConfigNow.Config     = _input.GetPoseConfig(_state.GetMainMotor().NowMode);
            player.cameraConfigNow.PeekConfig = _input.GetPeekConfig();
            player.cameraConfigNow.DeadConfig = _input.GetDeadConfig();

            CalcFinalOutput(player, (DummyCameraMotorInput)player.cameraStateNew.LastCameraMotorInput,
                            result, _state);

            DummyCameraMotorState.Convert(_state, player.cameraStateNew);
            player.cameraStateNew.CanFire =
                !_state.IsFree() && _input.GetPoseConfig(player.cameraStateNew.MainNowMode).CanFire;
        }
Exemplo n.º 11
0
        private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera,
                                      Vector3 punchRotation, PlayerEntity player)
        {
            Vector3 lToCamera  = calsOut.Offset;
            var     clientTime = player.time.ClientTime;

            float lNewDistance = lToCamera.magnitude;

            bool collided = false;

            var startingRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation);
            var realArchorStart  = calsOut.ArchorOffset;

            if (player.stateInterface.State.GetActionState() != ActionInConfig.Gliding &&
                player.stateInterface.State.GetActionState() != ActionInConfig.Parachuting &&
                player.gamePlay.GameState != Components.GameState.AirPlane)
            {
                TestArchorOffset(calsOut, player, ref realArchorStart);
            }

            var archorRotation   = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0);
            var postOffsetFactor = ActualStartingPosition(
                calsOut.ArchorPosition + archorRotation * realArchorStart, archorRotation,
                calsOut.ArchorPostOffset + calsOut.PostOffset, _collisionLayers);

            var startingPosition = calsOut.FinalArchorPosition =
                calsOut.ArchorPosition + archorRotation * (realArchorStart +
                                                           calsOut.ArchorPostOffset * postOffsetFactor +
                                                           calsOut.PostOffset * postOffsetFactor);

            float actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers);
            var   factor         = 1f;

            if (actualDistance < lNewDistance)
            {
                collided = true;
                if (actualDistance < _collisionOffsetStartDistance)
                {
                    factor           = Mathf.Lerp(_collisionOffsetStartDistance, actualDistance, actualDistance / lNewDistance) / lNewDistance;
                    startingPosition = calsOut.ArchorPosition + archorRotation * (realArchorStart +
                                                                                  calsOut.ArchorPostOffset * factor *
                                                                                  postOffsetFactor +
                                                                                  calsOut.PostOffset * postOffsetFactor *
                                                                                  factor);
                    actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers);
                    if (actualDistance >= lNewDistance)
                    {
                        collided = false;
                    }
                }
            }

            var finalPostOffset = calsOut.Offset.normalized * actualDistance;

            if (collided && !player.appearanceInterface.Appearance.IsFirstPerson)
            {
                camera.LastCollisionOffset = finalPostOffset;
                camera.LastCollisionTime   = clientTime;
            }
            else if (clientTime - camera.LastCollisionTime < camera.PostTransitionTime &&
                     !player.appearanceInterface.Appearance.IsFirstPerson)
            {
                finalPostOffset = PositionLerp(camera.LastCollisionOffset, finalPostOffset,
                                               (float)(clientTime - camera.LastCollisionTime) / camera.PostTransitionTime);
            }

            camera.PlayerFocusPosition = startingPosition;
            camera.Position            = startingPosition + startingRotation * (finalPostOffset);
            camera.EulerAngle          = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation;
            camera.EulerAngle.x        = YawPitchUtility.Normalize(camera.EulerAngle.x);
            camera.EulerAngle.y        = YawPitchUtility.Normalize(camera.EulerAngle.y);
            camera.EulerAngle.z        = YawPitchUtility.Normalize(camera.EulerAngle.z);
            camera.Fov  = calsOut.Fov;
            camera.Far  = calsOut.Far;
            camera.Near = calsOut.Near;

#if UNITY_EDITOR
            var p1 = calsOut.ArchorPosition;
            var p2 = calsOut.ArchorPosition + archorRotation * calsOut.ArchorOffset;
            var p3 = calsOut.ArchorPosition +
                     archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor);
            var p4 = calsOut.ArchorPosition +
                     archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor +
                                       calsOut.PostOffset * postOffsetFactor * factor);
            var p5 = p4 + startingRotation * (calsOut.Offset.normalized * actualDistance);
            Debug.DrawLine(p1, p2, Color.red);
            Debug.DrawLine(p2, p3, Color.green);
            Debug.DrawLine(p3, p4, Color.blue);
            Debug.DrawLine(p4, p5, Color.yellow);
#endif
        }
Exemplo n.º 12
0
        private void UpdateCollisions(CameraStateOutputNewComponent calsOut, CameraFinalOutputNewComponent camera,
                                      Vector3 punchRotation)
        {
            Vector3 lToCamera = calsOut.Offset;

            float lNewDistance = lToCamera.magnitude;

            bool collided = false;

            var archorRotation   = Quaternion.Euler(0, calsOut.ArchorEulerAngle.y, 0);
            var postOffsetFactor = ActualStartingPosition(
                calsOut.ArchorPosition + archorRotation * calsOut.ArchorOffset, archorRotation,
                calsOut.ArchorPostOffset + calsOut.PostOffset, _collisionLayers);
            var startingPosition = calsOut.FinalArchorPosition =
                calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset +
                                                           calsOut.ArchorPostOffset * postOffsetFactor +
                                                           calsOut.PostOffset * postOffsetFactor);
            var startingRotation = Quaternion.Euler(calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation);

            float actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers);
            var   factor         = 1f;

            if (actualDistance < lNewDistance)
            {
                if (actualDistance < _collisionOffsetStartDistance)
                {
                    factor           = actualDistance / lNewDistance;
                    startingPosition = calsOut.ArchorPosition + archorRotation * (calsOut.ArchorOffset +
                                                                                  calsOut.ArchorPostOffset * factor *
                                                                                  postOffsetFactor +
                                                                                  calsOut.PostOffset * postOffsetFactor *
                                                                                  factor);
                    actualDistance = ActualDistance(startingRotation, startingPosition, lNewDistance, _collisionLayers);
                }
            }


            camera.PlayerFocusPosition = startingPosition;
            camera.Position            = startingPosition + startingRotation * (calsOut.Offset.normalized * actualDistance);
            camera.EulerAngle          = calsOut.ArchorEulerAngle + calsOut.EulerAngle + punchRotation;
            camera.EulerAngle.x        = YawPitchUtility.Normalize(camera.EulerAngle.x);
            camera.EulerAngle.y        = YawPitchUtility.Normalize(camera.EulerAngle.y);
            camera.EulerAngle.z        = YawPitchUtility.Normalize(camera.EulerAngle.z);
            camera.Fov  = calsOut.Fov;
            camera.Far  = calsOut.Far;
            camera.Near = calsOut.Near;

#if UNITY_EDITOR
            var p1 = calsOut.ArchorPosition;
            var p2 = calsOut.ArchorPosition + archorRotation * calsOut.ArchorOffset;
            var p3 = calsOut.ArchorPosition +
                     archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor);
            var p4 = calsOut.ArchorPosition +
                     archorRotation * (calsOut.ArchorOffset + calsOut.ArchorPostOffset * factor * postOffsetFactor +
                                       calsOut.PostOffset * postOffsetFactor * factor);
            var p5 = p4 + startingRotation * (calsOut.Offset.normalized * actualDistance);
            Debug.DrawLine(p1, p2, Color.red);
            Debug.DrawLine(p2, p3, Color.green);
            Debug.DrawLine(p3, p4, Color.blue);
            Debug.DrawLine(p4, p5, Color.yellow);
#endif
        }