Files
FueraDeEscala/Assets/Game Kit Controller/Scripts/Player/playerController.cs
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

11407 lines
353 KiB
C#

using UnityEngine;
using System.Collections;
using UnityEngine.Events;
using System.Collections.Generic;
using System.Linq;
public class playerController : MonoBehaviour
{
[Header ("Movement Settings")]
[Space]
[Tooltip ("Sets how high/far the player will jump under normal circumstances.")]
public float jumpPower = 12;
public float airSpeed = 6;
public float airControl = 2;
public bool ignorePlayerExtraRotationOnAirEnabled;
public float stationaryTurnSpeed = 180;
public float movingTurnSpeed = 200;
public bool useTurnSpeedOnAim = true;
public float autoTurnSpeed = 2;
public float aimTurnSpeed = 10;
public float thresholdAngleDifference = 5;
public bool regularMovementOnBulletTime;
public bool useMoveInpuptMagnitedeToForwardAmount;
[Space]
[Header ("Main Capsule Settings")]
[Space]
public bool setCustomCapsuleCenter;
public Vector3 customCapsuleCenter;
public Vector3 customCapsuleCenterOnCrouch;
[Space]
[Header ("Animator Settings")]
[Space]
public int baseLayerIndex = 0;
public float inputHorizontalLerpSpeed = 0.03f;
public float inputVerticalLerpSpeed = 0.03f;
public float inputStrafeHorizontalLerpSpeed = 0.3f;
public float inputStrafeVerticalLerpSpeed = 0.3f;
public float animatorForwardInputLerpSpeed = 0.1f;
public float animatorTurnInputLerpSpeed = 0.1f;
public float moveSpeedMultiplier = 1;
public float animSpeedMultiplier = 1;
public float minTimeToSetIdleOnStrafe = 0.5f;
public bool overrideAnimationSpeedActive;
public float characterRadius;
public bool usingAnimator = true;
[Space]
[Header ("Animator ID State")]
[Space]
public float currentIdleID;
public int currentStrafeID;
public int currentAirID;
public int currentCrouchID;
public int currentAirSpeed = 1;
public int currentShieldActive;
public int currentUseStrafeLanding = 0;
public int currentWeaponID = 0;
bool usingNewWeaponID;
[Space]
[Header ("Tank Controls Animator Settings")]
[Space]
public float inputTankControlsHorizontalLerpSpeed = 0.3f;
public float inputTankControlsVerticalLerpSpeed = 0.3f;
public float inputTankControlsHorizontalStrafeLerpSpeed = 0.06f;
public float inputTankControlsVerticalStrafeLerpSpeed = 0.06f;
[Space]
[Header ("Player Status ID Settings")]
[Space]
public int playerStatusID;
public float playerStatusIDLerpSpeed = 0.1f;
[Space]
[Header ("Ground Detection Settings")]
[Space]
public LayerMask layer;
public float rayDistance;
public bool updateFootStepStateActive = true;
public bool useSphereRaycastForGroundDetection;
public float sphereCastRadius = 0.4f;
public float maxDistanceSphereCast = 0.5f;
public float sphereCastOffset;
public float maxExtraRaycastDistanceToGroundDetection = 0.4f;
public bool checkIfSurfaceBelowIsTerrainEnabled = true;
[Space]
[Header ("Walk/Run Sprint Settings")]
[Space]
[Range (0, 1)] public float walkSpeed = 1;
public bool increaseWalkSpeedEnabled;
public float increaseWalkSpeedValue = 1;
public bool holdButtonToKeepIncreasedWalkSpeed;
[TextArea (3, 8)]
public string walkRunTip = "Set 'Sprint Enabled' field to false and change 'Walk Speed' to 0.5 to start the " +
"game walking and toggle to run. Or set 'Increase Walk Speed Value' to 0.5 to vice versa.";
[Space]
[Header ("Sprint Settings")]
[Space]
public bool sprintEnabled = true;
public bool changeCameraFovOnSprint = true;
public bool shakeCameraOnSprintThirdPerson = true;
public string sprintThirdPersonCameraShakeName = "Sprint Shake";
public bool canRunThirdPersonActive = true;
public bool useSecondarySprintValues = true;
public float sprintVelocity = 1;
public float sprintJumpPower = 15;
public float sprintAirSpeed = 20;
public float sprintAirControl = 4;
public bool runOnCrouchEnabled = true;
[Space]
[Header ("Ground Adherence Settings")]
[Space]
public float regularGroundAdherence = 5;
public float slopesGroundAdherenceUp = 2;
public float slopesGroundAdherenceDown = 4;
[Range (0, 1)] public float maxRayDistanceRange = 0.5f;
[Range (0, 1)] public float maxSlopeRayDistance = 0.5f;
[Range (0, 1)] public float maxStairsRayDistance = 0.5f;
[Tooltip ("Max surface to walk, higher slopes will make the player to enter on air state")]
public bool useMaxWalkSurfaceAngle;
public float maxWalkSurfaceAngle;
public bool useMaxDistanceToCheckSurfaceAngle;
public float maxDistanceToCheckSurfaceAngle;
public bool useMaxSlopeInclination = true;
public float maxSlopeInclination = 80;
public float minSlopeInclination = -80;
[Space]
[Header ("Root Motion Settings")]
[Space]
public bool useRootMotionActive = true;
public float noRootLerpSpeed;
public float noRootWalkMovementSpeed;
public float noRootRunMovementSpeed;
public float noRootSprintMovementSpeed;
public float noRootCrouchMovementSpeed;
public float noRootCrouchRunMovementSpeed = 4;
public float noRootWalkStrafeMovementSpeed;
public float noRootRunStrafeMovementSpeed;
public float noRootDelayToMoveOnLand = 0.2f;
public bool disableRootMotionTemporalyOnLandThirdPerson;
public float durationDisableRootMotionTemporalyOnLandThirdPerson;
public float waitToDisableRootMotionTemporalyOnLandThirdPerson;
bool forceUseRootMotionActive;
[Space]
[Header ("Player ID Settings")]
[Space]
public int playerID;
public bool playerIsNonLocalAvatar;
public int playerNonLocalAvatarID;
[Space]
[Header ("AI Settings")]
[Space]
public bool usedByAI;
[Space]
[Header ("First Person Settings")]
[Space]
public float noAnimatorSpeed;
public float noAnimatorWalkMovementSpeed;
public float noAnimatorRunMovementSpeed;
public float noAnimatorCrouchMovementSpeed;
public float noAnimatorRunCrouchMovementSpeed;
public float noAnimatorStrafeMovementSpeed;
public bool noAnimatorCanRun;
public float noAnimatorWalkBackwardMovementSpeed;
public float noAnimatorRunBackwardMovementSpeed;
public float noAnimatorCrouchBackwardMovementSpeed;
public float noAnimatorRunCrouchBackwardMovementSpeed;
public float noAnimatorStrafeBackwardMovementSpeed;
public bool noAnimatorCanRunBackwards;
public float noAnimatorAirSpeed = 11;
public float maxVelocityChange;
public float noAnimatorMovementSpeedMultiplier = 1;
public float noAnimatorSlopesGroundAdherenceUp = 1;
public float noAnimatorSlopesGroundAdherenceDown = 8;
public float noAnimatorStairsGroundAdherence = 2;
[Space]
[Header ("Full Body Awareness Settings")]
[Space]
public float FBAWalkMovementSpeed = 4;
public float FBARunMovementSpeed = 8;
public float FBASprintMovementSpeed = 12;
public float FBACrouchMovementSpeed = 3;
public float FBACrouchRunMovementSpeed = 6;
public float FBAWalkStrafeMovementSpeed = 5;
public float FBARunStrafeMovementSpeed = 9;
public bool useFBACustomMoveSpeedMultiplier;
public float FBACustomMoveSpeedMultiplier;
public bool ignoreFBACustomMoveSpeedMultiplierOnActionActive = true;
[Space]
[Header ("Advanced Settings")]
[Space]
[Space]
[Header ("Sprint Settings")]
[Space]
public bool useEventOnSprint;
public UnityEvent eventOnStartSprint;
public UnityEvent eventOnStopSprint;
[Space]
[Header ("Look In Camera Direction Settings")]
[Space]
public bool lookAlwaysInCameraDirection;
public bool lookInCameraDirectionIfLookingAtTarget;
public bool lookOnlyIfMoving;
public bool lookInCameraDirectionOnCrouchState;
public bool ignoreStrafeStateOnAirEnabled = true;
public bool updateUseStrafeLandingEnabled;
public bool disableLookAlwaysInCameraDirectionIfIncreaseWalkSpeedActive;
public float defaultStrafeWalkSpeed = 1;
public float defaultStrafeRunSpeed = 2;
public bool rotateDirectlyTowardCameraOnStrafe;
public float strafeLerpSpeed = 0.1f;
public bool updateHeadbobState;
[Space]
[Header ("Quick Movement Turn Settings")]
[Space]
public bool checkQuickMovementTurn180DegreesOnRun;
public float minDelayToActivateQuickMovementTurn180OnRun = 2;
public float quickTurnMovementDurationWalking = 1;
public float quickTurnMovementDurationRunning = 0.8f;
public float quickTurnMovementDurationSprinting = 2.1f;
public float quickTurnMovementRotationSpeed = 2;
[Space]
[Header ("Character Mesh Settings")]
[Space]
public GameObject characterMeshGameObject;
public List<GameObject> extraCharacterMeshGameObject = new List<GameObject> ();
public eventParameters.eventToCallWithBool characterMeshesListToDisableOnEvent;
public bool checkCharacterMeshIfGeneratedOnStart;
public GameObject objectToCheckCharacterIfGeneratedOnStart;
[Space]
[Header ("Move While Aim Settings")]
[Space]
public bool canMoveWhileAimFirstPerson = true;
public bool canMoveWhileAimThirdPerson = true;
public bool canMoveWhileFreeFireOnThirdPerson = true;
[Space]
[Header ("New Ground Adherence Settings")]
[Space]
[Tooltip ("Improved ground adherence with better settings and movement")]
public bool useNewGroundAdherenceEnabled;
[Tooltip ("Distance to check the ground below the player with raycast")]
public float groundRaycastDistance = 2f;
[Tooltip ("Speed to adjust the player to the surface detected on the movement or idle")]
public float groundLerpSpeed = 15f;
[Tooltip ("Max height for steps or stairs on the surface")]
public float maxStepHeight = 0.5f;
[Tooltip ("Max surface slope that the player can walk")]
public float maxSlopeAngle = 45f;
[Tooltip ("Min angle to use normalized input value, to allow better movement on slopes")]
public float minAngleToUsedInputNormalized = 25;
[Tooltip ("Raycast range around the player position used for the movement input")]
[Range (0, 1)] public float raycastPositionRange = 1;
[Tooltip ("Raycast distance to check surface below the player on idle")]
public float raycastDistanceOnSphereCastOnIdle = 0.75f;
[Tooltip ("Radius to check for height difference around the player center position, to check for steps")]
public float heightDiffRaycastRadius = 1.5f;
[Tooltip ("Duration that the player takes to be moved to the step detected")]
public float durationToWalkToStep = 0.5f;
[Tooltip ("Min height to check for steps in front of the player, using the feet as center position")]
public float checkStepRaycastHeight = 0.2f;
[Tooltip ("Extra distance to check for steps around player's center")]
public float checkStepRaycastDistance = 0.2f;
[Space]
[Header ("Stairs Settings")]
[Space]
public float stairsMinValue = 0.2f;
public float stairsMaxValue = 0.25f;
public float stairsGroundAdherence = 8;
public bool checkStairsWithInclination;
public float minStairInclination = -10;
public float maxStairInclination = 10;
public bool checkForStairAdherenceSystem;
public float currentStairAdherenceSystemMaxValue;
public float currentStairAdherenceSystemMinValue;
public float currentStairAdherenceSystemAdherenceValue;
[Space]
[Header ("Locked Camera Settings")]
[Space]
public lockedPlayerMovementMode lockedPlayerMovement;
[Range (0, 1)] public float tankModeRotationSpeed;
public bool canMoveWhileAimLockedCamera = true;
public bool crouchVerticalInput2_5dEnabled;
bool moveInXAxisOn2_5d;
[Space]
[Header ("Gravity Settings")]
[Space]
public float gravityMultiplier = 2;
public float gravityForce = -9.8f;
public bool useMaxFallSpeed;
public float maxFallSpeed;
[Space]
[Header ("Physics Settings")]
[Space]
public PhysicsMaterial zeroFrictionMaterial;
public PhysicsMaterial highFrictionMaterial;
[Space]
[Header ("Jump Settings")]
[Space]
public bool enabledRegularJump;
public bool enabledDoubleJump;
public int maxNumberJumpsInAir;
[Range (0, 1)] public float jumpMassMultiplier = 1;
public bool useNewDoubleJumpPower;
public float doubleJumpPower = 10;
public float readyToDoubleJumpTime = 0.2f;
public bool removeVerticalSpeedOnDoubleJump;
public bool holdJumpSlowDownFallEnabled = true;
public float slowDownGravityMultiplier;
public float readyToJumpTime = 0.25f;
public bool ignoreAnimatorGroundStateOnJumpCheck;
public bool addJumpForceWhileButtonPressed;
public float addJumpForceDuration;
public float jumpForceAmontWhileButtonPressed;
public float minWaitToAddJumpForceAfterButtonPressed;
public bool useJumpForceOnAirJumpEnabled;
public bool keepLastMovementInputOnJump;
public float keepLastMovementInputOnJumpDuration;
public bool allowRegularAirInputControlOnAirAfterJumpDuration;
public bool allowAirControlOnKeepLastMovementInputOnJump;
public bool useDelayOnGroundJump;
public float delayOnGroundJump;
public bool useDelayOnGroundJumpOnlyIfNotMoving;
public bool ignoreDelayOnGroundJumpOnFBA = true;
public bool useEventOnDelayOnGroundJump;
public UnityEvent eventOnDelayOnGroundJump;
public bool useEventOnJump;
public UnityEvent eventOnJump;
public bool useEventOnGroundJump;
public UnityEvent eventOnGroundJump;
public bool useEventOnLandFromJumpInput;
public UnityEvent eventOnLandFromJumpInput;
public bool useEventOnLand;
public UnityEvent eventOnLand;
public bool stopCrouchOnJumpEnabled;
public bool useEventOnDoubleJump;
public UnityEvent eventOnDoubleJump;
public bool useEventOnAirborne;
public UnityEvent eventOnAirborne;
[Space]
public bool checkObstacleAbovePlayerOnJumpEnabled;
public float checkObstacleAbovePlayerOnJumpRaycastDistance;
public LayerMask checkObstacleAbovePlayerOnJumpLayermask;
[Space]
[Header ("Fall Damage Settings")]
[Space]
public bool fallDamageEnabled;
[Tooltip ("The time a player can be in the air and falling before they may receive damage.")]
public float maxTimeInAirBeforeGettingDamage = 4;
public float fallingDamageMultiplier = 0.2f;
public float minPlayerVelocityToApplyDamageThirdPerson = 15;
public float minPlayerVelocityToApplyDamageFirstPerson = 10;
public bool ignoreShieldOnFallDamage;
public int damageTypeIDOnFallDamage = -1;
public bool applyFallDamageEnabled = true;
bool fallDamageCheckOnHealthPaused;
public bool callEventOnFallDamage;
public float minTimeOnAirToUseEvent;
public bool callEventOnlyIfPlayerAlive;
public UnityEvent eventOnFallDamage;
[Space]
[Header ("Land Mark Settings")]
[Space]
public bool useLandMark;
public float maxLandDistance;
public float minDistanceShowLandMark;
public GameObject landMark;
public Transform landMark1;
public Transform landMark2;
[Space]
[Header ("Player Modes Settings")]
[Space]
public bool canUseSphereMode;
[Space]
[Header ("Vehicle Settings")]
[Space]
public bool canGetOnVehicles;
public bool canDrive;
[Space]
[Header ("Crouch Settings")]
[Space]
public float capsuleHeightOnCrouch = 1;
public bool getUpIfJumpOnCrouchInThirdPerson;
public bool getUpIfJumpOnCrouchInFirstPerson;
public bool useAutoCrouch;
public LayerMask layerToCrouch;
public bool useCustomLayerToCheckIfPlayerCanGetUpFromCrouch;
public LayerMask customLayerToCheckIfPlayerCanGetUpFromCrouch;
public float raycastDistanceToAutoCrouch;
public Transform autoCrouchRayPosition;
public Vector3 secondRaycastOffset;
public bool canCrouchWhenUsingWeaponsOnThirdPerson = true;
[Space]
[Header ("Obstacle Detection To Avoid Movement Settings")]
[Space]
public bool useObstacleDetectionToAvoidMovement;
public float obstacleDetectionToAvoidMovementRaycastDistance = 0.5f;
public float obstacleDetectionRaycastDistanceRightAndLeft = 0.1f;
public float obstacleDetectionRaycastHeightOffset;
public LayerMask obstacleDetectionToAvoidMovementLayermask;
[Space]
[Header ("Abilities Settings")]
[Space]
[Space]
[Header ("Crouch Sliding Settings")]
[Space]
public bool crouchSlidingEnabled;
public float noAnimatorCrouchSlidingSpeed;
public float noAnimatorCrouchSlidingDuration;
public float noAnimatorCrouchSlidingLerpSpeed;
public float noAnimatorCrouchSlidingLerpDelay;
public bool getUpAfterCrouchSlidingEnd;
public bool keepCrouchSlidingOnInclinatedSurface;
public float minInclinitaonSurfaceAngleToCrouchcSliding;
public bool crouchSlidingOnAirEnabled;
public float noAnimatorCrouchSlidingOnAirSpeed;
public bool useNoAnimatorCrouchSlidingDurationOnAir;
public float noAnimatorCrouchSlidingDurationOnAir;
public UnityEvent eventOnCrouchSlidingStart;
public UnityEvent eventOnCrouchSlidingEnd;
public bool useCrouchSlidingOnThirdPersonEnabled;
public UnityEvent eventOnCrouchSlidingThirdPersonStart;
public UnityEvent eventOnCrouchSlidingThirdPersonEnd;
bool slidindOnThirdPersonActive;
[Space]
[Header ("Wall Running Settings")]
[Space]
public bool wallRunningEnabled;
public externalControllerBehavior wallRunningExternalControllerBehavior;
[Space]
[Header ("Air Dash Settings")]
[Space]
public bool airDashEnabled;
public float airDashForce = 20;
public float airDashColdDown = 0.5f;
public bool pauseGravityForce;
public float gravityForcePausedTime = 1;
public bool resetGravityForceOnDash;
public bool useDashLimit;
public int dashLimit;
public bool changeCameraFovOnDash;
public float cameraFovOnDash;
public float cameraFovOnDashSpeed;
public float minTimeOnAirToUseAirDash = 0.5f;
[Space]
public bool useEventsOnAirDash;
public UnityEvent eventOnAirDashThirdPerson;
public UnityEvent eventOnAirDashFirstPerson;
[Space]
[Header ("Zero Gravity Settings")]
[Space]
public float zeroGravityMovementSpeed;
public float zeroGravityControlSpeed;
public float zeroGravityLookCameraSpeed;
public bool useGravityDirectionLandMark;
public Transform forwardSurfaceRayPosition;
public float maxDistanceToAdjust;
public bool pauseCheckOnGroundStateZG;
public bool pushPlayerWhenZeroGravityModeIsEnabled;
public float pushZeroGravityEnabledAmount;
public bool canMoveVerticallyOnZeroGravity;
public bool canMoveVerticallyAndHorizontalZG;
public float zeroGravitySpeedMultiplier = 1.4f;
float currentZeroGravitySpeedMultiplier = 1;
public float zeroGravityModeVerticalSpeed = 2;
public bool useMaxAngleToCheckOnGroundStateZGFF;
public float maxAngleToChekOnGroundStateZGFF;
public bool ignoreSetCheckOnGrundStatePausedFFOrZGStateActive;
[Space]
[Header ("Free Floating Mode Settings")]
[Space]
public float freeFloatingMovementSpeed;
public float freeFloatingControlSpeed;
public bool pauseCheckOnGroundStateFF;
public bool canMoveVerticallyOnFreeFloating;
public bool canMoveVerticallyAndHorizontalFF;
public float freeFloatingSpeedMultiplier = 1.4f;
public float pushFreeFloatingModeEnabledAmount;
public float freeFloatingModeVerticalSpeed = 2;
[Space]
[Header ("Ragoll Settings")]
[Space]
public bool activateRagdollOnFallState;
public float minWaitTimeToActivateRagdollOnFall;
public float minSpeedToActivateRagdollOnFall;
public float pushRagdollMultiplierOnFall;
public eventParameters.eventToCallWithVector3 eventToActivateRagdollOnFall;
[Space]
[Header ("Debug")]
[Space]
[Space]
[Header ("Controller State")]
[Space]
public bool playerOnGround;
public bool isMoving;
public Vector3 moveInput;
public bool jump;
public bool running;
public bool crouching = false;
public bool canMove = true;
public bool slowingFall;
public bool isDead;
float lastTimeResurrect;
public bool playerSetAsChildOfParent;
Transform currentTemporalPlayerParent;
public bool useRelativeMovementToLockedCamera;
public bool ladderFound;
public bool ignoreCameraDirectionOnMovement;
public bool strafeModeActive;
public footStepState currentFootStepState;
public headbobState currentHeadbobState;
public bool actionActive;
public bool rootMotionCurrentlyActive;
public bool usingGenericModelActive;
public bool canMoveAI = true;
[Space]
[Header ("Ground Adherence State")]
[Space]
public bool adhereToGround;
public float distanceToGround;
public float hitAngle;
public bool slopeFound;
public bool movingOnSlopeUp;
public bool movingOnSlopeDown;
public bool stairsFound;
public bool stairAdherenceSystemDetected;
public bool wallRunningActive;
public bool crouchSlidingActive;
public bool terrainDetected;
[Space]
[Header ("New Ground Adherence State")]
[Space]
public bool isGrounded;
public bool stickToGroundOnIdleResult;
public bool adjustPositionResult;
public float groundHeightDifference;
public bool futureHasGround;
public bool stepsDetected;
public float futureSurfaceAngle;
public bool movingTowardWall;
public float extraHeightDiffRaycastRadius = 0;
public float customMaxStepHeight = 0;
public bool ignoreNewGroundAdherenceActive;
[Space]
[Header ("Weapons And Powers State")]
[Space]
public bool playerIsAiming;
public bool aimingInThirdPerson;
public bool aimingInFirstPerson;
public bool usingFreeFireMode;
public bool lookInCameraDirectionOnFreeFireActive;
public bool playerUsingMeleeWeapons;
bool playerMeleeWeaponThrown;
[Space]
[Header ("Mode State")]
[Space]
public bool jetPackEquiped;
public bool usingJetpack;
public bool flyModeActive;
public bool swimModeActive;
public bool sphereModeActive;
public bool freeClimbActive;
public bool grabbingToSurfaceActive;
public bool adjustingToSurfaceToGrabInProcess;
public bool enableExternalForceOnSwimMode;
public bool enableExternalForceOnFlyMode;
public bool carryingPhysicalObject;
[Space]
[Header ("Camera State")]
[Space]
public bool lockedCameraActive;
public bool lookInCameraDirectionActive;
public bool firstPersonActive;
public bool update2_5dClampedPositionPaused;
[Space]
[Header ("Other Elements State")]
[Space]
public bool usingDevice;
public bool visibleToAI = true;
public bool stealthModeActive;
public bool playerNavMeshEnabled;
public bool ignoreExternalActionsActiveState;
public bool movingOnPlatformActive;
bool movingInsideVehicle;
[Space]
[Header ("Menu Elements State")]
[Space]
public bool usingSubMenu;
public bool playerMenuActive;
public bool gamePaused;
[Space]
[Header ("Vehicle State")]
[Space]
public bool driving;
public bool drivingRemotely;
public bool overridingElement;
public string currentVehicleName;
float lastTimeDriving = -1;
[Space]
[Header ("Gravity State")]
[Space]
public bool gravityForcePaused;
public bool zeroGravityModeOn;
public bool freeFloatingModeOn;
public Vector3 currentNormal = new Vector3 (0, 1, 0);
public bool checkOnGroundStatePausedFFOrZG;
public bool checkOnGroundStatePaused;
[Space]
[Header ("Gizmo State")]
[Space]
public bool showDebugPrint;
public bool showGizmo;
public Color gizmoColor;
public Color gizmoLabelColor;
public float gizmoRadius;
//ANIMATOR VALUES
[Space]
[Header ("ANIMATOR ID VALUES")]
[Space]
public string forwardAnimatorName = "Forward";
public string turnAnimatorName = "Turn";
public string horizontalAnimatorName = "Horizontal";
public string verticalAnimatorName = "Vertical";
public string horizontalStrafeAnimatorName = "Horizontal Strafe";
public string verticalStrafeAnimatorName = "Vertical Strafe";
public string onGroundAnimatorName = "OnGround";
public string crouchAnimatorName = "Crouch";
public string movingAnimatorName = "Moving";
public string jumpAnimatorName = "Jump";
public string jumpLegAnimatorName = "JumpLeg";
public string strafeModeActiveAnimatorName = "Strafe Mode Active";
public string movementInputActiveAnimatorName = "Movement Input Active";
public string movementRelativeToCameraAnimatorName = "Movement Relative To Camera";
public string movementIDAnimatorName = "Movement ID";
public string playerModeIDAnimatorName = "Player Mode ID";
public string movementSpeedAnimatorName = "Movement Speed";
public string lastTimeInputPressedAnimatorName = "Last Time Input Pressed";
public string carryingWeaponAnimatorName = "Carrying Weapon";
public string aimingModeActiveAnimatorName = "Aiming Mode Active";
public string playerStatusIDAnimatorName = "Player Status ID";
public string idleIDAnimatorName = "Idle ID";
public string strafeIDAnimatorName = "Strafe ID";
public string crouchIDAnimatorName = "Crouch ID";
public string airIDAnimatorName = "Air ID";
public string airSpeedAnimatorName = "Air Speed";
public string quickTurnRightDirectionName = "Quick Turn Right Direction";
public string quickTurnLeftDirectionName = "Quick Turn Left Direction";
public string quickTurnDirectionIDSpeedName = "Quick Turn Direction ID";
public string shieldActiveAnimatorName = "Shield Active";
public string inputAmountName = "Input Amount";
public string useStrafeLandingName = "Use Strafe Landing";
public string weaponIDAnimatorName = "Weapon ID";
public string rightArmdIDAnimatorName = "Right Arm ID";
public string leftArmIDAnimatorName = "Left Arm ID";
public string timeOnAirAnimatorName = "Time On Air";
public string animatorDeathLayerName = "Death";
public string animatorDialogueLayerName = "Dialogue";
public string animatorArmsLayerName = "Arms";
public string animatorRightHandLayerName = "Right Hand";
public string animatorLeftHandLayerName = "Left Hand";
public string animatorRightArmLayerName = "Right Arm";
public string animatorLeftArmLayerName = "Left Arm";
public string animatorFBAActiveName = "FBA Active";
[Space]
[Header ("Character Components")]
[Space]
//Player components
public headBob headBobManager;
public playerInputManager playerInput;
public playerWeaponsManager weaponsManager;
public healthManagement healthManager;
public IKSystem IKSystemManager;
public Transform playerTransform;
//Camera variables
public GameObject playerCameraGameObject;
public Transform playerCameraTransform;
public Transform mainCameraTransform;
public cameraControllerManager playerCameraManager;
public Animator animator;
public footStepManager stepManager;
public Rigidbody mainRigidbody;
public gravityObjectManager gravityManager;
public characterStateIconSystem characterStateIconManager;
public CapsuleCollider capsule;
public Collider mainCollider;
public bool useExtraColliderList;
public List<Collider> extraColliderList = new List<Collider> ();
public GameObject AIElements;
public playerActionSystem mainPlayerActionSystem;
public bool useEventsOnWalk;
public UnityEvent eventOnWalkStart;
public UnityEvent eventOnWalkEnd;
public bool useEventsOnRun;
public UnityEvent eventOnRunStart;
public UnityEvent eventOnRunEnd;
public bool useEventsOnEnableDisableCharacterMeshes;
public UnityEvent eventOnEnableCharacterMeshes;
public UnityEvent eventOnDisableCharacterMeshes;
public UnityEvent eventOnEnableCharacterMeshesOnEditor;
public UnityEvent eventOnDisableCharacterMeshesOnEditor;
bool playeCurrentlyUsingInput;
int forwardAnimatorID;
int turnAnimatorID;
int horizontalAnimatorID;
int verticalAnimatorID;
int horizontalStrafeAnimatorID;
int verticalStrafeAnimatorID;
int onGroundAnimatorID;
int crouchAnimatorID;
int movingAnimatorID;
int jumpAnimatorID;
int jumpLegAnimatorID;
int strafeModeActiveAnimatorID;
int movementInputActiveAnimatorID;
int movementRelativeToCameraAnimatorID;
int movementIDAnimatorID;
int playerModeIDAnimatorID;
int movementSpeedAnimatorID;
int lastTimeInputPressedAnimatorID;
int carryingWeaponAnimatorID;
int aimingModeActiveAnimatorID;
int playerStatusIDAnimatorID;
int idleIDAnimatorID;
int strafeIDAnimatorID;
int crouchIDAnimatorID;
int airIDAnimatorID;
int airSpeedAnimatorID;
int quickTurnRightDirectionID;
int quickTurnLeftDirectionID;
int quickTurnDirectionIDSpeedID;
int shieldActiveAnimatorID;
int inputAmountID;
int useStrafeLandingID;
int weaponIDAnimatorID;
int rightArmdIDAnimatorID;
int leftArmIDAnimatorID;
int timeOnAirAnimatorID;
int animatorFBAActiveID;
int lastCurrentUseStrafeLandingValue = -1;
float lastForwardAnimatorIDValue = -1;
float lastTurnAnimatorIDValue = -1;
float lastHorizontalAnimatorIDValue = -1;
float lastVerticalAnimatorIDValue = -1;
float lastJumpAnimatorIDValue = -1;
float lastJumpLegAnimatorIDValue = -1;
Vector3 vector3Zero = Vector3.zero;
Quaternion quaternionIdentity = Quaternion.identity;
Vector3 Vector3Up = Vector3.up;
Vector3 playerTransformUp;
Vector3 playerTransformForward;
Vector3 playerTransformRight;
float half = 0.5f;
float halfJumpPower = 0;
//OTHER FIELDS
[HideInInspector] public bool canMoveVertically;
[HideInInspector] public bool canMoveVerticallyAndHorizontal;
[HideInInspector] public bool movingVertically;
float currentFreeFloatingSpeedMultiplier = 1;
float originalStationaryTurnSpeed;
float originalWalkSpeedValue;
bool increaseWalkSpeedActive;
float currentHorizontalInputLerpSpeed;
float currentVerticalInputLerpSpeed;
float currentInputStrafeHorizontalLerpSpeed;
float currentInputStrafeVerticalLerpSpeed;
// public bool useWalkToRunAccelerationChange;
// public float walkToRunAccelerationSpeed = 0.6f;
// float currentWalkSpeedTarget;
bool sprintCanBeUsed = true;
//Input variables
[HideInInspector] public float horizontalInput;
[HideInInspector] public float verticalInput;
[HideInInspector] public Vector2 axisValues;
[HideInInspector] public Vector2 rawAxisValues;
bool movementInputIgnoredOnAimActive;
Vector3 secondaryMoveInput;
Vector3 secondaryMove;
Vector3 stairsMoveInput;
Vector3 airMove;
[HideInInspector] public Vector3 currentMoveInput;
Vector3 lastMoveInputOnJump = Vector3.zero;
bool ignoreLastMoveInputOnJump;
Vector3 lockedCameraMoveInput;
Vector3 currentLockedCameraInput;
Vector3 lockedMove;
Vector3 currentAdherenceInput;
bool overrideOnGroundAnimatorValueActive;
float overrideOnGroundDuration;
float lastTimeOverrideOnGroundAnimator;
bool playerOnGroundAnimatorStateOnOverrideOnGround = true;
bool playerOnGroundAnimatorStateOnOverrideOnGroundWithTime = true;
[HideInInspector] public bool playerActionsInputEnabled = true;
//Fall damage variables
bool fallDamageCheckPaused;
[HideInInspector] public float lastTimeFalling;
float currentLastTimeFalling;
float currentFallSpeed;
bool checkFallState;
bool checkFallStatePaused;
//Stairs variables
float currentStairMaxValue;
float currentStairMinValue;
float currentStairAdherenceValue;
GameObject currentDetectedSurface;
GameObject currentTargetDetected;
bool stairInclinationDetected;
//Animator variables
public bool useRootMotionOnFullBodyAwareness;
public bool fullBodyAwarenessActive;
float originalAnimationSpeed;
[HideInInspector] public bool animatorSpeedUpdatePaused;
[HideInInspector] public bool useFirstPersonPhysicsInThirdPersonActive;
[HideInInspector] public bool lookInCameraDirectionOnFreeFire = true;
[HideInInspector] public float currentNoRootMovementSpeed;
[HideInInspector] public float lerpNoRootMovementSpeed;
[HideInInspector] public bool originalSetUseRootMotionActiveState;
[HideInInspector] public bool fullBodyAwarenessActiveAtStart;
float originalNoRootWalkMovementSpeed;
float originalNoRootRunMovementSpeed;
float originalNoRootSprintMovementSpeed;
float originalNoRootCrouchMovementSpeed;
float originalNoRootCrouchRunMovementSpeed;
float originalNoRootWalkStrafeMovementSpeed;
float originalNoRootRunStrafeMovementSpeed;
bool rootMotionDisabledTemporaly;
bool checkingDisableRootMotionTemporaly;
float lastTimeRootMotionDisabledTemporaly;
[HideInInspector] public Vector3 characterVelocity;
float lastTimeInput;
float lastTimePlayerUserInput;
bool lastTimeInputPressed;
bool previousValueLastTimeInputPressed;
bool previousValueOnGroundAnimatorState;
bool onGroundAnimatorState;
bool movementRelativeToCameraAnimatorState;
bool previousValueMovementRelativeToCameraState;
bool carryingWeaponAnimatorState;
bool previousValueCarryingWeaponAnimatorState;
bool aimingModeActiveAnimatorState;
bool previousValueAimingModeActiveAnimatorState;
bool tankModeActive;
bool scrollModeActive;
float currentMovementID;
float currentPlayerModeID;
float currentMovementSpeed;
float currentHorizontalValue;
float currentVerticalValue;
[HideInInspector] public float noAnimatorCurrentMovementSpeed;
[HideInInspector] public bool crouchSlidingOnAirActive;
//States variables
public bool gravityPowerActive;
[HideInInspector] public bool choosingGravityDirection;
[HideInInspector] public bool headBobPaused;
[HideInInspector] public bool canRagdollMove = true;
public bool usingCloseCombatActive;
public bool closeCombatAttackInProcess;
public bool meleeAttackInProcess;
bool jumpLegExternallyActiveState;
bool movingAnimator;
bool previousValueMovingAnimator;
public bool moveIputPaused;
//Physics variables
public Vector3 currentVelocity;
RaycastHit hit;
Ray crouchRay;
RaycastHit mainGroundHit;
RaycastHit temporalHit;
RaycastHit sphereRaycastHit = new RaycastHit ();
bool highFrictionMaterialActive;
RaycastHit adherenceHit;
bool physicMaterialAssigmentPaused;
float currentNoAnimatorSlidingCrouchSpeed;
float originalNoAnimatorMovementSpeedMultiplier;
Vector3 noAnimatorCurrentForce;
Vector3 velocityChange;
[HideInInspector] public float currentVelocityChangeMagnitude;
float lastFrameAirVelocity;
float originalNoAnimWalkMovementSpeed;
float originalNoAnimRunMovementSpeed;
float originalNoAnimCrouchMovementSpeed;
float originalNoAnimStrafeMovementSpeed;
float originalNoAnimWalkBackwardMovementSpeed;
float originalNoAnimRunBackwardMovementSpeed;
float originalNoAnimCrouchBackwardMovementSpeed;
float originalNoAnimStrafeBackwardMovementSpeed;
bool originalNoAnimCanRun;
//Ground variables
bool onGroundChecked;
float currentGroundAdherence;
Transform currentSurfaceBelowPlayer;
Transform previousSurfaceBelowPlayer;
Vector3 groundPoint;
Vector3 mainHitPoint;
float mainHitAngle;
Vector3 mainRaycastPosition;
bool canSetGroundState;
float lastTimeGround;
//Collider variables
[HideInInspector] public float originalHeight;
[HideInInspector] public float originalRadius;
float currentHeight;
//Air variables
float lastTimeAir;
//Gravity variables
float originalGravityMultiplier;
Vector3 extraGravityForce;
float currentGravityMultiplier;
float originalGravityForce;
float lastTimeGravityForcePaused;
bool unPauseGravityForceActive;
bool movementSpeedIncreased;
//Jump variables
[HideInInspector] public bool jumpInput;
[HideInInspector] public bool doubleJump;
bool lastJumpActivatedExternally;
float lastJumpTime;
float lastDoubleJumpTime;
int jumpsAmount;
float currentJumpLeg;
bool canJumpActive = true;
float currentJumpAnimatorValue;
bool jumpInputPaused;
bool jumpButtonHoldActive;
float lastTimeJumpButtonHoldActive;
float lastTimeJumpActivated;
bool runInputPaused;
bool crouchInputPaused;
public Transform head;
Vector3 landMarkRayPosition;
Vector3 landMarkRayDirection;
float currentMaxLandDistance;
Vector3 landMarkForwardDirection;
Quaternion landMarkTargetRotation;
//Locked camera variables
[HideInInspector] public bool useTankControls;
bool playerCanMoveOnAimInTankMode;
public enum lockedPlayerMovementMode
{
world3d,
world2_5d
}
[HideInInspector] public bool checkCameraDirectionFromLockedToFree;
bool tankModeCurrentlyEnabled;
bool inputNotPressed;
bool followSplinePathActive;
//Air dash ability variables
int currentNumberOfDash;
float lastTimeDash;
[HideInInspector] public bool usingAbilityActive;
float currentDeltaTime;
float currentUpdateDeltaTime;
float currentFixedUpdateDeltaTime;
//Crouch variables
float lastTimeCrouchSlidingActive;
bool crouchingOnAir;
bool previousValueCrouching;
//Run variables
float lastTimeMovingOnRun;
float runButtonPressedTimer;
float lastTimeRun;
//AI variables
Vector3 navMeshCurrentLookPos;
Vector3 navMeshMoveInput;
bool lookInCameraDirection;
bool characterControlOverrideActive;
bool AIStrafeModeActive;
bool AIEnableInputMovementOnStrafe;
//Fly mode variables
bool turnAndForwardAnimatorValuesPaused;
//Vehicle variables
GameObject currentVehicle;
Transform currentVehicleCameraControllerTransform;
//Controller variables
float turnAmount;
float forwardAmount;
float runCycleLegOffset = 0.2f;
float lastTimeMoved;
bool slowFallExternallyActive;
bool slowingFallInput;
//External force variables
bool externalForceActive;
Vector3 externalForceValue;
bool externalForceOnAirActive;
Vector3 externalForceOnAirValue;
float externalForceOnAirControlValue;
float originalMoveSpeedMultiplier;
float originalJumpPower;
float originalAirSpeed;
float originalAirControl;
float originalNoAnimatorAirSpeed;
GameObject playerManagersParentGameObject;
bool checkCharacterMeshIfGeneratedOnStartInitialized;
Transform currentLockedCameraTransform;
bool inputCanBeUsed;
bool characterRotatingToSurface;
float raycastDistance;
Vector3 rayPosition;
// Vector3 rayDirection;
float hitPointVerticalPosition;
float mainHitPointVerticalPosition;
float upDistance;
bool checkForSlopes;
float waitTimeToSlowDown;
bool previouslyOnGround;
[HideInInspector] public bool checkOnGroundPaused;
bool rotatingPlayerIn2_5dToRight;
bool rotatingPlayerIn2_5dToRLeft;
bool canRotateOn3dWorld;
bool canRotateOn2_5dWorld;
bool applyRootMotionAlwaysActive;
[HideInInspector] public bool actionActiveWithMovement;
[HideInInspector] public float lastTimeActionActive;
[HideInInspector] public bool ignoreCameraDirectionOnStrafeMovement;
[HideInInspector] public bool addExtraRotationPaused;
[HideInInspector] public bool deactivateRootMotionOnStrafeActiveOnLockedView;
bool previousStrafeModeActive;
Vector3 lastForwardDirection;
Vector3 lastRigthDirection;
Coroutine resetInputCoroutine;
bool playerUsingInput;
bool movementInputActive;
bool previousValueMovementInputActive;
[HideInInspector] public Vector3 currentForwardDirection;
[HideInInspector] public Vector3 currentRightDirection;
bool originalLookAlwaysInCameraDirection;
bool originalLookOnlyIfMoving;
Vector3 currentPlayerPosition;
Vector3 currentPlayerUp;
bool stairStepDetected;
bool setHeadbodStatesPaused;
[HideInInspector] public bool pauseAllPlayerDownForces;
bool toggleWalkRunState;
float previousWalkSpeedValue = 1;
bool originalSprintEnabledValue;
bool originalIncreaseWalkSpeedEnabledValue;
bool obstacleToAvoidMovementFound;
Vector3 checkObstacleRaycastPosition;
Vector3 checkObstacleRaycastDirection;
bool obstacleDetectedAtRight;
bool obstacleDetectedAtLeft;
[HideInInspector] public bool headTrackCanBeUsed = true;
[HideInInspector] public bool disableStrafeModeExternallyIfIncreaseWalkSpeedActive;
bool currentStrafeModeExternallyActive;
public externalControllerBehavior currentExternalControllerBehavior;
public bool useExternalControllerBehaviorPaused;
public bool externalControllBehaviorActive;
bool externalControlBehaviorForAirTypeActive;
bool playerActionSystemLocated;
bool weaponsManagerLocated;
float lastTimeFiring;
bool aimingPowers;
bool usingPowers;
float quickTurnMovementDuration;
float lastTimeQuickTurnActive;
bool pausePlayerTransformExtraRotationActive;
float lastTimeMovementInputPressed;
bool checkingQuickMovementDirectionActive;
bool activateExtraRotationInQuickTurnMovement;
public enum footStepState
{
None,
Air_Landing,
Running,
Run_Crouching,
Crouching,
Walking,
Jumping
}
public enum headbobState
{
None,
Jump_Start,
Jump_End,
Air,
Run_Crouching,
Running,
Crouching,
Walking,
Dynamic_Idle,
Static_Idle
}
bool addExtraCharacterVelocityActive;
Vector3 currentExtraCharacterVelocity;
bool actionCanHappenOnAir;
bool enableChangeScriptStateAfterFinishActionState;
bool disableChangeScriptStateAfterFinishActionState;
bool allowDownVelocityDuringAction;
bool groundDetected;
Ray sphereRaycastRay;
bool headScaleChanged;
[HideInInspector] public bool customCharacterControllerActive;
customCharacterControllerBase currentCustomCharacterControllerBase;
[HideInInspector] public int regularAirboneID = -1;
[HideInInspector] public int regularAirID = 0;
bool regularAirboneIDActivePreviously;
bool overrideTurnAmountActive;
float overrideTurnAmount;
bool overrideMainCameraTransformActive;
Transform overrideMainCameraTransform;
bool useForwardDirectionForCameraDirection;
bool useRightDirectionForCameraDirection;
bool actionToGetOnVehicleActive;
bool actionToGetOffFromVehicleActive;
Coroutine rotateCharacterCoroutine;
[HideInInspector] public bool checkToKeepWeaponAfterAimingWeaponFromShooting;
float lastTimeCheckToKeepWeapon;
bool animSpeedMultiplierChangedDuringXTimeActive;
float changeAnimSpeedMultiplierDuration;
Coroutine changeAnimSpeedMultiplierCoroutine;
bool pauseResetAnimatorStateFOrGroundAnimator;
GameObject currentTemporaVehicle;
bool applyAnimatorVelocityWithoutMoving;
bool disableCrouchState;
float currentVerticalSpeed;
bool currentApplyRootMotionValue;
float currentAnimatorSpeed = -2;
float previousAnimatorSpeed = -1;
float updateSetFloatAnimatorSpeed = 0.1f;
float currentWalkSpeedOnLockedCamera;
bool headBobManagerLocated;
bool originalCanDrive;
bool originalCanCharacterGetOnVehiclesState;
bool originalCanMoveWhileAimLockedCamera;
bool pauseCameraShakeFromGravityActive;
bool ignoreInputOnAirControlActive;
bool useMaxFallSpeedExternallyActive;
float customMaxFallSpeedExternally;
bool jumpActivatedByInput;
bool usingGeneralDriveRiderSystem;
bool currentSurfaceBelowPlayerLocated;
bool ignoreUseDelayOnGroundJumpActive;
float originalRayDistance;
Vector3 inputDir;
float lastTimeStepDetected = 0;
Vector3 dbgFuturePos;
RaycastHit dbgGroundHit;
bool dbgHasGroundHit;
float dbgSlopeAngle;
Vector3 movementDirection;
bool checkingLastTimeActionActiveAndCantMove;
float lastTimeOnAirAnimator;
float lastTimeMaxWalkSurfaceAngleLocated = 0;
//int stickToGroundValue;
//int tryMoveValue;
void initilizeAnimatorIDValues ()
{
forwardAnimatorID = Animator.StringToHash (forwardAnimatorName);
turnAnimatorID = Animator.StringToHash (turnAnimatorName);
horizontalAnimatorID = Animator.StringToHash (horizontalAnimatorName);
verticalAnimatorID = Animator.StringToHash (verticalAnimatorName);
horizontalStrafeAnimatorID = Animator.StringToHash (horizontalStrafeAnimatorName);
verticalStrafeAnimatorID = Animator.StringToHash (verticalStrafeAnimatorName);
onGroundAnimatorID = Animator.StringToHash (onGroundAnimatorName);
crouchAnimatorID = Animator.StringToHash (crouchAnimatorName);
movingAnimatorID = Animator.StringToHash (movingAnimatorName);
jumpAnimatorID = Animator.StringToHash (jumpAnimatorName);
jumpLegAnimatorID = Animator.StringToHash (jumpLegAnimatorName);
strafeModeActiveAnimatorID = Animator.StringToHash (strafeModeActiveAnimatorName);
movementInputActiveAnimatorID = Animator.StringToHash (movementInputActiveAnimatorName);
movementRelativeToCameraAnimatorID = Animator.StringToHash (movementRelativeToCameraAnimatorName);
movementIDAnimatorID = Animator.StringToHash (movementIDAnimatorName);
playerModeIDAnimatorID = Animator.StringToHash (playerModeIDAnimatorName);
movementSpeedAnimatorID = Animator.StringToHash (movementSpeedAnimatorName);
lastTimeInputPressedAnimatorID = Animator.StringToHash (lastTimeInputPressedAnimatorName);
carryingWeaponAnimatorID = Animator.StringToHash (carryingWeaponAnimatorName);
aimingModeActiveAnimatorID = Animator.StringToHash (aimingModeActiveAnimatorName);
playerStatusIDAnimatorID = Animator.StringToHash (playerStatusIDAnimatorName);
idleIDAnimatorID = Animator.StringToHash (idleIDAnimatorName);
strafeIDAnimatorID = Animator.StringToHash (strafeIDAnimatorName);
crouchIDAnimatorID = Animator.StringToHash (crouchIDAnimatorName);
airIDAnimatorID = Animator.StringToHash (airIDAnimatorName);
airSpeedAnimatorID = Animator.StringToHash (airSpeedAnimatorName);
quickTurnRightDirectionID = Animator.StringToHash (quickTurnRightDirectionName);
quickTurnLeftDirectionID = Animator.StringToHash (quickTurnLeftDirectionName);
quickTurnDirectionIDSpeedID = Animator.StringToHash (quickTurnDirectionIDSpeedName);
shieldActiveAnimatorID = Animator.StringToHash (shieldActiveAnimatorName);
inputAmountID = Animator.StringToHash (inputAmountName);
useStrafeLandingID = Animator.StringToHash (useStrafeLandingName);
weaponIDAnimatorID = Animator.StringToHash (weaponIDAnimatorName);
rightArmdIDAnimatorID = Animator.StringToHash (rightArmdIDAnimatorName);
leftArmIDAnimatorID = Animator.StringToHash (leftArmIDAnimatorName);
timeOnAirAnimatorID = Animator.StringToHash (timeOnAirAnimatorName);
animatorFBAActiveID = Animator.StringToHash (animatorFBAActiveName);
}
void Awake ()
{
initilizeAnimatorIDValues ();
originalWalkSpeedValue = walkSpeed;
originalGravityMultiplier = gravityMultiplier;
currentGravityMultiplier = gravityMultiplier;
originalGravityForce = gravityForce;
originalStationaryTurnSpeed = stationaryTurnSpeed;
if (playerTransform == null) {
playerTransform = transform;
}
if (playerTransform.parent != null) {
playerManagersParentGameObject = playerTransform.parent.gameObject;
}
playerActionSystemLocated = mainPlayerActionSystem != null;
setApplyRootMotionState (true);
weaponsManagerLocated = weaponsManager != null;
headBobManagerLocated = headBobManager != null;
originalCanDrive = canDrive;
originalCanCharacterGetOnVehiclesState = canGetOnVehicles;
originalCanMoveWhileAimLockedCamera = canMoveWhileAimLockedCamera;
originalRayDistance = rayDistance;
}
void Start ()
{
//set the collider center in the correct place
originalHeight = capsule.height;
originalRadius = capsule.radius;
if (setCustomCapsuleCenter) {
capsule.center = customCapsuleCenter;
} else {
capsule.center = capsule.height * half * Vector3Up;
}
currentHeight = originalHeight;
halfJumpPower = jumpPower * half;
//get the player camera
if (playerCameraTransform == null) {
playerCameraTransform = playerCameraGameObject.transform;
}
if (head == null && animator.avatar != null && animator.avatar.isHuman) {
head = animator.GetBoneTransform (HumanBodyBones.Head);
}
if (useLandMark) {
if (landMark.activeSelf) {
landMark.SetActive (false);
}
landMark.transform.SetParent (null);
}
setHighFrictionMaterial ();
originalAnimationSpeed = animSpeedMultiplier;
//get all the important parameters of player controller
originalMoveSpeedMultiplier = moveSpeedMultiplier;
originalJumpPower = jumpPower;
originalAirSpeed = airSpeed;
originalAirControl = airControl;
originalNoAnimatorAirSpeed = noAnimatorAirSpeed;
//no animator original movement values assignment
originalNoAnimWalkMovementSpeed = noAnimatorWalkMovementSpeed;
originalNoAnimRunMovementSpeed = noAnimatorRunMovementSpeed;
originalNoAnimCrouchMovementSpeed = noAnimatorCrouchMovementSpeed;
originalNoAnimStrafeMovementSpeed = noAnimatorStrafeMovementSpeed;
originalNoAnimWalkBackwardMovementSpeed = noAnimatorWalkBackwardMovementSpeed;
originalNoAnimRunBackwardMovementSpeed = noAnimatorRunBackwardMovementSpeed;
originalNoAnimCrouchBackwardMovementSpeed = noAnimatorCrouchBackwardMovementSpeed;
originalNoAnimStrafeBackwardMovementSpeed = noAnimatorStrafeBackwardMovementSpeed;
originalNoAnimCanRun = noAnimatorCanRun;
originalSetUseRootMotionActiveState = useRootMotionActive;
originalNoRootWalkMovementSpeed = noRootWalkMovementSpeed;
originalNoRootRunMovementSpeed = noRootRunMovementSpeed;
originalNoRootSprintMovementSpeed = noRootSprintMovementSpeed;
originalNoRootCrouchMovementSpeed = noRootCrouchMovementSpeed;
originalNoRootCrouchRunMovementSpeed = noRootCrouchRunMovementSpeed;
originalNoRootWalkStrafeMovementSpeed = noRootWalkStrafeMovementSpeed;
originalNoRootRunStrafeMovementSpeed = noRootRunStrafeMovementSpeed;
originalLookAlwaysInCameraDirection = lookAlwaysInCameraDirection;
originalLookOnlyIfMoving = lookOnlyIfMoving;
originalSprintEnabledValue = sprintEnabled;
originalIncreaseWalkSpeedEnabledValue = increaseWalkSpeedEnabled;
originalNoAnimatorMovementSpeedMultiplier = noAnimatorMovementSpeedMultiplier;
previousValueOnGroundAnimatorState = !checkIfPlayerOnGroundWithRaycast ();
if (lastCurrentUseStrafeLandingValue != currentUseStrafeLanding) {
lastCurrentUseStrafeLandingValue = currentUseStrafeLanding;
animator.SetFloat (useStrafeLandingID, currentUseStrafeLanding);
}
if (!usedByAI) {
if (fullBodyAwarenessActiveAtStart) {
setFullBodyAwarenessActiveState (true);
} else {
playerCameraManager.checkActivateOrDeactivateHeadColliderOnFBA (true);
}
}
}
void Update ()
{
currentUpdateDeltaTime = getCurrentDeltaTime ();
inputCanBeUsed = canUseInput ();
playerIsAiming = isPlayerAiming ();
lookInCameraDirectionOnFreeFireActive = hasToLookInCameraDirectionOnFreeFire ();
playerUsingInput = isPlayerUsingInput ();
if (useEventsOnWalk || useEventsOnRun) {
if (playeCurrentlyUsingInput != playerUsingInput) {
playeCurrentlyUsingInput = playerUsingInput;
if (playeCurrentlyUsingInput) {
if (walkSpeed > half) {
if (useEventsOnWalk) {
eventOnWalkEnd.Invoke ();
}
if (useEventsOnRun) {
eventOnRunStart.Invoke ();
}
} else {
if (useEventsOnRun) {
eventOnRunEnd.Invoke ();
}
if (useEventsOnWalk) {
eventOnWalkStart.Invoke ();
}
}
} else {
if (useEventsOnWalk) {
eventOnWalkEnd.Invoke ();
}
if (useEventsOnRun) {
eventOnRunEnd.Invoke ();
}
}
}
}
if (inputCanBeUsed && !playerOnGround && !gravityPowerActive && holdJumpSlowDownFallEnabled) {
waitTimeToSlowDown = lastJumpTime + 0.2f;
if (enabledDoubleJump && doubleJump) {
waitTimeToSlowDown += lastDoubleJumpTime + 1;
}
}
if (lockedCameraActive) {
if (!update2_5dClampedPositionPaused) {
if (isPlayerMovingOn2_5dWorld () && !turnBasedCombatActionActive) {
if (followSplinePathActive) {
//maybe use this on 2.5d mode
Vector3 newPosition = playerCameraManager.getSplineForPlayerPosition (playerTransform.position);
newPosition = new Vector3 (newPosition.x, playerTransform.position.y, newPosition.z);
playerTransform.position = newPosition;
} else {
if (moveInXAxisOn2_5d) {
playerTransform.position =
new Vector3 (playerTransform.position.x,
playerTransform.position.y,
playerCameraManager.getOriginalLockedCameraPivotPosition ().z);
} else {
playerTransform.position =
new Vector3 (playerCameraManager.getOriginalLockedCameraPivotPosition ().x,
playerTransform.position.y,
playerTransform.position.z);
}
}
}
}
}
if (gravityForcePaused) {
if (unPauseGravityForceActive && Time.time > lastTimeGravityForcePaused + gravityForcePausedTime) {
setGravityForcePuase (false);
unPauseGravityForceActive = false;
}
}
bool checkLookCameraDirectionResult =
!crouching ||
lookInCameraDirectionOnCrouchState ||
fullBodyAwarenessActive ||
!playerUsingWeapons;
lookInCameraDirectionActive = hasToLookInCameraDirection () && checkLookCameraDirectionResult;
strafeModeActive = ((playerIsAiming && lookInCameraDirectionOnFreeFireActive) || lookInCameraDirectionActive) &&
(playerOnGround || !ignoreStrafeStateOnAirEnabled || fullBodyAwarenessActive);
if (previousStrafeModeActive != strafeModeActive) {
previousStrafeModeActive = strafeModeActive;
if (deactivateRootMotionOnStrafeActiveOnLockedView) {
setUseRootMotionActiveState (!strafeModeActive);
}
}
if (!fullBodyAwarenessActive) {
if (originalLookAlwaysInCameraDirection && disableLookAlwaysInCameraDirectionIfIncreaseWalkSpeedActive) {
if (sprintEnabled) {
if (running) {
if (originalLookAlwaysInCameraDirection == lookAlwaysInCameraDirection) {
setLookAlwaysInCameraDirectionState (false);
}
} else {
if (originalLookAlwaysInCameraDirection != lookAlwaysInCameraDirection) {
setLookAlwaysInCameraDirectionState (true);
}
}
} else {
if (walkSpeed == 1) {
if (originalLookAlwaysInCameraDirection == lookAlwaysInCameraDirection) {
setLookAlwaysInCameraDirectionState (false);
}
} else {
if (originalLookAlwaysInCameraDirection != lookAlwaysInCameraDirection) {
setLookAlwaysInCameraDirectionState (true);
}
}
}
}
if (disableStrafeModeExternallyIfIncreaseWalkSpeedActive) {
bool disableStrafeModeResult = true;
if (lockedCameraActive && isPlayerMovingOn3dWorld ()) {
if (playerCameraManager.isPlayerLookingAtTarget () && playerCameraManager.isLookintAtTargetByInput ()) {
disableStrafeModeResult = false;
}
}
if (disableStrafeModeResult) {
if (sprintEnabled) {
if (running) {
if (!currentStrafeModeExternallyActive) {
setLookAlwaysInCameraDirectionState (false);
currentStrafeModeExternallyActive = true;
}
} else {
if (currentStrafeModeExternallyActive) {
setLookAlwaysInCameraDirectionState (true);
currentStrafeModeExternallyActive = false;
}
}
} else {
if (walkSpeed == 1) {
if (!currentStrafeModeExternallyActive) {
setLookAlwaysInCameraDirectionState (false);
currentStrafeModeExternallyActive = true;
}
} else {
if (currentStrafeModeExternallyActive) {
setLookAlwaysInCameraDirectionState (true);
currentStrafeModeExternallyActive = false;
}
}
}
}
}
}
if (!usedByAI) {
if (running) {
//stop the running action if the player is not moving
if (getMoveInputDirection ().magnitude == 0) {
if (Time.time > lastTimeMovingOnRun + 0.26f) {
stopRun ();
}
}
if (isPlayerMoving (0.05f) || isPlayerUsingInput ()) {
lastTimeMovingOnRun = Time.time;
} else {
lastTimeMovingOnRun = 0;
}
}
}
}
void FixedUpdate ()
{
currentFixedUpdateDeltaTime = getCurrentDeltaTime ();
playerTransformUp = playerTransform.up;
playerTransformForward = playerTransform.forward;
playerTransformRight = playerTransform.right;
if (jumpButtonHoldActive) {
if (Time.time > lastTimeJumpButtonHoldActive + addJumpForceDuration) {
jumpButtonHoldActive = false;
} else {
if (Time.time > lastTimeJumpButtonHoldActive + minWaitToAddJumpForceAfterButtonPressed) {
Vector3 totalExtraJump = jumpForceAmontWhileButtonPressed * (mainRigidbody.mass * jumpMassMultiplier) * currentNormal;
mainRigidbody.AddForce (totalExtraJump);
}
}
}
//convert the input from keyboard or a touch screen into values to move the player, given the camera direction
if (canMove && !usedByAI && !playerNavMeshEnabled && !moveIputPaused) {
setMainAxisValues ();
horizontalInput = axisValues.x;
verticalInput = axisValues.y;
} else {
axisValues = Vector2.zero;
}
if (canMove && !moveIputPaused) {
setMainRawAxisValues ();
} else {
rawAxisValues = Vector2.zero;
}
if (moveInputPausedWithDurationActive) {
axisValues = Vector2.zero;
rawAxisValues = Vector2.zero;
horizontalInput = axisValues.x;
verticalInput = axisValues.y;
if (Time.time > moveInputPausedWithDurationAmount + lastTimeMoveInputPausedWithDurationActive) {
moveInputPausedWithDurationActive = false;
}
}
if (fullBodyAwarenessActive && !useRootMotionOnFullBodyAwareness) {
if (canMove) {
if (lastTimeActionActive != 0) {
if (Time.time < lastTimeActionActive + 0.25f) {
verticalInput = 0;
horizontalInput = 0;
axisValues = Vector2.zero;
rawAxisValues = Vector2.zero;
}
}
}
}
if (!usedByAI && !playerNavMeshEnabled) {
//get the axis of the player camera, to move him properly
if (lockedCameraActive) {
currentLockedCameraTransform = playerCameraManager.getLockedCameraTransform ();
if (isPlayerMovingOn3dWorld ()) {
//player can move while aiming
if (!canMoveWhileAimLockedCamera && playerIsAiming) {
verticalInput = 0;
horizontalInput = 0;
}
//if the player is on tank mode, use his forward and right direction as the input
if (useTankControls) {
currentForwardDirection = playerTransformForward;
currentRightDirection = playerTransformRight;
} else {
//else, the player will follow the direction of the current locked camera
//if the player is looking at a target, the input direction used will be the player camera
if (playerCameraManager.isPlayerLookingAtTarget ()) {
if (!isPlayerOnGround ()) {
currentForwardDirection = currentLockedCameraTransform.forward;
currentRightDirection = currentLockedCameraTransform.right;
} else {
currentForwardDirection = playerCameraTransform.forward;
currentRightDirection = mainCameraTransform.right;
}
} else {
//else, he will use the locked camera direction
currentForwardDirection = currentLockedCameraTransform.forward;
currentRightDirection = currentLockedCameraTransform.right;
}
}
} else {
//else, the player is moving in 2.5d camera, so use only the horizontal input
currentForwardDirection = vector3Zero;
currentRightDirection = currentLockedCameraTransform.right;
if (followSplinePathActive) {
currentRightDirection = current2_5dRightDirection;
}
if (playerOnGround) {
verticalInput = 0;
rawAxisValues.y = 0;
}
}
} else {
//the player is on free camera mode
movementInputIgnoredOnAimActive = false;
//check if the player can move while aiming on first or third person according to settings
if (playerIsAiming) {
if (usingFreeFireMode) {
if (!canMoveWhileFreeFireOnThirdPerson) {
if (!firstPersonActive) {
verticalInput = 0;
horizontalInput = 0;
movementInputIgnoredOnAimActive = true;
}
}
} else {
if ((firstPersonActive && !canMoveWhileAimFirstPerson) ||
(!firstPersonActive && !canMoveWhileAimThirdPerson)) {
verticalInput = 0;
horizontalInput = 0;
movementInputIgnoredOnAimActive = true;
}
}
}
//in other case, the player uses the player camera direction as input
if (checkCameraDirectionFromLockedToFree) {
currentLockedCameraTransform = playerCameraManager.getLockedCameraTransform ();
//keep the latest locked camera direction until the player stops to move
currentForwardDirection = currentLockedCameraTransform.forward;
currentRightDirection = currentLockedCameraTransform.right;
if (!isPlayerMoving (0.6f) && !playerUsingInput) {
inputNotPressed = true;
}
if (inputNotPressed && (playerUsingInput || !isPlayerMoving (0))) {
checkCameraDirectionFromLockedToFree = false;
inputNotPressed = false;
}
} else {
currentForwardDirection = playerCameraTransform.forward;
currentRightDirection = mainCameraTransform.right;
if (useForwardDirectionForCameraDirection) {
currentForwardDirection = playerTransform.forward;
}
if (useRightDirectionForCameraDirection) {
currentRightDirection = playerTransform.right;
}
if (ignoreCameraDirectionOnMovement) {
currentForwardDirection = lastForwardDirection;
currentRightDirection = lastRigthDirection;
}
}
}
//the camera direccion and input is override by some external function, to make the playe to move toward some direction or position
if (overrideMainCameraTransformActive) {
currentForwardDirection = overrideMainCameraTransform.forward;
currentRightDirection = overrideMainCameraTransform.right;
}
moveInput = (verticalInput * currentForwardDirection + horizontalInput * currentRightDirection) * walkSpeed;
} else {
if (playerNavMeshEnabled) {
currentLockedCameraTransform = playerCameraManager.getLockedCameraTransform ();
}
if (moveIputPaused ||
(actionActive && !useRootMotionActive)) {
navMeshMoveInput = vector3Zero;
}
updateOverrideInputValues (new Vector2 (navMeshMoveInput.x, navMeshMoveInput.z), true);
setAIMainAxisValues ();
setMainAIRawAxisValues ();
if (playerIsAiming || AIStrafeModeActive) {
if (AIEnableInputMovementOnStrafe) {
moveInput = playerTransform.InverseTransformDirection (navMeshMoveInput);
horizontalInput = moveInput.x;
verticalInput = moveInput.z;
} else {
moveInput = navMeshMoveInput;
horizontalInput = 0;
verticalInput = moveInput.magnitude;
}
} else {
moveInput = navMeshMoveInput;
horizontalInput = moveInput.x;
verticalInput = moveInput.z;
}
if (!canMoveAI) {
moveInput = vector3Zero;
horizontalInput = 0;
verticalInput = 0;
}
if (useNewGroundAdherenceEnabled) {
if (actionActive && !canMove) {
moveInput = vector3Zero;
horizontalInput = 0;
verticalInput = 0;
}
}
}
currentMoveInput = moveInput;
if (useObstacleDetectionToAvoidMovement && playerOnGround) {
checkObstacleToAvoidMovement ();
}
// if (useWalkToRunAccelerationChange) {
// currentWalkSpeedTarget = 1;
//
// if (obstacleToAvoidMovementFound || !isPlayerUsingInput ()) {
// currentWalkSpeedTarget = originalWalkSpeedValue;
// }
//
// walkSpeed = Mathf.Lerp (walkSpeed, currentWalkSpeedTarget, Time.deltaTime * walkToRunAccelerationSpeed);
// }
//isMoving is true if the player is moving, else is false
isMoving = Mathf.Abs (horizontalInput) > 0.1f || Mathf.Abs (verticalInput) > 0.1f;
if (currentMoveInput.magnitude > 1) {
currentMoveInput.Normalize ();
}
//get the velocity of the rigidbody
if (!gravityPowerActive) {
if ((usingAnimator && !useFirstPersonPhysicsInThirdPersonActive) ||
(!usingAnimator && !playerOnGround) ||
(usingAnimator && useFirstPersonPhysicsInThirdPersonActive && !playerOnGround)) {
currentVelocity = mainRigidbody.linearVelocity;
}
}
//convert the global movement in local
getMoveInput ();
if (fullBodyAwarenessActive) {
if (wallRunningActive) {
updateWallRunningState ();
}
} else {
//look in camera direction when the player is aiming
lookCameraDirection ();
}
//add an extra rotation to the player to get a better control of him
addExtraRotation ();
bool updateThirdPersonState = usingAnimator && !useFirstPersonPhysicsInThirdPersonActive;
//if the animator is used, then
if (updateThirdPersonState) {
//check when the player is on ground
checkOnGround ();
//update mecanim
updateAnimator ();
} else {
//else, apply force to the player's rigidbody
if (playerOnGround) {
if (!isMoving) {
currentMoveInput = vector3Zero;
}
if (running) {
if (noAnimatorCanRun) {
if (verticalInput < 0) {
if (noAnimatorCanRunBackwards) {
if (crouching) {
noAnimatorCurrentMovementSpeed = noAnimatorRunCrouchBackwardMovementSpeed;
} else {
noAnimatorCurrentMovementSpeed = noAnimatorRunBackwardMovementSpeed;
}
} else {
stopRun ();
}
} else {
if (crouching) {
if (crouchSlidingActive) {
noAnimatorCurrentMovementSpeed = noAnimatorCrouchSlidingSpeed;
if (keepCrouchSlidingOnInclinatedSurface) {
if (hitAngle > minInclinitaonSurfaceAngleToCrouchcSliding) {
if (Physics.Raycast (playerTransform.position + (playerTransformForward / 2), -playerTransformUp, out hit, 1, layer)) {
if (Mathf.Abs (playerTransform.InverseTransformPoint (hit.point).y) > 0.1f) {
lastTimeCrouchSlidingActive = Time.time;
}
}
}
}
if (Time.time > lastTimeCrouchSlidingActive + noAnimatorCrouchSlidingLerpDelay) {
currentNoAnimatorSlidingCrouchSpeed =
Mathf.Lerp (currentNoAnimatorSlidingCrouchSpeed, noAnimatorRunCrouchMovementSpeed, Time.fixedDeltaTime * noAnimatorCrouchSlidingLerpSpeed);
noAnimatorCurrentMovementSpeed = currentNoAnimatorSlidingCrouchSpeed;
} else {
currentNoAnimatorSlidingCrouchSpeed = noAnimatorCrouchSlidingSpeed;
}
if (Time.time > lastTimeCrouchSlidingActive + noAnimatorCrouchSlidingDuration) {
stopCrouchSliding ();
if (getUpAfterCrouchSlidingEnd && crouching) {
crouch ();
}
}
} else {
noAnimatorCurrentMovementSpeed = noAnimatorRunCrouchMovementSpeed;
}
} else {
noAnimatorCurrentMovementSpeed = noAnimatorRunMovementSpeed;
}
}
} else {
stopRun ();
}
} else if (crouching) {
if (verticalInput >= 0) {
noAnimatorCurrentMovementSpeed = noAnimatorCrouchMovementSpeed;
} else {
noAnimatorCurrentMovementSpeed = noAnimatorCrouchBackwardMovementSpeed;
}
} else if (Mathf.Abs (verticalInput) > half && Mathf.Abs (horizontalInput) > half) {
if (verticalInput >= 0) {
noAnimatorCurrentMovementSpeed = noAnimatorStrafeMovementSpeed;
} else {
noAnimatorCurrentMovementSpeed = noAnimatorStrafeBackwardMovementSpeed;
}
} else {
if (verticalInput >= 0) {
noAnimatorCurrentMovementSpeed = noAnimatorWalkMovementSpeed;
} else {
noAnimatorCurrentMovementSpeed = noAnimatorWalkBackwardMovementSpeed;
}
}
noAnimatorCurrentForce = (noAnimatorSpeed * noAnimatorCurrentMovementSpeed) * currentMoveInput;
// Subtract the local Y axis velocity of the rigidbody
noAnimatorCurrentForce = noAnimatorCurrentForce - playerTransform.InverseTransformDirection (noAnimatorCurrentForce).y * playerTransformUp;
noAnimatorCurrentForce *= noAnimatorMovementSpeedMultiplier;
velocityChange = noAnimatorCurrentForce - mainRigidbody.linearVelocity;
velocityChange = Vector3.ClampMagnitude (velocityChange, maxVelocityChange);
mainRigidbody.AddForce (velocityChange, ForceMode.VelocityChange);
} else {
if (!wallRunningActive &&
!gravityPowerActive &&
!pauseAllPlayerDownForces &&
!externalForceOnAirActive &&
!externalControlBehaviorForAirTypeActive &&
!swimModeActive) {
if (crouchSlidingOnAirActive) {
noAnimatorCurrentMovementSpeed = noAnimatorCrouchSlidingOnAirSpeed;
if (useNoAnimatorCrouchSlidingDurationOnAir && Time.time > lastTimeCrouchSlidingActive + noAnimatorCrouchSlidingDurationOnAir) {
stopCrouchSliding ();
}
} else {
noAnimatorCurrentMovementSpeed = noAnimatorAirSpeed;
}
noAnimatorCurrentForce = noAnimatorCurrentMovementSpeed * currentMoveInput + playerTransform.InverseTransformDirection (currentVelocity).y * playerTransformUp;
noAnimatorCurrentForce *= noAnimatorMovementSpeedMultiplier;
velocityChange = noAnimatorCurrentForce - mainRigidbody.linearVelocity;
velocityChange = Vector3.ClampMagnitude (velocityChange, maxVelocityChange);
mainRigidbody.AddForce (velocityChange, ForceMode.VelocityChange);
}
if (externalForceOnAirActive) {
// airMove = externalForceOnAirValue;
// currentVelocity = Vector3.Lerp (currentVelocity, airMove, currentFixedUpdateDeltaTime * externalForceOnAirControlValue);
velocityChange = externalForceOnAirValue - mainRigidbody.linearVelocity;
velocityChange = Vector3.ClampMagnitude (velocityChange, maxVelocityChange);
mainRigidbody.AddForce (velocityChange, ForceMode.VelocityChange);
externalForceOnAirActive = false;
}
}
if (!gravityPowerActive) {
currentVelocity = mainRigidbody.linearVelocity;
}
currentVelocityChangeMagnitude = mainRigidbody.linearVelocity.magnitude;
checkOnGround ();
}
//check if the player is on ground or in air
//also set the friction of the character if he is on the ground or in the air
if (playerOnGround) {
onGroundVelocity ();
if (!onGroundChecked) {
gravityManager.onGroundOrOnAir (true);
onGroundChecked = true;
if (updateHeadbobState && headBobManagerLocated) {
//send a message to the headbob in the camera, when the player lands from a jump
if (currentHeadbobState != headbobState.Jump_End) {
headBobManager.setState ("Jump End");
currentHeadbobState = headbobState.Jump_End;
}
}
if (updateFootStepStateActive) {
if (currentFootStepState != footStepState.Air_Landing) {
stepManager.setFootStepState ("Air Landing");
currentFootStepState = footStepState.Air_Landing;
}
}
//set the number of jumps made by the player since this moment
jumpsAmount = 0;
if (weaponsManagerLocated) {
weaponsManager.setWeaponsJumpEndPositionState (true);
}
if (!isPlayerDead () && canRagdollMove) {
//check the last time since the player is in the air, falling in its gravity direction
//if the player has been in the air more time than maxTimeInAirBeforeGetDamage and his velocity is higher than 15, then apply damage
if (fallDamageEnabled && !gravityPowerActive && !fallDamageCheckPaused) {
currentFallSpeed = Mathf.Abs (mainRigidbody.linearVelocity.magnitude);
float lastFrameAirVelocityABS = Mathf.Abs (lastFrameAirVelocity);
checkFallState = false;
if (firstPersonActive) {
if (currentFallSpeed > minPlayerVelocityToApplyDamageFirstPerson ||
lastFrameAirVelocityABS > minPlayerVelocityToApplyDamageFirstPerson) {
checkFallState = true;
}
} else {
if (currentFallSpeed > minPlayerVelocityToApplyDamageThirdPerson ||
lastFrameAirVelocityABS > minPlayerVelocityToApplyDamageThirdPerson) {
checkFallState = true;
}
}
if (checkFallStatePaused) {
checkFallState = false;
}
if (checkFallState) {
currentLastTimeFalling = lastTimeFalling;
if (applyFallDamageEnabled && !fallDamageCheckOnHealthPaused) {
if (Time.time > currentLastTimeFalling + maxTimeInAirBeforeGettingDamage) {
//get the last time since the player is in the air and his velocity, and call the health damage function
float totalTimeOnAir = Mathf.Abs (Time.time - currentLastTimeFalling);
float damageValue = totalTimeOnAir * currentFallSpeed;
if (fallingDamageMultiplier != 1) {
damageValue *= fallingDamageMultiplier;
}
float remainingHealthAmount = healthManager.getCurrentHealthAmount ();
if (ignoreShieldOnFallDamage) {
damageValue = Mathf.Clamp (damageValue, 0, remainingHealthAmount);
} else {
if (healthManager.isUseShieldActive ()) {
float remainShield = healthManager.getCurrentShieldAmount ();
damageValue = Mathf.Clamp (damageValue, 0, remainingHealthAmount + remainShield);
} else {
damageValue = Mathf.Clamp (damageValue, 0, remainingHealthAmount);
}
}
if (damageValue > 0) {
healthManager.setDamageWithHealthManagement (damageValue, -mainRigidbody.linearVelocity.normalized, playerTransform.position + playerTransformUp,
gameObject, gameObject, false, false, ignoreShieldOnFallDamage, false, false, false, -2, damageTypeIDOnFallDamage);
}
}
}
//call another function when the player receives damage from a long fall
if (callEventOnFallDamage && (!isPlayerDead () || !callEventOnlyIfPlayerAlive)) {
if (Time.time > currentLastTimeFalling + minTimeOnAirToUseEvent) {
eventOnFallDamage.Invoke ();
}
}
}
}
}
if (freeFloatingModeOn || zeroGravityModeOn) {
setFootStepManagerState (false);
}
lastTimeGround = Time.time;
if (wallRunningActive) {
setWallRunningActiveState (false);
}
if (crouchingOnAir && !crouching) {
crouching = true;
crouchingOnAir = false;
crouchSlidingOnAirActive = false;
} else {
if (disableCrouchState && !firstPersonActive) {
crouching = false;
disableCrouchState = false;
}
}
if (disableRootMotionTemporalyOnLandThirdPerson) {
if (!firstPersonActive) {
if (!checkingDisableRootMotionTemporaly) {
checkingDisableRootMotionTemporaly = true;
}
}
}
jumpButtonHoldActive = false;
if (customCharacterControllerActive) {
currentCustomCharacterControllerBase.updateOnGroundValue (true);
}
if (stopCrouchFromAutoJumpActive) {
crouching = false;
stopCrouchFromAutoJumpActive = false;
}
if (jumpActivatedByInput) {
if (useEventOnLandFromJumpInput) {
eventOnLandFromJumpInput.Invoke ();
}
jumpActivatedByInput = false;
}
if (useEventOnLand) {
eventOnLand.Invoke ();
}
if (keepLastMovementInputOnJump) {
resetLastMoveInputOnJumpValue ();
}
}
if (checkingDisableRootMotionTemporaly) {
if (firstPersonActive) {
if (rootMotionDisabledTemporaly) {
checkingDisableRootMotionTemporaly = false;
rootMotionDisabledTemporaly = false;
setOriginalUseRootMotionActiveState ();
}
} else {
if (!rootMotionDisabledTemporaly) {
if (Time.time > lastTimeGround + waitToDisableRootMotionTemporalyOnLandThirdPerson) {
setUseRootMotionActiveState (false);
lastTimeRootMotionDisabledTemporaly = Time.time;
rootMotionDisabledTemporaly = true;
}
} else {
if (Time.time > lastTimeRootMotionDisabledTemporaly + durationDisableRootMotionTemporalyOnLandThirdPerson) {
checkingDisableRootMotionTemporaly = false;
rootMotionDisabledTemporaly = false;
setOriginalUseRootMotionActiveState ();
}
}
}
}
if (updateFootStepStateActive) {
if (playerOnGround) {
setCurrentFootStepsState ();
}
}
//change the collider material when the player moves and when the player is not moving
if (!physicMaterialAssigmentPaused) {
if (currentMoveInput.magnitude == 0) {
if (!highFrictionMaterialActive) {
setHighFrictionMaterial ();
}
} else {
if (highFrictionMaterialActive) {
setZeroFrictionMaterial ();
}
}
}
//check the headbob state
if (updateHeadbobState && headBobManagerLocated) {
if (headBobManager.headBobEnabled && !setHeadbodStatesPaused) {
setCurrentHeadBobState ();
}
}
}
//the player is in the air, so
else {
//call the air velocity function
onAirVelocity ();
if (onGroundChecked) {
//set in other script this state
gravityManager.onGroundOrOnAir (false);
onGroundChecked = false;
setLastTimeFalling ();
if (weaponsManagerLocated) {
weaponsManager.setWeaponsJumpStartPositionState (true);
}
currentJumpLeg = 0;
if (zeroGravityModeOn || freeFloatingModeOn) {
if (!ignoreSetCheckOnGrundStatePausedFFOrZGStateActive) {
setCheckOnGrundStatePausedFFOrZGState (true);
setFootStepManagerState (true);
}
}
if (customCharacterControllerActive) {
currentCustomCharacterControllerBase.updateOnGroundValue (false);
}
ignoreSetCheckOnGrundStatePausedFFOrZGStateActive = false;
lastTimeOnAirAnimator = Time.time;
if (lastTimeJumpActivated == 0 || Time.time > lastTimeJumpActivated + 0.7f) {
if (useEventOnAirborne) {
eventOnAirborne.Invoke ();
}
}
}
if (highFrictionMaterialActive) {
setZeroFrictionMaterial ();
}
if (updateHeadbobState && headBobManagerLocated) {
if (!wallRunningActive && !externalControlBehaviorForAirTypeActive) {
if (currentHeadbobState != headbobState.Air) {
headBobManager.setState ("Air");
currentHeadbobState = headbobState.Air;
}
if (headBobManager.useDynamicIdle) {
setLastTimeMoved ();
}
}
}
if (!isPlayerDead () && canRagdollMove) {
if (activateRagdollOnFallState) {
currentFallSpeed = playerTransform.InverseTransformDirection (mainRigidbody.linearVelocity).y;
checkFallState = false;
if (currentFallSpeed < 0 && Mathf.Abs (currentFallSpeed) > minSpeedToActivateRagdollOnFall) {
checkFallState = true;
}
if (checkFallStatePaused) {
checkFallState = false;
}
if (checkFallState) {
currentLastTimeFalling = lastTimeFalling;
if (Time.time > currentLastTimeFalling + minWaitTimeToActivateRagdollOnFall) {
//get the last time since the player is in the air and his velocity, and call the health damage function
//call another function when the player receives damage from a long fall
eventToActivateRagdollOnFall.Invoke (pushRagdollMultiplierOnFall * mainRigidbody.linearVelocity);
}
}
}
}
}
if (externalControllBehaviorActive) {
currentExternalControllerBehavior.updateControllerBehavior ();
}
if (customCharacterControllerActive) {
currentCustomCharacterControllerBase.updateCharacterControllerState ();
}
//in case the player is using the gravity power, the update of the rigidbody velocity stops
if (!gravityPowerActive) {
if ((usingAnimator && !useFirstPersonPhysicsInThirdPersonActive) ||
(!usingAnimator && !playerOnGround) ||
(usingAnimator && useFirstPersonPhysicsInThirdPersonActive && !playerOnGround)) {
if ((useMaxFallSpeed || useMaxFallSpeedExternallyActive) && !playerOnGround) {
float verticalSpeed = playerTransform.InverseTransformDirection (currentVelocity).y;
if (verticalSpeed < 0) {
Vector3 horizontalSpeed = currentVelocity - verticalSpeed * playerTransformUp;
float currentMaxFallSpeed = -maxFallSpeed;
if (customMaxFallSpeedExternally != 0) {
currentMaxFallSpeed = -customMaxFallSpeedExternally;
}
float verticalSpeedClamped = Mathf.Clamp (verticalSpeed, currentMaxFallSpeed, 100);
horizontalSpeed += verticalSpeedClamped * playerTransformUp;
currentVelocity = horizontalSpeed;
}
}
if (!pauseMainRigidbodyVelocityUpdate) {
mainRigidbody.linearVelocity = currentVelocity;
}
}
if (externalForceActive) {
mainRigidbody.linearVelocity += externalForceValue;
externalForceActive = false;
}
}
if (useLandMark && !externalControllBehaviorActive) {
updateLandMark ();
}
}
bool pauseMainRigidbodyVelocityUpdate;
public void setPauseMainRigidbodyVelocityUpdateState (bool state)
{
pauseMainRigidbodyVelocityUpdate = state;
}
public void setUseMaxFallSpeedExternallyActiveState (bool state)
{
useMaxFallSpeedExternallyActive = state;
}
public void setCustomMaxFallSpeedExternally (float newValue)
{
customMaxFallSpeedExternally = newValue;
}
public virtual void setMainAxisValues ()
{
axisValues = playerInput.getPlayerMovementAxis ();
}
public virtual void setMainRawAxisValues ()
{
rawAxisValues = playerInput.getPlayerRawMovementAxis ();
}
public virtual void setCustomAxisValues (Vector2 newValue)
{
}
public virtual void setAIMainAxisValues ()
{
axisValues = playerInput.getPlayerMovementAxisWithoutCheckingEnabled ();
}
public virtual void setMainAIRawAxisValues ()
{
rawAxisValues = playerInput.getPlayerRawMovementAxisWithoutCheckingEnabled ();
}
public virtual void updateOverrideInputValues (Vector2 inputValues, bool state)
{
playerInput.overrideInputValues (inputValues, state);
}
public virtual void setNewMainCameraTransform (Transform newTransform)
{
mainCameraTransform = newTransform;
}
public virtual void setNewPlayerCameraTransform (Transform newTransform)
{
playerCameraTransform = newTransform;
}
public void setDisableStrafeModeExternallyIfIncreaseWalkSpeedActiveState (bool state)
{
disableStrafeModeExternallyIfIncreaseWalkSpeedActive = state;
currentStrafeModeExternallyActive = false;
}
public void checkObstacleToAvoidMovement ()
{
checkObstacleRaycastPosition = currentPlayerPosition + (((currentHeight / 2) + obstacleDetectionRaycastHeightOffset) * playerTransformUp);
if (lockedCameraActive && useRelativeMovementToLockedCamera) {
checkObstacleRaycastDirection = lockedCameraMoveInput;
} else {
checkObstacleRaycastDirection = moveInput;
}
checkObstacleRaycastDirection.Normalize ();
obstacleDetectedAtRight = false;
obstacleDetectedAtLeft = false;
checkObstacleRaycastPosition += obstacleDetectionRaycastDistanceRightAndLeft * playerTransformRight;
if (Physics.Raycast (checkObstacleRaycastPosition, checkObstacleRaycastDirection, out hit, obstacleDetectionToAvoidMovementRaycastDistance, obstacleDetectionToAvoidMovementLayermask)) {
obstacleDetectedAtRight = true;
if (showGizmo) {
Debug.DrawRay (checkObstacleRaycastPosition, obstacleDetectionToAvoidMovementRaycastDistance * checkObstacleRaycastDirection, Color.red);
}
} else {
if (showGizmo) {
Debug.DrawRay (checkObstacleRaycastPosition, obstacleDetectionToAvoidMovementRaycastDistance * checkObstacleRaycastDirection, Color.green);
}
}
checkObstacleRaycastPosition -= (obstacleDetectionRaycastDistanceRightAndLeft * 2) * playerTransformRight;
if (Physics.Raycast (checkObstacleRaycastPosition, checkObstacleRaycastDirection, out hit, obstacleDetectionToAvoidMovementRaycastDistance, obstacleDetectionToAvoidMovementLayermask)) {
obstacleDetectedAtLeft = true;
if (showGizmo) {
Debug.DrawRay (checkObstacleRaycastPosition, obstacleDetectionToAvoidMovementRaycastDistance * checkObstacleRaycastDirection, Color.red);
}
} else {
if (showGizmo) {
Debug.DrawRay (checkObstacleRaycastPosition, obstacleDetectionToAvoidMovementRaycastDistance * checkObstacleRaycastDirection, Color.green);
}
}
if (obstacleDetectedAtRight || obstacleDetectedAtLeft) {
obstacleToAvoidMovementFound = true;
} else {
obstacleToAvoidMovementFound = false;
}
if (obstacleToAvoidMovementFound) {
currentMoveInput = vector3Zero;
}
}
public bool isObstacleToAvoidMovementFound ()
{
return obstacleToAvoidMovementFound;
}
public Vector3 getCurrentForwardDirection ()
{
return currentForwardDirection;
}
public Vector3 getCurrentRightDirection ()
{
return currentRightDirection;
}
public bool useSmoothPlayerRotationAxisOn2_5dEnabled = true;
public bool isUseSmoothPlayerRotationAxisOn2_5dEnabled ()
{
return useSmoothPlayerRotationAxisOn2_5dEnabled;
}
Vector3 current2_5dRightDirection;
Vector3 current2_5dLeftDirection;
public Vector3 getCurrent2_5dRightDirection ()
{
return current2_5dRightDirection;
}
//convert the global movement into local movement
void getMoveInput ()
{
Vector3 localMove = playerTransform.InverseTransformDirection (currentMoveInput);
//get the amount of rotation added to the character mecanim
if (currentMoveInput.magnitude > 0) {
turnAmount = Mathf.Atan2 (localMove.x, localMove.z);
} else {
turnAmount = Mathf.Atan2 (0, 0);
}
//adjust player orientation to lef or right according to the input direction pressed just once
if (!usedByAI && isPlayerMovingOn2_5dWorld ()) {
if (horizontalInput > 0) {
rotatingPlayerIn2_5dToRight = true;
rotatingPlayerIn2_5dToRLeft = false;
}
if (horizontalInput < 0) {
rotatingPlayerIn2_5dToRLeft = true;
rotatingPlayerIn2_5dToRight = false;
}
if (Mathf.Abs (horizontalInput) == 1) {
rotatingPlayerIn2_5dToRLeft = false;
rotatingPlayerIn2_5dToRight = false;
}
current2_5dRightDirection = currentLockedCameraTransform.right;
current2_5dLeftDirection = -currentLockedCameraTransform.right;
if (followSplinePathActive) {
Vector3 lookDirection = playerCameraManager.getSplineForwardDirection (playerTransform.position);
current2_5dRightDirection = lookDirection;
current2_5dLeftDirection = -lookDirection;
}
if (rotatingPlayerIn2_5dToRight) {
float angle = Vector3.SignedAngle (playerTransformForward, current2_5dRightDirection, playerTransformUp);
if (Mathf.Abs (angle) > 5) {
turnAmount = angle * Mathf.Deg2Rad;
} else {
turnAmount = 0;
rotatingPlayerIn2_5dToRight = false;
}
}
if (rotatingPlayerIn2_5dToRLeft) {
float angle = Vector3.SignedAngle (playerTransformForward, current2_5dLeftDirection, playerTransformUp);
if (Mathf.Abs (angle) > 5) {
turnAmount = angle * Mathf.Deg2Rad;
} else {
turnAmount = 0;
rotatingPlayerIn2_5dToRLeft = false;
}
}
if (playerIsAiming) {
if (horizontalInput != 0 || !useSmoothPlayerRotationAxisOn2_5dEnabled) {
turnAmount = 0;
rotatingPlayerIn2_5dToRLeft = false;
rotatingPlayerIn2_5dToRight = false;
}
} else {
if (!useSmoothPlayerRotationAxisOn2_5dEnabled) {
if (rotatingPlayerIn2_5dToRLeft) {
playerTransform.rotation = Quaternion.LookRotation (current2_5dLeftDirection);
playerCameraTransform.rotation = playerTransform.rotation;
turnAmount = 0;
rotatingPlayerIn2_5dToRLeft = false;
rotatingPlayerIn2_5dToRight = false;
} else if (rotatingPlayerIn2_5dToRight) {
playerTransform.rotation = Quaternion.LookRotation (current2_5dRightDirection);
playerCameraTransform.rotation = playerTransform.rotation;
turnAmount = 0;
rotatingPlayerIn2_5dToRLeft = false;
rotatingPlayerIn2_5dToRight = false;
}
}
}
//crouch using vertical input
if (crouchVerticalInput2_5dEnabled) {
if ((!crouching && verticalInput < 0) || (crouching && verticalInput > 0)) {
crouch ();
}
}
//move vertically on free floating mode or zero gravity mode
if (freeFloatingModeOn || zeroGravityModeOn) {
if (rawAxisValues.y != 0) {
movingVertically = true;
} else {
movingVertically = false;
}
}
if (!canMove || moveIputPaused) {
turnAmount = 0;
rotatingPlayerIn2_5dToRLeft = false;
rotatingPlayerIn2_5dToRight = false;
}
}
//get the amount of movement in forward direction
if (useMoveInpuptMagnitedeToForwardAmount) {
forwardAmount = currentMoveInput.magnitude;
} else {
forwardAmount = localMove.z;
}
forwardAmount = Mathf.Clamp (forwardAmount, -walkSpeed, walkSpeed);
if (checkQuickMovementTurn180DegreesOnRun) {
updatecheckQuickMovementTurn180DegreesOnRun (localMove);
}
}
void updatecheckQuickMovementTurn180DegreesOnRun (Vector3 localMove)
{
if (playerIsAiming ||
firstPersonActive ||
fullBodyAwarenessActive ||
!playerOnGround ||
actionActive ||
Time.time < lastTimeActionActive + 1) {
if (checkingQuickMovementDirectionActive || pausePlayerTransformExtraRotationActive) {
lastTimeMovementInputPressed = 0;
checkingQuickMovementDirectionActive = false;
pausePlayerTransformExtraRotationActive = false;
activateExtraRotationInQuickTurnMovement = false;
}
} else {
if (rawAxisValues != Vector2.zero) {
if (lastTimeMovementInputPressed == 0 && isPlayerMoving (0.95f)) {
lastTimeMovementInputPressed = Time.time;
if (showDebugPrint) {
print ("Starting to check");
}
checkingQuickMovementDirectionActive = true;
}
} else {
if (lastTimeMovementInputPressed != 0 && !isPlayerMoving (0.1f)) {
lastTimeMovementInputPressed = 0;
if (showDebugPrint) {
print ("Resetting check");
}
checkingQuickMovementDirectionActive = false;
}
}
if (checkingQuickMovementDirectionActive && Time.time > lastTimeMovementInputPressed + minDelayToActivateQuickMovementTurn180OnRun) {
float movementDirectionTurnAmount = Mathf.Atan2 (localMove.x, localMove.z);
if (Mathf.Abs (movementDirectionTurnAmount) > 0.95f) {
if (walkSpeed < 1) {
animator.SetInteger (quickTurnDirectionIDSpeedID, 0);
quickTurnMovementDuration = quickTurnMovementDurationWalking;
} else {
if (running) {
animator.SetInteger (quickTurnDirectionIDSpeedID, 2);
quickTurnMovementDuration = quickTurnMovementDurationRunning;
} else {
animator.SetInteger (quickTurnDirectionIDSpeedID, 1);
quickTurnMovementDuration = quickTurnMovementDurationSprinting;
activateExtraRotationInQuickTurnMovement = true;
}
}
if (movementDirectionTurnAmount > 0) {
animator.SetTrigger (quickTurnRightDirectionID);
} else {
animator.SetTrigger (quickTurnLeftDirectionID);
}
pausePlayerTransformExtraRotationActive = true;
checkingQuickMovementDirectionActive = false;
lastTimeQuickTurnActive = Time.time;
if (showDebugPrint) {
print ("quick change of direction");
}
}
}
if (pausePlayerTransformExtraRotationActive) {
if ((Time.time > lastTimeQuickTurnActive + quickTurnMovementDuration) ||
(playerInput.getPlayerRawMovementAxisWithoutCheckingEnabled () == Vector2.zero &&
Time.time > lastTimeQuickTurnActive + quickTurnMovementDuration / 2)) {
lastTimeMovementInputPressed = 0;
checkingQuickMovementDirectionActive = false;
pausePlayerTransformExtraRotationActive = false;
activateExtraRotationInQuickTurnMovement = false;
if (showDebugPrint) {
print ("resume player");
}
} else {
if (activateExtraRotationInQuickTurnMovement) {
Quaternion quickTurnRotatation = Quaternion.LookRotation (currentMoveInput, playerTransformUp);
mainRigidbody.rotation = Quaternion.Lerp (mainRigidbody.rotation, quickTurnRotatation, quickTurnMovementRotationSpeed * currentFixedUpdateDeltaTime);
}
}
}
}
}
bool ignoreLookInCameraDirection;
bool ignoreStrafeModeInputCheckActive;
public void setIgnoreLookInCameraDirectionValue (bool state)
{
ignoreLookInCameraDirection = state;
}
public void setIgnoreStrafeModeInputCheckActiveState (bool state)
{
ignoreStrafeModeInputCheckActive = state;
}
float turnAmountClampValue = 1;
public void setTurnAmountClampValue (float newValue)
{
turnAmountClampValue = newValue;
}
bool rotateInCameraDirectionOnAirOnExternalActionActive;
public void setRotateInCameraDirectionOnAirOnExternalActionActiveState (bool state)
{
rotateInCameraDirectionOnAirOnExternalActionActive = state;
}
//function used when the player is aim mode, so the character will rotate in the camera direction
void lookCameraDirection ()
{
if (usingAnimator) {
if (wallRunningActive) {
updateWallRunningState ();
} else {
bool rotateInLookDirectionResult = false;
if ((((playerIsAiming && lookInCameraDirectionOnFreeFireActive) || lookInCameraDirection || lookInCameraDirectionActive) && playerOnGround) ||
(playerIsAiming && !usingFreeFireMode && !playerOnGround)) {
rotateInLookDirectionResult = true;
}
if (fullBodyAwarenessActive) {
rotateInLookDirectionResult = true;
}
if (ignoreLookInCameraDirection) {
rotateInLookDirectionResult = false;
}
if (rotateInCameraDirectionOnAirOnExternalActionActive) {
if (!ignoreLookInCameraDirection && !rotateInLookDirectionResult && !playerOnGround) {
if (playerIsAiming || usingFreeFireMode) {
rotateInLookDirectionResult = true;
}
}
}
if (rotateInLookDirectionResult) {
bool ZGFFModeOnAir = ((zeroGravityModeOn || freeFloatingModeOn) && !playerOnGround);
if (!ZGFFModeOnAir) {
//get the camera direction, getting the local direction in any surface
Vector3 forward = playerCameraTransform.TransformDirection (Vector3.forward);
float newAngle = Vector3.Angle (forward, playerTransformForward);
Vector3 targetDirection = vector3Zero;
Quaternion targetRotation = quaternionIdentity;
forward = forward - playerTransform.InverseTransformDirection (forward).y * playerTransformUp;
forward = forward.normalized;
targetDirection = forward;
Quaternion currentRotation = Quaternion.LookRotation (targetDirection, playerTransformUp);
targetRotation = Quaternion.Lerp (mainRigidbody.rotation, currentRotation, aimTurnSpeed * currentFixedUpdateDeltaTime);
bool canRotatePlayer = (!lookAlwaysInCameraDirection ||
(lookAlwaysInCameraDirection && !lookOnlyIfMoving) ||
(lookAlwaysInCameraDirection && lookOnlyIfMoving && playerUsingInput) ||
(lookAlwaysInCameraDirection && lookOnlyIfMoving && !playerUsingInput && playerIsAiming));
if (ignoreCameraDirectionOnStrafeMovement) {
canRotatePlayer = false;
}
if (fullBodyAwarenessActive) {
canRotatePlayer = true;
}
if (newAngle >= Mathf.Abs (thresholdAngleDifference)) {
//if the player is not moving, set the turnamount to rotate him around, setting its turn animation properly
if (canRotatePlayer) {
targetRotation = Quaternion.Lerp (mainRigidbody.rotation, currentRotation, autoTurnSpeed * currentFixedUpdateDeltaTime);
// mainRigidbody.MoveRotation (targetRotation);
Vector3 lookDelta = playerTransform.InverseTransformDirection (targetDirection * 100);
float lookAngle = Mathf.Atan2 (lookDelta.x, lookDelta.z) * Mathf.Rad2Deg;
turnAmount += lookAngle * .01f * 6;
}
} else {
turnAmount = Mathf.MoveTowards (turnAmount, 0, currentFixedUpdateDeltaTime * 2);
}
if (rotateDirectlyTowardCameraOnStrafe || fullBodyAwarenessActive) {
turnAmount = 0;
}
if (canRotatePlayer) {
if (fullBodyAwarenessActive) {
lookCameraDirectionInFBAIsCurrentlyActive = true;
} else {
mainRigidbody.MoveRotation (targetRotation);
}
} else {
if (fullBodyAwarenessActive) {
lookCameraDirectionInFBAIsCurrentlyActive = false;
}
}
}
}
if ((zeroGravityModeOn || freeFloatingModeOn) && !firstPersonActive && !playerOnGround && !characterRotatingToSurface) {
if (isPlayerMovingOn3dWorld () || playerIsAiming) {
if (playerIsAiming) {
if (fullBodyAwarenessActive) {
lookCameraDirectionInFBAIsCurrentlyActive = true;
} else {
playerTransform.rotation = playerCameraTransform.rotation;
}
} else {
if (fullBodyAwarenessActive) {
lookCameraDirectionInFBAIsCurrentlyActive = true;
} else {
if ((zeroGravityModeOn || freeFloatingModeOn) && isPlayerMovingOn3dWorld ()) {
Quaternion targetRotation = Quaternion.Lerp (playerTransform.rotation, playerCameraTransform.rotation, zeroGravityLookCameraSpeed * currentFixedUpdateDeltaTime);
playerTransform.rotation = targetRotation;
}
}
}
}
}
}
} else {
//Check if the wall running function is active
if (wallRunningActive) {
updateWallRunningState ();
} else {
if (!characterRotatingToSurface && !pausePlayerRotateToCameraDirectionOnFirstPersonActive) {
playerTransform.rotation = playerCameraTransform.rotation;
}
}
}
}
public bool isLookCameraDirectionInFBAIsCurrentlyActive ()
{
return lookCameraDirectionInFBAIsCurrentlyActive;
}
bool lookCameraDirectionInFBAIsCurrentlyActive;
bool pausePlayerRotateToCameraDirectionOnFirstPersonActive;
public void setPausePlayerRotateToCameraDirectionOnFirstPersonActiveState (bool state)
{
pausePlayerRotateToCameraDirectionOnFirstPersonActive = state;
}
void addExtraRotation ()
{
if (addExtraRotationPaused) {
return;
}
if (fullBodyAwarenessActive) {
return;
}
if (usingAnimator && !wallRunningActive) {
if ((!playerIsAiming || !lookInCameraDirectionOnFreeFireActive) && !lookInCameraDirectionActive) {
canRotateOn3dWorld = isPlayerMovingOn3dWorld () && ((!freeFloatingModeOn && !zeroGravityModeOn) || playerOnGround);
//&& !playerCameraManager.isCurrentCameraLookInPlayerDirection ();
canRotateOn2_5dWorld = isPlayerMovingOn2_5dWorld ();
if (flyModeActive) {
canRotateOn3dWorld = false;
}
if (canRotateOn3dWorld || canRotateOn2_5dWorld) {
if (pausePlayerTransformExtraRotationActive) {
return;
}
if (!freeFloatingModeOn && !zeroGravityModeOn) {
if (keepLastMovementInputOnJump) {
if (!playerOnGround && lastMoveInputOnJump != vector3Zero && !ignoreLastMoveInputOnJump) {
return;
}
}
}
//add an extra rotation to the player to get a smooth movement
if (lockedCameraActive && !usedByAI) {
float turnSpeed = Mathf.Lerp (stationaryTurnSpeed, movingTurnSpeed, forwardAmount);
if (useTankControls) {
turnSpeed *= tankModeRotationSpeed;
float newRotationValue = horizontalInput * turnSpeed * currentFixedUpdateDeltaTime * 1.5f;
if (ignorePlayerExtraRotationOnAirEnabled && !playerOnGround) {
newRotationValue = 0;
}
if (Mathf.Abs (newRotationValue) > 0.001f) {
playerTransform.Rotate (0, newRotationValue, 0);
}
} else {
float newRotationValue = turnAmount * turnSpeed * currentFixedUpdateDeltaTime * 1.5f;
if (ignorePlayerExtraRotationOnAirEnabled && !playerOnGround) {
newRotationValue = 0;
}
if (Mathf.Abs (newRotationValue) > 0.001f) {
playerTransform.Rotate (0, newRotationValue, 0);
}
}
} else {
if (!playerIsAiming || useTurnSpeedOnAim) {
float turnSpeed = Mathf.Lerp (stationaryTurnSpeed, movingTurnSpeed, forwardAmount);
float newRotationValue = turnAmount * turnSpeed * currentFixedUpdateDeltaTime * 1.5f;
if (ignorePlayerExtraRotationOnAirEnabled && !playerOnGround) {
newRotationValue = 0;
}
if (Mathf.Abs (newRotationValue) > 0.001f) {
playerTransform.Rotate (0, newRotationValue, 0);
}
}
}
}
}
}
}
//set the normal of the player every time it is changed in the other script
public void setCurrentNormalCharacter (Vector3 newNormal)
{
currentNormal = newNormal;
}
public void setApplyAnimatorVelocityWithoutMovingState (bool state)
{
applyAnimatorVelocityWithoutMoving = state;
}
//check if the player jumps
void onGroundVelocity ()
{
if (currentMoveInput.magnitude == 0 && !actionActiveWithMovement && (!applyAnimatorVelocityWithoutMoving || actionActive)) {
if (!movingInsideVehicle) {
currentVelocity = vector3Zero;
}
}
//check when the player is able to jump, according to the timer and the animator state
bool animationGrounded = false;
if (usingAnimator && !useFirstPersonPhysicsInThirdPersonActive && !customCharacterControllerActive && !fullBodyAwarenessActive) {
if (ignoreAnimatorGroundStateOnJumpCheck) {
if (playerOnGround) {
animationGrounded = true;
}
} else {
animationGrounded = animator.GetCurrentAnimatorStateInfo (baseLayerIndex).IsName ("Grounded");
if (!animationGrounded) {
if (playerOnGround && Time.time > lastTimeGround + half) {
animationGrounded = true;
}
}
}
} else {
animationGrounded = playerOnGround;
}
//if the player jumps, apply velocity to its rigidbody
if (jumpInput && Time.time > lastTimeAir + readyToJumpTime && animationGrounded) {
bool activateJumpInputResult = true;
if (!ignoreUseDelayOnGroundJumpActive) {
if (useDelayOnGroundJump) {
activateJumpInputInProcess = false;
if (useDelayOnGroundJumpOnlyIfNotMoving) {
if (!isMoving) {
activateJumpInputResult = false;
}
} else {
activateJumpInputResult = false;
}
}
}
if (fullBodyAwarenessActive) {
if (ignoreDelayOnGroundJumpOnFBA) {
activateJumpInputResult = true;
}
}
if (lastJumpActivatedExternally) {
activateJumpInputResult = true;
}
waitingToActivateJumpInputWithDelay = false;
if (activateJumpInputResult) {
activateJumpInput ();
} else {
StartCoroutine (activateJumpInputCoroutine ());
}
}
if (activateJumpInputInProcess) {
if (Time.time > lastTimeAir + readyToJumpTime && animationGrounded) {
activateJumpInput ();
}
activateJumpInputInProcess = false;
}
jumpInput = false;
lastJumpActivatedExternally = false;
}
bool activateJumpInputInProcess;
bool waitingToActivateJumpInputWithDelay;
IEnumerator activateJumpInputCoroutine ()
{
waitingToActivateJumpInputWithDelay = true;
if (useEventOnDelayOnGroundJump) {
eventOnDelayOnGroundJump.Invoke ();
}
WaitForSeconds delay = new WaitForSeconds (delayOnGroundJump);
yield return delay;
activateJumpInputInProcess = true;
waitingToActivateJumpInputWithDelay = false;
}
void activateJumpInput ()
{
if (activateJumpInputInProcess) {
if (!playerOnGround) {
return;
}
}
if (updateFootStepStateActive) {
if (playerOnGround) {
if (currentFootStepState != footStepState.Jumping) {
stepManager.setFootStepState ("Jumping");
currentFootStepState = footStepState.Jumping;
}
}
}
if (customCharacterControllerActive) {
currentCustomCharacterControllerBase.activateJumpAnimatorState ();
} else {
if (lastJumpAnimatorIDValue != 0) {
lastJumpAnimatorIDValue = 0;
animator.SetFloat (jumpAnimatorID, 0);
}
}
setOnGroundState (false);
if (keepLastMovementInputOnJump) {
lastMoveInputOnJump = currentMoveInput;
}
if (usingAnimator && !useFirstPersonPhysicsInThirdPersonActive) {
currentVelocity = airSpeed * currentMoveInput;
} else {
currentVelocity = noAnimatorAirSpeed * currentMoveInput;
}
currentVelocity = currentVelocity + jumpPower * playerTransformUp;
if (extraForceOnJumpActive) {
currentVelocity += extraForceOnJumpAmount * playerTransformUp;
extraForceOnJumpActive = false;
}
jump = true;
lastJumpTime = Time.time;
//this is used for the headbod, to shake the camera when the player jumps
if (updateHeadbobState && headBobManagerLocated) {
if (currentHeadbobState != headbobState.Jump_Start) {
headBobManager.setState ("Jump Start");
currentHeadbobState = headbobState.Jump_Start;
}
}
if (weaponsManagerLocated) {
weaponsManager.setWeaponsJumpStartPositionState (true);
}
disableCrouchState = false;
if (firstPersonActive) {
if (getUpIfJumpOnCrouchInFirstPerson) {
disableCrouchState = true;
}
} else {
if (getUpIfJumpOnCrouchInThirdPerson) {
disableCrouchState = true;
}
}
if (disableCrouchState) {
if (crouching) {
setCrouchComponentsState (false);
if (firstPersonActive) {
crouching = false;
}
}
}
if (useEventOnJump) {
eventOnJump.Invoke ();
}
if (useEventOnGroundJump) {
eventOnGroundJump.Invoke ();
}
if (stopCrouchOnJumpEnabled) {
if (crouching) {
if (playerCanGetUpFromCrouch ()) {
stopCrouchFromAutoJumpActive = true;
if (!firstPersonActive) {
if (weaponsManagerLocated) {
if (weaponsManager.isIgnoreCrouchWhileWeaponActive () || !weaponsManager.isAimingWeapons ()) {
if (!fullBodyAwarenessActive) {
weaponsManager.enableOrDisableIKOnHands (true);
}
}
}
}
setCrouchComponentsState (false);
if (crouchSlidingEnabled && running) {
if (firstPersonActive) {
stopCrouchSliding ();
}
}
}
}
}
}
public void setIgnoreUseDelayOnGroundJumpActiveState (bool state)
{
ignoreUseDelayOnGroundJumpActive = state;
}
public void enableOrDisableUseDelayOnGroundJumpState (bool state, float delayAmount)
{
useDelayOnGroundJump = state;
delayOnGroundJump = delayAmount;
}
bool stopCrouchFromAutoJumpActive;
//check if the player is in the air falling, applying the gravity force in his local up negative
void onAirVelocity ()
{
if (!gravityPowerActive &&
!usingJetpack &&
(!flyModeActive || enableExternalForceOnFlyMode) &&
!characterRotatingToSurface &&
(!swimModeActive || enableExternalForceOnSwimMode) &&
!externalControlBehaviorForAirTypeActive) {
//when the player falls, allow him to move to his right, left, forward and backward with WASD
if (zeroGravityModeOn || freeFloatingModeOn) {
secondaryMoveInput = currentMoveInput;
canMoveVertically = (zeroGravityModeOn && canMoveVerticallyOnZeroGravity) || (freeFloatingModeOn && canMoveVerticallyOnFreeFloating);
canMoveVerticallyAndHorizontal = (zeroGravityModeOn && canMoveVerticallyAndHorizontalZG) || (freeFloatingModeOn && canMoveVerticallyAndHorizontalFF);
if (movingVertically) {
if (zeroGravityModeOn) {
currentVerticalSpeed = zeroGravityModeVerticalSpeed;
} else {
currentVerticalSpeed = freeFloatingModeVerticalSpeed;
}
if (canMoveVerticallyAndHorizontal) {
secondaryMoveInput += (verticalInput * currentVerticalSpeed) * playerCameraTransform.up;
} else {
secondaryMoveInput = currentVerticalSpeed * (verticalInput * playerCameraTransform.up + horizontalInput * mainCameraTransform.right);
}
}
if (externalForceOnAirActive) {
airMove = externalForceOnAirValue;
currentVelocity = Vector3.Lerp (currentVelocity, airMove, currentFixedUpdateDeltaTime * externalForceOnAirControlValue);
externalForceOnAirActive = false;
} else {
if (zeroGravityModeOn) {
secondaryMove = (zeroGravityMovementSpeed * currentZeroGravitySpeedMultiplier) * secondaryMoveInput;
currentVelocity = Vector3.Lerp (currentVelocity, secondaryMove, currentFixedUpdateDeltaTime * zeroGravityControlSpeed);
}
if (freeFloatingModeOn) {
secondaryMove = (freeFloatingMovementSpeed * currentFreeFloatingSpeedMultiplier) * secondaryMoveInput;
currentVelocity = Vector3.Lerp (currentVelocity, secondaryMove, currentFixedUpdateDeltaTime * freeFloatingControlSpeed);
}
}
} else {
if (usingAnimator && !useFirstPersonPhysicsInThirdPersonActive && !wallRunningActive) {
if (externalForceOnAirActive) {
airMove = externalForceOnAirValue;
currentVelocity = Vector3.Lerp (currentVelocity, airMove, currentFixedUpdateDeltaTime * externalForceOnAirControlValue);
externalForceOnAirActive = false;
} else {
if (!ignoreInputOnAirControlActive) {
airMove = playerTransform.InverseTransformDirection (currentVelocity).y * playerTransformUp;
bool surfaceDetectedCloseToPlayerResult = false;
if (Time.time > lastTimeFalling + half) {
if (Physics.Raycast (playerTransform.position, -currentPlayerUp, 0.6f, layer)) {
surfaceDetectedCloseToPlayerResult = true;
}
}
if (!surfaceDetectedCloseToPlayerResult) {
if (keepLastMovementInputOnJump) {
Vector3 newAirMove = vector3Zero;
if (Time.time < lastJumpTime + keepLastMovementInputOnJumpDuration) {
if (lastMoveInputOnJump != vector3Zero) {
newAirMove = airSpeed * lastMoveInputOnJump;
}
if (allowRegularAirInputControlOnAirAfterJumpDuration) {
if (isPlayerUsingInput ()) {
// && isPlayerMoving (0.6f)
lastMoveInputOnJump = currentMoveInput;
newAirMove = airSpeed * currentMoveInput;
ignoreLastMoveInputOnJump = true;
}
}
} else {
resetLastMoveInputOnJumpValue ();
if (allowRegularAirInputControlOnAirAfterJumpDuration) {
newAirMove = airSpeed * currentMoveInput;
}
}
airMove += newAirMove;
} else {
airMove += airSpeed * currentMoveInput;
}
}
currentVelocity = Vector3.Lerp (currentVelocity, airMove, currentFixedUpdateDeltaTime * airControl);
}
}
}
checkIfActivateWallRunningState ();
}
//also, apply force in his local negative Y Axis
if (!playerOnGround) {
if (slowingFallInput) {
slowingFall = true;
slowingFallInput = false;
}
if (!gravityForcePaused && !zeroGravityModeOn && !freeFloatingModeOn && !wallRunningActive && !pauseAllPlayerDownForces && !externalControlBehaviorForAirTypeActive) {
mainRigidbody.AddForce (mainRigidbody.mass * gravityForce * playerTransformUp);
extraGravityForce = (gravityForce * gravityMultiplier) * playerTransformUp + (-gravityForce) * playerTransformUp;
mainRigidbody.AddForce (extraGravityForce);
}
}
//also apply force if the player jumps again
if (doubleJump) {
if (usingAnimator && !useFirstPersonPhysicsInThirdPersonActive) {
currentVelocity += airSpeed * currentMoveInput;
} else {
currentVelocity += noAnimatorAirSpeed * currentMoveInput;
}
float currentDoubleJumpPower = jumpPower;
if (useNewDoubleJumpPower) {
currentDoubleJumpPower = doubleJumpPower;
}
if (removeVerticalSpeedOnDoubleJump) {
float currentVerticalVelocity = playerTransform.InverseTransformDirection (currentVelocity).y;
currentVelocity -= currentVerticalVelocity * playerTransform.up;
}
currentVelocity = currentVelocity + currentDoubleJumpPower * playerTransformUp;
if (!ladderFound) {
jumpsAmount++;
}
lastDoubleJumpTime = Time.time;
if (useEventOnJump) {
eventOnJump.Invoke ();
}
if (useEventOnDoubleJump) {
eventOnDoubleJump.Invoke ();
}
}
doubleJump = false;
} else {
if (characterRotatingToSurface) {
mainRigidbody.linearVelocity = vector3Zero;
currentVelocity = vector3Zero;
}
}
if (fallDamageEnabled) {
lastFrameAirVelocity = mainRigidbody.linearVelocity.magnitude;
}
}
public void setApplyRootMotionAlwaysActiveState (bool state)
{
applyRootMotionAlwaysActive = state;
}
public void updateAnimatorExternally ()
{
if (animator.enabled) {
Update ();
updateAnimator ();
}
}
void setApplyRootMotionState (bool state)
{
if (currentApplyRootMotionValue != state) {
animator.applyRootMotion = state;
}
currentApplyRootMotionValue = state;
rootMotionCurrentlyActive = state;
}
//update the animator values
void updateAnimator ()
{
//set the rootMotion according to the player state
if (fullBodyAwarenessActive && !useRootMotionOnFullBodyAwareness) {
if (currentApplyRootMotionValue) {
setApplyRootMotionState (false);
}
} else {
if (!applyRootMotionAlwaysActive) {
if (useRootMotionActive) {
if (currentApplyRootMotionValue != playerOnGround) {
setApplyRootMotionState (playerOnGround);
}
} else {
if (currentApplyRootMotionValue) {
setApplyRootMotionState (false);
}
}
} else {
if (!currentApplyRootMotionValue) {
setApplyRootMotionState (true);
}
}
}
if (running && sprintEnabled && sprintCanBeUsed) {
forwardAmount *= 2;
}
if (customCharacterControllerActive) {
if (currentCustomCharacterControllerBase.updateForwardAmountInputValueFromPlayerController) {
currentCustomCharacterControllerBase.updateForwardAmountInputValue (forwardAmount);
}
if (currentCustomCharacterControllerBase.updateTurnAmountInputValueFromPlayerController) {
currentCustomCharacterControllerBase.updateTurnAmountInputValue (turnAmount);
}
if (currentCustomCharacterControllerBase.updateUsingInputValueFromPlayerController) {
currentCustomCharacterControllerBase.updatePlayerUsingInputValue (playerUsingInput);
}
updateAnimatorSpeed ();
} else {
if (!lockedCameraActive || !isPlayerMovingOn2_5dWorld ()) {
//if the player is not aiming, set the forward direction
if (!playerIsAiming || (!lookInCameraDirectionActive && (usingFreeFireMode || (checkToKeepWeaponAfterAimingWeaponFromShooting || Time.time < lastTimeCheckToKeepWeapon + 0.2f)))) {
lastForwardAnimatorIDValue = forwardAmount;
animator.SetFloat (forwardAnimatorID, forwardAmount, animatorForwardInputLerpSpeed, currentFixedUpdateDeltaTime);
} else {
if (lastForwardAnimatorIDValue != 0) {
lastForwardAnimatorIDValue = 0;
//else, set its forward to 0, to prevent any issue
//this value is set to 0, because the player uses another layer of the mecanim to move while he is aiming
animator.SetFloat (forwardAnimatorID, 0);
}
}
} else {
lastForwardAnimatorIDValue = forwardAmount;
animator.SetFloat (forwardAnimatorID, forwardAmount, animatorForwardInputLerpSpeed, currentFixedUpdateDeltaTime);
}
if (isTankModeActive ()) {
if (!playerIsAiming) {
if (lastTurnAnimatorIDValue != 0) {
lastTurnAnimatorIDValue = 0;
animator.SetFloat (turnAnimatorID, 0);
}
if (tankModeCurrentlyEnabled) {
tankModeActive = true;
} else {
tankModeActive = false;
}
} else {
if (isPlayerMoving (0)) {
turnAmount = 0;
}
if (overrideTurnAmountActive) {
turnAmount = overrideTurnAmount;
}
turnAmount = Mathf.Clamp (turnAmount, -1, 1);
lastTurnAnimatorIDValue = turnAmount;
animator.SetFloat (turnAnimatorID, turnAmount, animatorTurnInputLerpSpeed, currentFixedUpdateDeltaTime);
if (playerCanMoveOnAimInTankMode) {
tankModeActive = false;
}
}
} else {
if (ignoreStrafeModeInputCheckActive) {
lastTimePlayerUserInput = 0;
ignoreStrafeModeInputCheckActive = false;
strafeModeActive = false;
}
if (strafeModeActive) {
if (lookAlwaysInCameraDirection && lookOnlyIfMoving) {
if (!playerIsAiming) {
turnAmount = 0;
lastTimePlayerUserInput = Time.time;
}
}
if (playerUsingInput) {
turnAmount = 0;
lastTimePlayerUserInput = Time.time;
}
}
if (lastTimePlayerUserInput > 0) {
if (isPlayerMoving (0)) {
turnAmount = 0;
} else {
lastTimePlayerUserInput = 0;
}
}
if (overrideTurnAmountActive) {
turnAmount = overrideTurnAmount;
}
turnAmount = Mathf.Clamp (turnAmount, -turnAmountClampValue, turnAmountClampValue);
lastTurnAnimatorIDValue = turnAmount;
animator.SetFloat (turnAnimatorID, turnAmount, animatorTurnInputLerpSpeed, currentFixedUpdateDeltaTime);
tankModeActive = false;
}
if (Mathf.Abs (horizontalInput) > 0 || Mathf.Abs (verticalInput) > 0) {
lastTimeInput = Time.time;
}
if (useTankControls) {
lastTimeInputPressed = true;
} else {
lastTimeInputPressed = Time.time > lastTimeInput + minTimeToSetIdleOnStrafe;
}
if (obstacleToAvoidMovementFound) {
lastTimeInputPressed = true;
}
if (previousValueLastTimeInputPressed != lastTimeInputPressed) {
previousValueLastTimeInputPressed = lastTimeInputPressed;
animator.SetBool (lastTimeInputPressedAnimatorID, lastTimeInputPressed);
}
if (overrideOnGroundAnimatorValueActive) {
onGroundAnimatorState = playerOnGroundAnimatorStateOnOverrideOnGround;
if (playerOnGroundAnimatorStateOnOverrideOnGroundWithTime) {
if (Time.time > lastTimeOverrideOnGroundAnimator + overrideOnGroundDuration) {
overrideOnGroundAnimatorValueActive = false;
}
}
} else {
onGroundAnimatorState = playerOnGround;
}
if (previousValueOnGroundAnimatorState != onGroundAnimatorState) {
previousValueOnGroundAnimatorState = onGroundAnimatorState;
animator.SetBool (onGroundAnimatorID, onGroundAnimatorState);
setTimeOnAirAnimatorIDValue ();
}
if (previousValueCrouching != crouching) {
previousValueCrouching = crouching;
animator.SetBool (crouchAnimatorID, crouching);
}
animator.SetBool (strafeModeActiveAnimatorID, strafeModeActive);
if (lockedCameraActive) {
if (isPlayerMovingOn2_5dWorld ()) {
bool avoidStrafeModeActiveOnAnimatorResult = true;
if (playerUsingMeleeWeapons && isPlayerAiming ()) {
avoidStrafeModeActiveOnAnimatorResult = false;
}
if (avoidStrafeModeActiveOnAnimatorResult) {
scrollModeActive = true;
animator.SetBool (strafeModeActiveAnimatorID, false);
} else {
scrollModeActive = false;
}
} else {
scrollModeActive = false;
}
} else {
scrollModeActive = false;
}
movingAnimator = isMoving;
if (obstacleToAvoidMovementFound) {
movingAnimator = false;
}
if (previousValueMovingAnimator != movingAnimator) {
previousValueMovingAnimator = movingAnimator;
animator.SetBool (movingAnimatorID, movingAnimator);
}
movementInputActive = playerUsingInput;
if (obstacleToAvoidMovementFound) {
movementInputActive = false;
}
if (tankModeActive && !playerCanMoveOnAimInTankMode) {
if (playerIsAiming) {
movementInputActive = false;
}
}
if (movementInputIgnoredOnAimActive) {
movementInputActive = false;
}
if (previousValueMovementInputActive != movementInputActive) {
previousValueMovementInputActive = movementInputActive;
animator.SetBool (movementInputActiveAnimatorID, movementInputActive);
}
movementRelativeToCameraAnimatorState = lockedCameraActive && useRelativeMovementToLockedCamera && !usedByAI;
if (previousValueMovementRelativeToCameraState != movementRelativeToCameraAnimatorState) {
previousValueMovementRelativeToCameraState = movementRelativeToCameraAnimatorState;
animator.SetBool (movementRelativeToCameraAnimatorID, movementRelativeToCameraAnimatorState);
}
if (playerIsAiming) {
currentMovementID = 1;
} else {
if (fullBodyAwarenessActive) {
if (playerUsingWeapons) {
currentMovementID = 1;
} else {
currentMovementID = 0;
}
} else {
currentMovementID = 0;
}
}
//CHECK FOR FBA HOLDING POSTURE WEAPON CHECK
animator.SetFloat (movementIDAnimatorID, currentMovementID, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
if (!tankModeActive && !scrollModeActive) {
currentPlayerModeID = 0;
} else {
if (tankModeActive) {
currentPlayerModeID = 1;
}
if (scrollModeActive) {
currentPlayerModeID = 2;
}
}
animator.SetFloat (playerModeIDAnimatorID, currentPlayerModeID, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
if (weaponsManagerLocated) {
carryingWeaponAnimatorState = playerUsingWeapons;
} else {
carryingWeaponAnimatorState = false;
}
if (previousValueCarryingWeaponAnimatorState != carryingWeaponAnimatorState) {
previousValueCarryingWeaponAnimatorState = carryingWeaponAnimatorState;
animator.SetBool (carryingWeaponAnimatorID, carryingWeaponAnimatorState);
}
if (lockedCameraActive && useRelativeMovementToLockedCamera && !usedByAI) {
currentWalkSpeedOnLockedCamera = walkSpeed;
if (isPlayerAiming ()) {
currentWalkSpeedOnLockedCamera = 1;
}
if (!playerIsAiming && playerCameraManager.isShowCameraCursorWhenNotAimingActive ()) {
lockedCameraMoveInput = currentWalkSpeedOnLockedCamera *
(verticalInput * playerCameraTransform.forward + horizontalInput * mainCameraTransform.right);
} else {
lockedCameraMoveInput = currentWalkSpeedOnLockedCamera *
(verticalInput * currentLockedCameraTransform.forward + horizontalInput * currentLockedCameraTransform.right);
}
lockedMove = playerTransform.InverseTransformDirection (lockedCameraMoveInput);
currentHorizontalValue = lockedMove.x;
currentVerticalValue = lockedMove.z;
} else {
if (tankModeActive) {
if (running && sprintEnabled && sprintCanBeUsed) {
verticalInput *= 2;
} else {
if (verticalInput > 0) {
currentWalkSpeedOnLockedCamera = walkSpeed;
if (isPlayerAiming ()) {
currentWalkSpeedOnLockedCamera = 1;
}
verticalInput = Mathf.Clamp (verticalInput, 0, currentWalkSpeedOnLockedCamera);
}
}
}
currentHorizontalValue = horizontalInput;
currentVerticalValue = verticalInput;
}
if (useTankControls) {
currentHorizontalInputLerpSpeed = inputTankControlsHorizontalLerpSpeed;
currentVerticalInputLerpSpeed = inputTankControlsVerticalLerpSpeed;
} else {
currentHorizontalInputLerpSpeed = inputHorizontalLerpSpeed;
currentVerticalInputLerpSpeed = inputVerticalLerpSpeed;
}
if (flyModeActive || swimModeActive || externalControlBehaviorForAirTypeActive) {
if (!firstPersonActive && !characterRotatingToSurface) {
if (isMoving && isPlayerAiming ()) {
currentHorizontalValue = 0;
currentVerticalValue = 0;
}
if (flyModeActive) {
if (isPlayerMovingOn2_5dWorld ()) {
currentHorizontalValue = 0;
}
}
}
}
lastHorizontalAnimatorIDValue = currentHorizontalValue;
animator.SetFloat (horizontalAnimatorID, currentHorizontalValue, currentHorizontalInputLerpSpeed, currentFixedUpdateDeltaTime);
lastVerticalAnimatorIDValue = currentVerticalValue;
animator.SetFloat (verticalAnimatorID, currentVerticalValue, currentVerticalInputLerpSpeed, currentFixedUpdateDeltaTime);
if (obstacleToAvoidMovementFound) {
currentHorizontalValue = 0;
currentVerticalValue = 0;
}
if (useTankControls) {
currentInputStrafeHorizontalLerpSpeed = inputTankControlsHorizontalStrafeLerpSpeed;
currentInputStrafeVerticalLerpSpeed = inputTankControlsVerticalStrafeLerpSpeed;
} else {
currentInputStrafeHorizontalLerpSpeed = inputStrafeHorizontalLerpSpeed;
currentInputStrafeVerticalLerpSpeed = inputStrafeVerticalLerpSpeed;
}
if (usedByAI) {
if (!playerIsAiming && !AIStrafeModeActive) {
currentHorizontalValue = 0;
currentVerticalValue = 0;
}
}
animator.SetFloat (horizontalStrafeAnimatorID, currentHorizontalValue, currentInputStrafeHorizontalLerpSpeed, currentFixedUpdateDeltaTime);
animator.SetFloat (verticalStrafeAnimatorID, currentVerticalValue, currentInputStrafeVerticalLerpSpeed, currentFixedUpdateDeltaTime);
if (strafeModeActive) {
if (running) {
currentMovementSpeed = defaultStrafeRunSpeed;
} else {
currentMovementSpeed = defaultStrafeWalkSpeed;
}
} else {
currentMovementSpeed = defaultStrafeWalkSpeed;
}
animator.SetFloat (movementSpeedAnimatorID, currentMovementSpeed, strafeLerpSpeed, currentFixedUpdateDeltaTime);
if (!playerOnGround) {
//when the player enables the power gravity and he is floating in the air, set this value to 0 to set
//the look like floating animation
if (gravityPowerActive) {
if (lastJumpAnimatorIDValue != 0) {
lastJumpAnimatorIDValue = 0;
animator.SetFloat (jumpAnimatorID, 0);
}
}
//else set his jump value as his current rigidbody velocity
else {
if (zeroGravityModeOn || freeFloatingModeOn) {
if (lastJumpAnimatorIDValue != 0) {
lastJumpAnimatorIDValue = 0;
animator.SetFloat (jumpAnimatorID, 0);
}
} else {
currentJumpAnimatorValue = playerTransform.InverseTransformDirection (mainRigidbody.linearVelocity).y;
if (jumpLegExternallyActiveState) {
currentJumpAnimatorValue = -9;
}
lastJumpAnimatorIDValue = currentJumpAnimatorValue;
animator.SetFloat (jumpAnimatorID, currentJumpAnimatorValue, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime / 2);
}
}
}
if (usingJetpack || flyModeActive || turnAndForwardAnimatorValuesPaused) {
if (lastForwardAnimatorIDValue != 0) {
lastForwardAnimatorIDValue = 0;
animator.SetFloat (forwardAnimatorID, 0);
}
if (lastTurnAnimatorIDValue != 0) {
lastTurnAnimatorIDValue = 0;
animator.SetFloat (turnAnimatorID, 0);
}
}
//this value is used to know in which leg the player has to jump, left of right
float runCycle = Mathf.Repeat (animator.GetCurrentAnimatorStateInfo (baseLayerIndex).normalizedTime + runCycleLegOffset, 1);
float jumpLeg = (runCycle < half ? 1 : -1) * forwardAmount;
if (playerOnGround) {
if (lastJumpLegAnimatorIDValue != jumpLeg) {
lastJumpLegAnimatorIDValue = jumpLeg;
animator.SetFloat (jumpLegAnimatorID, jumpLeg);
}
} else {
if (zeroGravityModeOn || freeFloatingModeOn) {
if (currentJumpLeg == 0) {
currentJumpLeg = jumpLeg;
}
if (zeroGravityModeOn) {
currentJumpLeg = 1;
}
currentJumpLeg = Mathf.Lerp (currentJumpLeg, 1, currentFixedUpdateDeltaTime);
if (lastJumpLegAnimatorIDValue != currentJumpLeg) {
lastJumpLegAnimatorIDValue = currentJumpLeg;
animator.SetFloat (jumpLegAnimatorID, currentJumpLeg);
}
}
if (gravityPowerActive || jumpLegExternallyActiveState) {
if (playerUsingWeapons || aimingPowers) {
currentJumpLeg = Mathf.Lerp (currentJumpLeg, 1, currentFixedUpdateDeltaTime / 2);
} else {
currentJumpLeg = Mathf.Lerp (currentJumpLeg, 0, currentFixedUpdateDeltaTime / 2);
}
lastJumpLegAnimatorIDValue = currentJumpLeg;
animator.SetFloat (jumpLegAnimatorID, currentJumpLeg, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime / 2);
}
}
//CHECK FOR FBA HOLDING POSTURE WEAPON CHECK
if (playerIsAiming && !usingFreeFireMode && !checkToKeepWeaponAfterAimingWeaponFromShooting) {
aimingModeActiveAnimatorState = true;
} else {
if (fullBodyAwarenessActive) {
if ((playerIsAiming && weaponsManager.isAimModeInputPressed ()) || playerUsingWeapons) {
aimingModeActiveAnimatorState = true;
} else {
if (weaponsManager.isHolsteringWeaponInProcess () && weaponsManager.isdrawKeepWeaponAnimationInProcess ()) {
aimingModeActiveAnimatorState = true;
} else {
aimingModeActiveAnimatorState = false;
}
}
} else {
if (playerIsAiming && usingNewWeaponID) {
aimingModeActiveAnimatorState = true;
} else {
aimingModeActiveAnimatorState = false;
}
}
}
if (previousValueAimingModeActiveAnimatorState != aimingModeActiveAnimatorState) {
previousValueAimingModeActiveAnimatorState = aimingModeActiveAnimatorState;
animator.SetBool (aimingModeActiveAnimatorID, aimingModeActiveAnimatorState);
}
updateAnimatorSpeed ();
animator.SetFloat (playerStatusIDAnimatorID, playerStatusID, playerStatusIDLerpSpeed, currentFixedUpdateDeltaTime);
animator.SetFloat (idleIDAnimatorID, currentIdleID, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
animator.SetFloat (strafeIDAnimatorID, currentStrafeID, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
animator.SetFloat (crouchIDAnimatorID, currentCrouchID, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
animator.SetFloat (airIDAnimatorID, currentAirID, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
animator.SetFloat (airSpeedAnimatorID, currentAirSpeed, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
animator.SetFloat (shieldActiveAnimatorID, currentShieldActive, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
if (playerUsingInput) {
animator.SetFloat (inputAmountID, 1, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
} else {
animator.SetFloat (inputAmountID, 0, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime);
}
if (updateUseStrafeLandingEnabled || fullBodyAwarenessActive) {
if (strafeModeActive) {
if (playerOnGround || !ignoreStrafeStateOnAirEnabled || fullBodyAwarenessActive) {
currentUseStrafeLanding = 1;
} else {
currentUseStrafeLanding = 0;
}
} else {
currentUseStrafeLanding = 0;
}
if (lastCurrentUseStrafeLandingValue != currentUseStrafeLanding) {
lastCurrentUseStrafeLandingValue = currentUseStrafeLanding;
animator.SetFloat (useStrafeLandingID, currentUseStrafeLanding);
}
}
}
if (customCharacterControllerActive) {
currentCustomCharacterControllerBase.updateCharacterControllerAnimator ();
}
}
void updateAnimatorSpeed ()
{
if (!animatorSpeedUpdatePaused) {
//if the player is on ground and moving set the speed of his animator to the properly value
if (playerOnGround && currentMoveInput.magnitude > 0) {
currentAnimatorSpeed = animSpeedMultiplier;
} else {
currentAnimatorSpeed = 1;
}
}
if (overrideAnimationSpeedActive) {
currentAnimatorSpeed = animSpeedMultiplier;
}
if (regularMovementOnBulletTime) {
currentAnimatorSpeed *= GKC_Utils.getCurrentDeltaTime ();
}
if (currentAnimatorSpeed != previousAnimatorSpeed) {
previousAnimatorSpeed = currentAnimatorSpeed;
animator.speed = currentAnimatorSpeed;
}
}
public void setPlayerStatusIDValue (int newValue)
{
playerStatusID = newValue;
}
public void resetPlayerStatusID ()
{
setPlayerStatusIDValue (0);
}
public int getPlayerStatusID ()
{
return playerStatusID;
}
public void setCurrentIdleIDValue (int newValue)
{
currentIdleID = newValue;
}
public void setCurrentIdleIDValueFloat (float newValue)
{
currentIdleID = newValue;
}
public float getCurrentIdleID ()
{
return currentIdleID;
}
public void setCurrentStrafeIDValue (int newValue)
{
currentStrafeID = newValue;
}
public int getCurrentStrafeIDValue ()
{
return currentStrafeID;
}
public void setCurrentCrouchIDValue (int newValue)
{
currentCrouchID = newValue;
}
public int getCurrentCrouchIDValue ()
{
return currentCrouchID;
}
public void setCurrentAirIDValue (int newValue)
{
currentAirID = newValue;
}
public void setOriginalAirIDValue ()
{
setCurrentAirIDValue (regularAirboneID);
}
public void setCurrentAirSpeedValue (int newValue)
{
currentAirSpeed = newValue;
}
public void setCurrentShieldActiveValue (int newValue)
{
currentShieldActive = newValue;
}
public int getCurrentAirID ()
{
return currentAirID;
}
public void updatePlayerStatusIDOnAnimator ()
{
if (!customCharacterControllerActive) {
animator.SetFloat (playerStatusIDAnimatorID, playerStatusID);
}
}
public void updateIdleIDOnAnimator ()
{
if (!customCharacterControllerActive) {
animator.SetFloat (idleIDAnimatorID, currentIdleID);
}
}
public void updateStrafeIDOnAnimator ()
{
if (!customCharacterControllerActive) {
animator.SetFloat (strafeIDAnimatorID, currentStrafeID);
}
}
public void updateAirIDOnAnimator ()
{
if (!customCharacterControllerActive) {
animator.SetFloat (airIDAnimatorID, currentAirID);
}
}
public void updateAirIDAnimatorID ()
{
if (!customCharacterControllerActive) {
animator.SetFloat (airIDAnimatorID, currentAirID);
}
}
public void setCurrentWeaponID (int newValue)
{
currentWeaponID = newValue;
}
public void updateWeaponID ()
{
stopUpdateWeaponIDSmoothlyCoroutine ();
if (!customCharacterControllerActive) {
animator.SetFloat (weaponIDAnimatorID, currentWeaponID);
}
}
Coroutine weaponIDSmoothlyCoroutine;
public void updateWeaponIDSmoothly ()
{
stopUpdateWeaponIDSmoothlyCoroutine ();
weaponIDSmoothlyCoroutine = StartCoroutine (updateWeaponIDSmoothlyCoroutine ());
}
void stopUpdateWeaponIDSmoothlyCoroutine ()
{
if (weaponIDSmoothlyCoroutine != null) {
StopCoroutine (weaponIDSmoothlyCoroutine);
}
}
IEnumerator updateWeaponIDSmoothlyCoroutine ()
{
bool targetReached = false;
float timer = 0;
while (!targetReached) {
animator.SetFloat (weaponIDAnimatorID, currentWeaponID, updateSetFloatAnimatorSpeed, currentFixedUpdateDeltaTime * 2);
float temporalweaponIDAnimatorID = animator.GetFloat (weaponIDAnimatorID);
if (Mathf.Abs (temporalweaponIDAnimatorID - currentWeaponID) < 0.001f) {
targetReached = true;
}
timer += Time.deltaTime;
if (timer >= 10) {
targetReached = true;
}
yield return null;
}
updateWeaponID ();
}
public void setUsingNewWeaponID (bool state)
{
usingNewWeaponID = state;
}
public void setAnimatorTrigger (int triggerID)
{
animator.SetTrigger (triggerID);
}
public void setAnimatorTrigger (string triggerName)
{
int triggerID = Animator.StringToHash (triggerName);
setAnimatorTrigger (triggerID);
}
public void resetAnimatorTrigger (int triggerID)
{
animator.ResetTrigger (triggerID);
}
public void resetAnimatorTrigger (string triggerName)
{
int triggerID = Animator.StringToHash (triggerName);
resetAnimatorTrigger (triggerID);
}
public void setPlayerOnGroundAnimatorStateOnOverrideOnGround (bool state)
{
playerOnGroundAnimatorStateOnOverrideOnGround = state;
}
public void setPlayerOnGroundAnimatorStateOnOverrideOnGroundWithTime (bool state)
{
playerOnGroundAnimatorStateOnOverrideOnGroundWithTime = state;
}
public void setPreviousValueOnGroundAnimatorStateValue (bool state)
{
previousValueOnGroundAnimatorState = state;
}
public void overrideOnGroundAnimatorValue (float newOverrideOnGroundDuration)
{
overrideOnGroundDuration = newOverrideOnGroundDuration;
overrideOnGroundAnimatorValueActive = true;
lastTimeOverrideOnGroundAnimator = Time.time;
}
public void disableOverrideOnGroundAnimatorValue ()
{
overrideOnGroundAnimatorValueActive = false;
}
bool useCustomMoveSpeedMultiplier;
float customMoveSpeedMultiplier;
bool ignoreRootMotionDuringAction;
public void setIgnoreRootMotionDuringActionState (bool state)
{
ignoreRootMotionDuringAction = state;
}
//update the velocity of the player rigidbody
public void OnAnimatorMove ()
{
if (!gravityPowerActive && usingAnimator && !useFirstPersonPhysicsInThirdPersonActive) {
if (!fullBodyAwarenessActive || useRootMotionOnFullBodyAwareness) {
mainRigidbody.rotation = animator.rootRotation;
}
if ((playerOnGround || (actionActive && !actionCanHappenOnAir)) && Time.deltaTime > 0) {
characterVelocity = vector3Zero;
bool checkRootMotionDeltaPositionResult = false;
if (useRootMotionActive || actionActive || forceUseRootMotionActive) {
checkRootMotionDeltaPositionResult = true;
}
if (actionActive && ignoreRootMotionDuringAction) {
checkRootMotionDeltaPositionResult = false;
}
if (checkRootMotionDeltaPositionResult) {
float currentMoveSpeedMultiplier = 0;
if (useCustomMoveSpeedMultiplier && (!actionActive || ignoreFBACustomMoveSpeedMultiplierOnActionActive)) {
currentMoveSpeedMultiplier = customMoveSpeedMultiplier;
} else {
currentMoveSpeedMultiplier = moveSpeedMultiplier;
}
characterVelocity = (currentMoveSpeedMultiplier * animator.deltaPosition) / Time.deltaTime;
} else {
currentNoRootMovementSpeed = 1;
if (running && !crouching) {
if (strafeModeActive) {
currentNoRootMovementSpeed = noRootRunStrafeMovementSpeed;
} else {
currentNoRootMovementSpeed = noRootSprintMovementSpeed;
}
} else {
if (crouching) {
if (running) {
currentNoRootMovementSpeed = noRootCrouchRunMovementSpeed;
} else {
currentNoRootMovementSpeed = noRootCrouchMovementSpeed;
}
} else {
if (strafeModeActive) {
currentNoRootMovementSpeed = noRootWalkStrafeMovementSpeed;
} else {
if (walkSpeed >= half) {
if (forwardAmount < half) {
currentNoRootMovementSpeed = noRootWalkMovementSpeed / walkSpeed;
} else {
currentNoRootMovementSpeed = noRootRunMovementSpeed * walkSpeed;
}
} else {
currentNoRootMovementSpeed = noRootWalkMovementSpeed;
}
}
}
}
if (!strafeModeActive) {
currentNoRootMovementSpeed -= currentMovementSpeed * (Mathf.Abs (turnAmount));
}
if (Time.time < lastTimeGround + noRootDelayToMoveOnLand) {
currentNoRootMovementSpeed = 0;
}
lerpNoRootMovementSpeed = Mathf.Lerp (lerpNoRootMovementSpeed, currentNoRootMovementSpeed, Time.deltaTime * noRootRunMovementSpeed);
if (lockedCameraActive && useRelativeMovementToLockedCamera && !usedByAI) {
characterVelocity = lerpNoRootMovementSpeed * lockedCameraMoveInput;
characterVelocity = Vector3.ClampMagnitude (characterVelocity, currentNoRootMovementSpeed);
} else {
characterVelocity = lerpNoRootMovementSpeed * currentMoveInput;
}
}
mainRigidbody.linearVelocity = characterVelocity;
if (addExtraCharacterVelocityActive) {
mainRigidbody.linearVelocity += currentExtraCharacterVelocity;
}
if (actionActive) {
if (!allowDownVelocityDuringAction) {
if (mainRigidbody.linearVelocity.y < 0) {
mainRigidbody.linearVelocity = new Vector3 (mainRigidbody.linearVelocity.x, 0, mainRigidbody.linearVelocity.z);
}
}
}
currentVelocityChangeMagnitude = mainRigidbody.linearVelocity.magnitude;
}
}
if (playerActionSystemLocated && mainPlayerActionSystem.actionActive) {
mainPlayerActionSystem.OnAnimatorMove ();
}
}
void LateUpdate ()
{
if (movingInsideVehicle) {
// mainRigidbody.velocity += externalForceInsideVehicle;
mainRigidbody.transform.Translate (externalForceInsideVehicle, Space.World);
}
if (fullBodyAwarenessActive) {
//look in camera direction when the player is aiming
lookCameraDirection ();
}
}
public void activateCustomAction (string actionName)
{
if (playerActionSystemLocated) {
mainPlayerActionSystem.activateCustomAction (actionName);
}
}
public void stopCustomAction (string actionName)
{
if (playerActionSystemLocated) {
mainPlayerActionSystem.stopCustomAction (actionName);
}
}
public void stopAllActionsOnActionSystem ()
{
if (playerActionSystemLocated) {
mainPlayerActionSystem.stopAllActions ();
}
}
public string getCurrentActionName ()
{
if (playerActionSystemLocated) {
return mainPlayerActionSystem.getCurrentActionName ();
}
return "";
}
public void playCurrentAnimationOnPlayerActionSystem ()
{
if (playerActionSystemLocated) {
mainPlayerActionSystem.inputPlayCurrentAnimation ();
}
}
public void setExtraCharacterVelocity (Vector3 extraValue)
{
if (!canRagdollMove) {
extraValue = vector3Zero;
}
currentExtraCharacterVelocity = extraValue;
addExtraCharacterVelocityActive = (extraValue != vector3Zero);
}
public void setActionCanHappenOnAirState (bool state)
{
actionCanHappenOnAir = state;
}
public void setActionActiveState (bool state)
{
actionActive = state;
//If an action is over but some menu is opened when an action is over, make sure to disable the
//player movement once the action is over in case the menu is still opened
if (!actionActive) {
if (enableChangeScriptStateAfterFinishActionState) {
if (!playerIsBusy ()) {
changeScriptState (true);
}
enableChangeScriptStateAfterFinishActionState = false;
}
if (disableChangeScriptStateAfterFinishActionState) {
changeScriptState (false);
disableChangeScriptStateAfterFinishActionState = false;
}
lastTimeActionActive = Time.time;
}
}
public float getLastTimeActionActive ()
{
return lastTimeActionActive;
}
public bool isActionActive ()
{
return actionActive;
}
public void setNewActionIDExternally (int newID)
{
if (playerActionSystemLocated) {
mainPlayerActionSystem.setNewActionIDExternally (newID);
}
}
public void setActionActiveExternally (bool state)
{
if (playerActionSystemLocated) {
mainPlayerActionSystem.setActionActiveExternally (state);
}
}
public string getCurrentActionCategoryActive ()
{
if (playerActionSystemLocated) {
return mainPlayerActionSystem.getCurrentActionCategoryActive ();
}
return "";
}
public void setCurrentCustomActionCategoryID (int newID)
{
if (playerActionSystemLocated) {
mainPlayerActionSystem.setCurrentCustomActionCategoryID (newID);
}
}
public void setEnableChangeScriptStateAfterFinishActionState (bool state)
{
enableChangeScriptStateAfterFinishActionState = state;
}
public void setDisableChangeScriptStateAfterFinishActionState (bool state)
{
disableChangeScriptStateAfterFinishActionState = state;
}
public void setActionActiveWithMovementState (bool state)
{
actionActiveWithMovement = state;
}
public void setIgnoreCameraDirectionOnMovementState (bool state)
{
if (state) {
lastForwardDirection = playerCameraTransform.forward;
lastRigthDirection = mainCameraTransform.right;
}
ignoreCameraDirectionOnMovement = state;
}
public void setIgnoreCameraDirectionOnStrafeMovementState (bool state)
{
ignoreCameraDirectionOnStrafeMovement = state;
}
public void setUseRootMotionActiveState (bool state)
{
useRootMotionActive = state;
}
public void setForceUseRootMotionActiveState (bool state)
{
forceUseRootMotionActive = state;
}
public void setOriginalUseRootMotionActiveState ()
{
setUseRootMotionActiveState (originalSetUseRootMotionActiveState);
}
public void setNoRootMotionValues (float noRootWalkMovementSpeedValue, float noRootRunMovementSpeedValue,
float noRootSprintMovementSpeedValue, float noRootCrouchMovementSpeedValue,
float noRootCrouchRunMovementSpeedValue,
float noRootWalkStrafeMovementSpeedValue, float noRootRunStrafeMovementSpeedValue)
{
noRootWalkMovementSpeed = noRootWalkMovementSpeedValue;
noRootRunMovementSpeed = noRootRunMovementSpeedValue;
noRootSprintMovementSpeed = noRootSprintMovementSpeedValue;
noRootCrouchMovementSpeed = noRootCrouchMovementSpeedValue;
noRootCrouchRunMovementSpeed = noRootCrouchRunMovementSpeedValue;
noRootWalkStrafeMovementSpeed = noRootWalkStrafeMovementSpeedValue;
noRootRunStrafeMovementSpeed = noRootRunStrafeMovementSpeedValue;
}
public void setOriginalNoRootMotionValues ()
{
setNoRootMotionValues (originalNoRootWalkMovementSpeed, originalNoRootRunMovementSpeed,
originalNoRootSprintMovementSpeed, originalNoRootCrouchMovementSpeed, originalNoRootCrouchRunMovementSpeed,
originalNoRootWalkStrafeMovementSpeed, originalNoRootRunStrafeMovementSpeed);
}
public void setDeactivateRootMotionOnStrafeActiveOnLockedViewState (bool state)
{
deactivateRootMotionOnStrafeActiveOnLockedView = state;
previousStrafeModeActive = false;
if (deactivateRootMotionOnStrafeActiveOnLockedView) {
if (strafeModeActive) {
setUseRootMotionActiveState (false);
}
} else {
setOriginalUseRootMotionActiveState ();
}
}
public void setRotateDirectlyTowardCameraOnStrafeState (bool state)
{
rotateDirectlyTowardCameraOnStrafe = state;
}
public void setAllowDownVelocityDuringActionState (bool state)
{
allowDownVelocityDuringAction = state;
}
public void setPlayerControllerMovementValues (float moveSpeedMultiplierValue, float animSpeedMultiplierValue, float jumpPowerValue, float airSpeedValue, float airControlValue)
{
setMoveSpeedMultiplierValue (moveSpeedMultiplierValue);
setAnimSpeedMultiplierValue (animSpeedMultiplierValue);
setJumpPower (jumpPowerValue);
airSpeed = airSpeedValue;
airControl = airControlValue;
noAnimatorAirSpeed = airSpeedValue;
}
public void resetPlayerControllerMovementValues ()
{
setMoveSpeedMultiplierValue (originalMoveSpeedMultiplier);
setAnimSpeedMultiplierValue (originalAnimationSpeed);
setOriginalJumpPower ();
airSpeed = originalAirSpeed;
airControl = originalAirControl;
noAnimatorAirSpeed = originalNoAnimatorAirSpeed;
}
public void setAirSpeedValue (float newAirSpeedValue)
{
airSpeed = newAirSpeedValue;
}
public void setAirControlValue (float newAirControlValue)
{
airControl = newAirControlValue;
}
public void setOriginalAirSpeed ()
{
setAirSpeedValue (originalAirSpeed);
}
public void setOriginalAirControl ()
{
setAirControlValue (originalAirControl);
}
public void setIgnoreInputOnAirControlActiveState (bool state)
{
ignoreInputOnAirControlActive = state;
}
public void setAnimatorSpeedUpdatePausedState (bool state)
{
animatorSpeedUpdatePaused = state;
}
public void setOverrideAnimationSpeedActiveState (bool state)
{
overrideAnimationSpeedActive = state;
}
public void updateCurrentAnimatorSpeed (float newSpeed)
{
currentAnimatorSpeed = newSpeed;
}
public void setNoAnimatorMovementSpeedMultiplierValue (float newValue)
{
noAnimatorMovementSpeedMultiplier = newValue;
}
public void setOriginalNoAnimatorMovementSpeedMultiplierValue ()
{
setNoAnimatorMovementSpeedMultiplierValue (originalNoAnimatorMovementSpeedMultiplier);
}
public Transform getCurrentSurfaceBelowPlayer ()
{
return currentSurfaceBelowPlayer;
}
public bool checkIfPlayerOnGroundWithRaycast ()
{
if (playerTransform == null) {
return false;
}
if (Physics.Raycast (playerTransform.position + playerTransform.up, -playerTransform.up, 1.3f, layer)) {
return true;
}
return false;
}
public void setCheckOnGroungPausedState (bool state)
{
checkOnGroundPaused = state;
}
float downSpeedValue = 0;
public bool isPlayerOnGround ()
{
return playerOnGround;
}
public void setPlayerOnGroundState (bool state)
{
playerOnGround = state;
}
public void setOnGroundState (bool state)
{
playerOnGround = state;
if (checkOnGroundStatePaused || checkOnGroundStatePausedFFOrZG) {
playerOnGround = false;
}
}
public bool isStrafeModeActive ()
{
return strafeModeActive;
}
public void updateStrafeModeActiveState ()
{
strafeModeActive = ((playerIsAiming && lookInCameraDirectionOnFreeFireActive) || lookInCameraDirectionActive) &&
(playerOnGround || !ignoreStrafeStateOnAirEnabled || fullBodyAwarenessActive);
}
public void updateWallRunningState ()
{
if (wallRunningEnabled) {
wallRunningExternalControllerBehavior.updateControllerBehavior ();
}
}
public void checkIfActivateWallRunningState ()
{
if (wallRunningEnabled) {
wallRunningExternalControllerBehavior.checkIfActivateExternalForce ();
}
}
public bool isWallRunningActive ()
{
return wallRunningActive;
}
public void setWallRunningActiveValue (bool state)
{
wallRunningActive = state;
}
public bool isExternalControlBehaviorForAirTypeActive ()
{
return externalControlBehaviorForAirTypeActive;
}
public void setWallRunningActiveState (bool state)
{
if (wallRunningEnabled) {
wallRunningExternalControllerBehavior.setExternalForceActiveState (state);
}
}
public void setWallRunningImpulseForce (Vector3 forceAmount, bool useCameraDirection)
{
if (wallRunningEnabled) {
wallRunningExternalControllerBehavior.setExtraImpulseForce (forceAmount, useCameraDirection);
}
}
public void setWallRunningEnabledState (bool state)
{
if (wallRunningEnabled) {
wallRunningExternalControllerBehavior.setExternalForceEnabledState (state);
}
}
public void setPauseAllPlayerDownForces (bool state)
{
pauseAllPlayerDownForces = state;
}
public void setLadderFoundState (bool state)
{
ladderFound = state;
if (ladderFound) {
if (wallRunningActive) {
setWallRunningActiveState (false);
}
} else {
jumpInput = false;
lastJumpActivatedExternally = false;
}
}
public bool isLadderFound ()
{
return ladderFound;
}
public bool isPauseAllPlayerDownForcesActive ()
{
return pauseAllPlayerDownForces;
}
public void setUseObstacleDetectionToAvoidMovementState (bool state)
{
useObstacleDetectionToAvoidMovement = state;
}
public void setCheckQuickMovementTurn180DegreesOnRunState (bool state)
{
checkQuickMovementTurn180DegreesOnRun = state;
}
public void setAirDashEnabledState (bool state)
{
airDashEnabled = state;
}
public void doAirDash ()
{
if (characterRotatingToSurface) {
return;
}
if (ignoreExternalActionsActiveState) {
return;
}
if (useDashLimit) {
if (currentNumberOfDash >= dashLimit) {
return;
}
}
if (airDashEnabled) {
bool canActivateAirDashResult = false;
if (Time.time > lastTimeDash + airDashColdDown && Time.time > lastTimeFalling + minTimeOnAirToUseAirDash) {
canActivateAirDashResult = true;
}
if (!canActivateAirDashResult) {
return;
}
Vector3 dashDirection = currentMoveInput;
if (dashDirection == vector3Zero || dashDirection.magnitude < 0.1f) {
if (firstPersonActive) {
dashDirection = playerCameraTransform.forward;
} else {
dashDirection = playerTransformForward;
}
}
if (resetGravityForceOnDash) {
mainRigidbody.linearVelocity = vector3Zero;
}
mainRigidbody.AddForce (mainRigidbody.mass * airDashForce * dashDirection, ForceMode.Impulse);
lastTimeDash = Time.time;
if (pauseGravityForce) {
setGravityForcePuase (true);
lastTimeGravityForcePaused = Time.time;
unPauseGravityForceActive = true;
}
if (useDashLimit) {
currentNumberOfDash++;
}
if (changeCameraFovOnDash) {
playerCameraManager.setMainCameraFovStartAndEnd (cameraFovOnDash, playerCameraManager.getOriginalCameraFov (), cameraFovOnDashSpeed);
}
if (useEventsOnAirDash) {
if (firstPersonActive) {
eventOnAirDashFirstPerson.Invoke ();
} else {
eventOnAirDashThirdPerson.Invoke ();
}
}
}
}
public void addExternalForce (Vector3 forceDireciton)
{
mainRigidbody.AddForce (mainRigidbody.mass * forceDireciton, ForceMode.Impulse);
}
public void setGravityForcePuase (bool state)
{
gravityForcePaused = state;
unPauseGravityForceActive = false;
}
public bool isGravityForcePaused ()
{
return gravityForcePaused;
}
public void setRigidbodyVelocityToZero ()
{
mainRigidbody.linearVelocity = vector3Zero;
}
public float getCurrentDeltaTime ()
{
currentDeltaTime = Time.deltaTime;
if (regularMovementOnBulletTime) {
currentDeltaTime *= GKC_Utils.getCurrentDeltaTime ();
}
return currentDeltaTime;
}
public float getCurrentScaleTime ()
{
return GKC_Utils.getCurrentDeltaTime ();
}
//set the scale of the capsule if the player is crouched
void scaleCapsule (bool state)
{
if (state) {
capsule.height = capsuleHeightOnCrouch;
if (setCustomCapsuleCenter) {
capsule.center = customCapsuleCenterOnCrouch;
} else {
capsule.center = (capsuleHeightOnCrouch * half) * Vector3Up;
}
} else {
capsule.height = originalHeight;
if (setCustomCapsuleCenter) {
capsule.center = customCapsuleCenter;
} else {
capsule.center = (originalHeight * half) * Vector3Up;
}
}
currentHeight = capsule.height;
}
public void setPlayerColliderCapsuleScale (float capsuleHeight)
{
capsule.height = capsuleHeight;
capsule.center = (capsuleHeight * half) * Vector3Up;
currentHeight = capsule.height;
}
public void setPlayerColliderCapsuleCenter (Vector3 newValue)
{
capsule.center = newValue;
}
public void setPlayerCapsuleColliderDirection (int newDirection)
{
capsule.direction = newDirection;
}
public void setPlayerCapsuleColliderRadius (float newValue)
{
capsule.radius = newValue;
}
public void setOriginalPlayerCapsuleColliderRadius ()
{
setPlayerCapsuleColliderRadius (originalRadius);
}
public void setOriginalPlayerColliderCapsuleScale ()
{
scaleCapsule (false);
}
public void setOriginalPlayerColliderCapsuleScaleIfCrouchNotActive ()
{
if (!crouching) {
scaleCapsule (false);
} else {
healthManager.changePlaceToShootPosition (true);
}
}
public CapsuleCollider getMainCapsuleCollider ()
{
return capsule;
}
public Bounds getMainCapsuleColliderBounds ()
{
return capsule.bounds;
}
public void setCharacterRadius (float newValue)
{
characterRadius = newValue;
}
public float getCharacterRadius ()
{
return characterRadius;
}
public void setPlaceToShootPositionOffset (float newValue)
{
if (newValue > 0) {
healthManager.setPlaceToShootPositionOffset (newValue);
} else {
healthManager.changePlaceToShootPosition (false);
}
}
public void setPlaceToShootLocalPosition (Vector3 newValue)
{
healthManager.setPlaceToShootLocalPosition (newValue);
}
public void setCheckFallStatePausedState (bool state)
{
checkFallStatePaused = state;
}
public Collider getMainCollider ()
{
return mainCollider;
}
public void setMainColliderState (bool state)
{
if (!canRagdollMove && state) {
return;
}
mainCollider.enabled = state;
}
public void setMainColliderTriggerState (bool state)
{
mainCollider.isTrigger = state;
}
public bool isMainColliderEnabled ()
{
return mainCollider.enabled;
}
public void reactivateColliderIfPossible ()
{
if (mainCollider.enabled) {
setMainColliderState (false);
setMainColliderState (true);
}
}
public void addOrRemoveExtraColliders (Collider newCollider, bool state)
{
if (newCollider == null) {
return;
}
if (state) {
if (!extraColliderList.Contains (newCollider)) {
extraColliderList.Add (newCollider);
useExtraColliderList = true;
}
} else {
if (extraColliderList.Contains (newCollider)) {
extraColliderList.Remove (newCollider);
if (extraColliderList.Count == 0) {
useExtraColliderList = false;
}
}
}
}
public void setIgnoreCollisionOnExternalCollider (Collider newCollider, bool state)
{
if (newCollider == null) {
return;
}
Physics.IgnoreCollision (newCollider, mainCollider, state);
if (useExtraColliderList) {
int extraColliderListCount = extraColliderList.Count;
for (int i = 0; i < extraColliderListCount; i++) {
if (extraColliderList [i] != null) {
Physics.IgnoreCollision (newCollider, extraColliderList [i], state);
}
}
}
}
public void setIgnoreCollisionOnExternalColliderOnlyWithExtraColliderList (Collider newCollider, bool state)
{
if (useExtraColliderList) {
if (newCollider == null) {
return;
}
int extraColliderListCount = extraColliderList.Count;
for (int i = 0; i < extraColliderListCount; i++) {
if (extraColliderList [i] != null) {
Physics.IgnoreCollision (newCollider, extraColliderList [i], state);
}
}
}
}
public bool isUseExtraColliderListActive ()
{
return useExtraColliderList;
}
public List<Collider> getExtraColliderList ()
{
if (useExtraColliderList) {
return extraColliderList;
}
return null;
}
public int getCharacterLayer ()
{
return gameObject.layer;
}
public void setGravityMultiplierValue (bool setOriginal, float newValue)
{
if (setOriginal) {
currentGravityMultiplier = originalGravityMultiplier;
gravityMultiplier = originalGravityMultiplier;
} else {
currentGravityMultiplier = newValue;
gravityMultiplier = newValue;
}
}
public void setGravityMultiplierValueFromExternalFunction (float newValue)
{
gravityMultiplier = newValue;
}
public float getGravityMultiplier ()
{
return gravityMultiplier;
}
public void setGravityForceValue (bool setOriginal, float newValue)
{
if (setOriginal) {
gravityForce = originalGravityForce;
} else {
gravityForce = newValue;
}
}
public void setOriginalGravityForceValue ()
{
setGravityForceValue (true, 0);
}
public float getGravityForce ()
{
return gravityForce;
}
public void setSlowFallExternallyActiveState (bool state)
{
slowFallExternallyActive = state;
}
public bool isSlowFallExternallyActive ()
{
return slowFallExternallyActive;
}
//CALL INPUT FUNCTIONS
public bool canUseInput ()
{
if (jetPackEquiped) {
return false;
}
if (flyModeActive) {
return false;
}
if (!canMove) {
return false;
}
if (usedByAI) {
return false;
}
if (playerNavMeshEnabled) {
return false;
}
if (driving) {
return false;
}
if (swimModeActive) {
return false;
}
if (closeCombatAttackInProcess) {
return false;
}
return true;
}
public void inputCrouch ()
{
if (!playerActionsInputEnabled) {
return;
}
if (crouchInputPaused) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (isUsingSubMenu () || isPlayerMenuActive ()) {
return;
}
if (usingGenericModelActive) {
return;
}
if (!playerCameraManager.isFirstPersonActive ()) {
if (playerUsingWeapons) {
if (weaponsManager.checkIfWeaponStateIsBusy () && !crouching) {
return;
}
}
}
//check if the crouch button has been pressed
crouch ();
}
public void inputJump ()
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (!canJumpActive) {
return;
}
if (jumpInputPaused) {
return;
}
if (checkObstacleAbovePlayerOnJumpEnabled) {
RaycastHit newRaycastHit = new RaycastHit ();
bool canJumpResult = true;
if (Physics.Raycast (playerTransform.position + playerTransform.up, playerTransform.up, out newRaycastHit,
checkObstacleAbovePlayerOnJumpRaycastDistance, checkObstacleAbovePlayerOnJumpLayermask)) {
if (!isColliderPartOfCharacter (newRaycastHit.collider)) {
canJumpResult = true;
} else {
if (newRaycastHit.rigidbody == null) {
canJumpResult = true;
}
}
}
if (!canJumpResult) {
if (showDebugPrint) {
print ("obstacle detected above the player, cancelling jump");
}
return;
}
}
activateJump ();
}
public bool isColliderPartOfCharacter (Collider newCollider)
{
if (newCollider == null) {
return false;
}
if (newCollider == mainCollider) {
return true;
}
if (useExtraColliderList) {
if (extraColliderList.Contains (newCollider)) {
return true;
}
}
return false;
}
public void inputReleaseJumpButton ()
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (!canJumpActive) {
return;
}
releaseJumpButton ();
}
public void setJumpsAmountValue (int newValue)
{
jumpsAmount = newValue;
}
public void activateJump ()
{
setJumpActive (false);
}
public void setJumpActive (bool activateJumpOnAir)
{
if (wallRunningActive) {
if (wallRunningEnabled) {
wallRunningExternalControllerBehavior.setJumpActiveForExternalForce ();
}
return;
}
if (externalControllBehaviorActive) {
if (currentExternalControllerBehavior.externalControllerJumpEnabled &&
currentExternalControllerBehavior.isBehaviorCurrentlyActive ()) {
currentExternalControllerBehavior.setJumpActiveForExternalForce ();
return;
}
}
if (enabledRegularJump) {
jumpInput = true;
jumpActivatedByInput = true;
if (ladderFound || activateJumpOnAir) {
jumpInput = false;
}
if (!playerOnGround && !gravityPowerActive) {
if ((ladderFound || enabledDoubleJump) && !zeroGravityModeOn && !freeFloatingModeOn) {
//then check the last time the jump button has been pressed, so the player can jump again
//jump again
if (Time.time > lastJumpTime + readyToDoubleJumpTime && (jumpsAmount < maxNumberJumpsInAir || ladderFound)) {
doubleJump = true;
}
}
}
if (activateJumpOnAir) {
doubleJump = true;
}
if (waitingToActivateJumpInputWithDelay) {
doubleJump = false;
if (showDebugPrint) {
print ("cancel jump on air");
}
}
if (addJumpForceWhileButtonPressed) {
bool canActivateJumpForceOnButtonPressed = false;
if (playerOnGround) {
canActivateJumpForceOnButtonPressed = true;
} else {
if (useJumpForceOnAirJumpEnabled) {
canActivateJumpForceOnButtonPressed = true;
}
}
if (canActivateJumpForceOnButtonPressed) {
lastTimeJumpButtonHoldActive = Time.time;
jumpButtonHoldActive = true;
}
}
if (jumpInput || doubleJump) {
lastTimeJumpActivated = Time.time;
}
}
}
public void releaseJumpButton ()
{
if (addJumpForceWhileButtonPressed) {
jumpButtonHoldActive = false;
}
}
public void relaseJumpButtonIfAddForceWhileButtonPressedActive ()
{
if (addJumpForceWhileButtonPressed && !playerOnGround && jumpButtonHoldActive) {
releaseJumpButton ();
}
}
public void inputStartSlowDownFall ()
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (holdJumpSlowDownFallEnabled) {
if (Time.time > waitTimeToSlowDown) {
gravityMultiplier = slowDownGravityMultiplier;
if (!slowingFall) {
slowingFallInput = true;
}
}
}
}
public void inputStopSlowDownFall ()
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (holdJumpSlowDownFallEnabled) {
gravityMultiplier = currentGravityMultiplier;
}
}
public void inputAirDash ()
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (airDashEnabled && !gravityPowerActive && !playerOnGround && !gravityManager.isSearchingSurface () && !usingAbilityActive && canMove) {
doAirDash ();
}
}
public void inputSetMoveVerticallyState (bool state)
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (zeroGravityModeOn || freeFloatingModeOn) {
if (canMoveVertically && isPlayerMovingOn3dWorld ()) {
movingVertically = state;
}
}
}
public void inputSetChangeZeroGravityMovementSpeeState (bool state)
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (zeroGravityModeOn) {
changeZeroGravityMovementVelocity (state);
}
}
public void inputSetChangeFreeFloatingMovementSpeeState (bool state)
{
if (!playerActionsInputEnabled) {
return;
}
if (!inputCanBeUsed || !enabled) {
return;
}
if (freeFloatingModeOn) {
changeFreeFloatingMovementVelocity (state);
}
}
public void inputSetIncreaseMovementSpeedState (bool state)
{
if (!playerActionsInputEnabled) {
return;
}
if (jetPackEquiped || flyModeActive || swimModeActive || !canMove || usedByAI || playerNavMeshEnabled || driving) {
return;
}
if (!enabled) {
return;
}
if (runInputPaused) {
return;
}
if (increaseWalkSpeedEnabled) {
if (holdButtonToKeepIncreasedWalkSpeed) {
setIncreaseMovementSpeedState (state);
} else {
if (state) {
increaseWalkSpeedActive = !increaseWalkSpeedActive;
setIncreaseMovementSpeedState (increaseWalkSpeedActive);
}
}
}
}
public void inputStartToRun ()
{
if (runInputPaused) {
return;
}
//check if the player is moving and he is not using the gravity power
//in that case according to the duration of the press key, the player will only run or run and change his gravity
//also in the new version of the asset also check if the touch control is being used
if (!playerIsBusy () && canMove && isSprintEnabled ()) {
checkIfCanRun ();
}
}
public void inputStopToRun ()
{
//if the run button is released, stop the run power, if the power was holding the run button to adhere to other surfaces, else the
//run button has to be pressed again to stop the run power
if (!playerIsBusy () && canMove) {
checkIfStopRun ();
}
}
public void inputToggleWalkAndRun ()
{
if (runInputPaused) {
return;
}
if (!playerIsBusy () && canMove) {
toggleWalkRunState = !toggleWalkRunState;
if (toggleWalkRunState) {
previousWalkSpeedValue = originalWalkSpeedValue;
increaseWalkSpeedValue = 1;
originalWalkSpeedValue = half;
setWalkBydefaultFromEditor ();
} else {
originalWalkSpeedValue = previousWalkSpeedValue;
setWalkSpeedValue (originalWalkSpeedValue);
setSprintEnabledState (originalSprintEnabledValue);
increaseWalkSpeedValue = 1;
}
}
}
//END OF INPUT CALL FUNCTIONS
public void checkIfCanRun ()
{
bool canActivateRunResult = false;
if (getMoveInputDirection ().magnitude > 0 &&
!isGravityPowerActive () &&
(isPlayerOnGround () || wallRunningActive || externalControlBehaviorForAirTypeActive) &&
!gravityManager.isSearchingSurface ()) {
canActivateRunResult = true;
}
if (running) {
canActivateRunResult = true;
}
if (canActivateRunResult) {
//avoid to run backwards
if (playerCanRunNow ()) {
//check if he can run while crouching
if (!isCrouching () || (runOnCrouchEnabled && isCrouching ())) {
//check the amount of time that the button is being pressed
runButtonPressedTimer += Time.deltaTime;
if (!running) {
activateRun ();
lastTimeRun = runButtonPressedTimer;
}
}
}
}
}
public void activateRun ()
{
lastTimeMovingOnRun = Time.time;
setRunnningState (true);
if (weaponsManagerLocated) {
weaponsManager.setRunningState (true);
}
}
public void checkIfStopRun ()
{
if (running && (runButtonPressedTimer > half || runButtonPressedTimer - lastTimeRun > 0.12f)) {
forceStopRun ();
}
}
public void forceStopRun ()
{
stopRun ();
runButtonPressedTimer = 0;
lastTimeRun = 0;
}
public void stopRun ()
{
setRunnningState (false);
if (weaponsManagerLocated) {
weaponsManager.setRunningState (false);
}
}
public float getRunButtonPressedTimer ()
{
return runButtonPressedTimer;
}
public bool playerIsBusy ()
{
if (isUsingDevice ()) {
return true;
}
if (isTurnBasedCombatActionActive ()) {
return false;
}
if (isUsingSubMenu ()) {
return true;
}
if (isPlayerMenuActive ()) {
return true;
}
return false;
}
public void setSlidindOnThirdPersonActiveState (bool state)
{
slidindOnThirdPersonActive = state;
}
//check with a sphere cast if the there are any surface too close
public void crouch ()
{
if (slidindOnThirdPersonActive) {
if (useCrouchSlidingOnThirdPersonEnabled) {
slidindOnThirdPersonActive = false;
eventOnCrouchSlidingThirdPersonEnd.Invoke ();
return;
}
}
if (!gravityPowerActive && checkWeaponsStateToCrouch () && playerOnGround) {
if (crouchSlidingEnabled) {
if (!firstPersonActive) {
if (!crouching) {
if (running) {
if (useCrouchSlidingOnThirdPersonEnabled && !slidindOnThirdPersonActive) {
slidindOnThirdPersonActive = true;
eventOnCrouchSlidingThirdPersonStart.Invoke ();
return;
}
}
}
}
}
crouching = !crouching;
if (!crouching) {
//check if there is anything above the player when he is crouched, to prevent he stand up
//stop the player to get up
if (!playerCanGetUpFromCrouch ()) {
crouching = true;
}
}
if (!firstPersonActive) {
if (weaponsManagerLocated) {
if (weaponsManager.isIgnoreCrouchWhileWeaponActive () || !weaponsManager.isAimingWeapons ()) {
if (!fullBodyAwarenessActive) {
weaponsManager.enableOrDisableIKOnHands (!crouching);
}
}
}
}
//set the pivot position
setCrouchComponentsState (crouching);
if (crouchSlidingEnabled && running) {
if (firstPersonActive) {
if (crouching) {
crouchSlidingActive = true;
lastTimeCrouchSlidingActive = Time.time;
eventOnCrouchSlidingStart.Invoke ();
} else {
stopCrouchSliding ();
}
}
}
} else if (crouchSlidingOnAirEnabled) {
if (!gravityPowerActive && checkWeaponsStateToCrouch () && !playerOnGround) {
if (crouchSlidingEnabled && running) {
if (firstPersonActive) {
crouchingOnAir = !crouchingOnAir;
if (crouchingOnAir) {
setCrouchComponentsState (true);
crouchSlidingOnAirActive = true;
crouchSlidingActive = true;
lastTimeCrouchSlidingActive = Time.time;
eventOnCrouchSlidingStart.Invoke ();
} else {
stopCrouchSliding ();
}
}
}
}
}
}
bool checkWeaponsStateToCrouch ()
{
if (playerCameraManager.isFirstPersonActive ()) {
return true;
}
// if (aimingPowers) {
// return false;
// }
if (weaponsManagerLocated) {
if (weaponsManager.isAimingWeapons () && weaponsManager.isIgnoreCrouchWhileWeaponActive ()) {
return false;
}
if (!canCrouchWhenUsingWeaponsOnThirdPerson && playerUsingWeapons) {
return false;
}
}
if (crouching) {
return true;
}
return true;
}
public void checkIfActivateCrouchState ()
{
if (!playerCanGetUpFromCrouch () && !crouching) {
crouch ();
}
}
public void setCrouchState (bool state)
{
if (crouching) {
if (!state) {
crouch ();
}
} else {
if (state) {
crouch ();
}
}
}
public void setCrouchComponentsState (bool state)
{
playerCameraManager.crouch (state);
healthManager.changePlaceToShootPosition (state);
scaleCapsule (state);
setLastTimeMoved ();
}
public void stopCrouchSliding ()
{
if (crouchSlidingActive || crouchingOnAir) {
eventOnCrouchSlidingEnd.Invoke ();
crouchSlidingActive = false;
if (crouchingOnAir && playerCanGetUpFromCrouch () && !crouching) {
setCrouchComponentsState (false);
}
crouchingOnAir = false;
crouchSlidingOnAirActive = false;
}
}
public void setCrouchSlidingEnabledState (bool state)
{
crouchSlidingEnabled = state;
}
public bool playerCanGetUpFromCrouch ()
{
crouchRay = new Ray (mainRigidbody.position + (originalRadius * half) * playerTransformUp, playerTransformUp);
float crouchRayLength = originalHeight - originalRadius * half;
if (useCustomLayerToCheckIfPlayerCanGetUpFromCrouch) {
if (Physics.SphereCast (crouchRay, originalRadius * half, crouchRayLength, customLayerToCheckIfPlayerCanGetUpFromCrouch)) {
return false;
}
} else {
if (Physics.SphereCast (crouchRay, originalRadius * half, crouchRayLength, layer)) {
return false;
}
}
return true;
}
public bool isCrouching ()
{
return crouching;
}
public bool isCanCrouchWhenUsingWeaponsOnThirdPerson ()
{
return canCrouchWhenUsingWeaponsOnThirdPerson;
}
public void setChoosingGravityDirectionState (bool state)
{
choosingGravityDirection = state;
}
public void setGravityPowerActiveState (bool state)
{
gravityPowerActive = state;
}
public bool isGravityPowerActive ()
{
return gravityPowerActive;
}
public bool isChoosingGravityDirection ()
{
return choosingGravityDirection;
}
public void setUsingCloseCombatActiveState (bool state)
{
usingCloseCombatActive = state;
}
public bool isUsingCloseCombatActive ()
{
return usingCloseCombatActive;
}
public bool iscloseCombatAttackInProcess ()
{
return closeCombatAttackInProcess;
}
public void setCloseCombatAttackInProcessState (bool state)
{
closeCombatAttackInProcess = state;
}
public bool isMeleeAttackInProcess ()
{
return meleeAttackInProcess;
}
public void setMeleeAttackInProcessState (bool state)
{
meleeAttackInProcess = state;
}
public void setJumpLegExternallyActiveState (bool state)
{
jumpLegExternallyActiveState = state;
}
public void setIgnoreExternalActionsActiveState (bool state)
{
ignoreExternalActionsActiveState = state;
}
public bool isIgnoreExternalActionsActiveState ()
{
return ignoreExternalActionsActiveState;
}
public void setRunnningState (bool state)
{
running = state;
if (useEventOnSprint) {
if (running) {
eventOnStartSprint.Invoke ();
} else {
eventOnStopSprint.Invoke ();
}
}
if (useSecondarySprintValues) {
if (running) {
setPlayerControllerMovementValues (sprintVelocity, sprintVelocity, sprintJumpPower, sprintAirSpeed, sprintAirControl);
} else {
resetPlayerControllerMovementValues ();
}
}
if (sprintEnabled && sprintCanBeUsed) {
if (lockedCameraActive) {
setHeadbodStatesPaused = false;
} else {
if (firstPersonActive) {
if (updateHeadbobState) {
if (setHeadbodStatesPaused) {
setHeadbodStatesPaused = false;
resetHeadBodState ();
playerCameraManager.setShakeCameraState (false, "");
}
}
} else {
if (changeCameraFovOnSprint) {
changeSprintFovThirdPerson (running);
}
if (updateHeadbobState) {
if (shakeCameraOnSprintThirdPerson) {
setHeadbodStatesPaused = running;
playerCameraManager.setShakeCameraState (running, sprintThirdPersonCameraShakeName);
resetHeadBodState ();
}
}
}
}
}
stopCrouchSliding ();
if (updateFootStepStateActive) {
setCurrentFootStepsState ();
}
}
public bool isPlayerRunning ()
{
return running;
}
public void setSprintEnabledState (bool state)
{
sprintEnabled = state;
}
public void setSprintCanBeUsedState (bool state)
{
sprintCanBeUsed = state;
}
public void stopSprint ()
{
stopRun ();
}
public bool isSprintEnabled ()
{
return sprintEnabled && sprintCanBeUsed;
}
public void setOriginalSprintEnabledValue ()
{
if (!originalSprintEnabledValue) {
stopSprint ();
}
setSprintEnabledState (originalSprintEnabledValue);
}
public void setWalkBydefaultFromEditor ()
{
setWalkSpeedValue (half);
setSprintEnabledState (false);
}
public void setRunAndWalkToggleBydefaultFromEditor ()
{
increaseWalkSpeedValue = half;
setSprintEnabledState (false);
}
public void enableOrDisableSphereMode (bool state)
{
if (canUseSphereMode) {
sphereModeActive = state;
}
}
public bool isSphereModeActive ()
{
return sphereModeActive;
}
public void setLastTimeMoved ()
{
lastTimeMoved = Time.time;
}
public void setLastTimeFalling ()
{
lastTimeFalling = Time.time;
}
public float getLastTimeFalling ()
{
return lastTimeFalling;
}
public float getLastJumpTime ()
{
return lastJumpTime;
}
public float getLastDoubleJumpTime ()
{
return lastDoubleJumpTime;
}
public void setLastTimeFiring ()
{
lastTimeFiring = Time.time;
}
public float getLastTimeFiring ()
{
return lastTimeFiring;
}
public void setAimingPowersState (bool state)
{
aimingPowers = state;
}
public void setUsingPowersState (bool state)
{
usingPowers = state;
}
public bool checkWeaponsState ()
{
if (playerCameraManager.isFirstPersonActive ()) {
return true;
}
if (aimingPowers) {
return false;
}
if (weaponsManagerLocated) {
if (weaponsManager.isAimingWeapons ()) {
return false;
}
if (!canCrouchWhenUsingWeaponsOnThirdPerson && playerUsingWeapons) {
return false;
}
}
if (crouching) {
return true;
}
return true;
}
public void setUsingFreeFireModeState (bool state)
{
usingFreeFireMode = state;
}
public bool isUsingFreeFireMode ()
{
return usingFreeFireMode;
}
//set if the animator is enabled or not according to if the usingAnimatorInFirstMode is true or false
public void checkAnimatorIsEnabled (bool state)
{
//if the animator in first person is disabled, then
//the first person mode is enabled, so disable the animator
if (state) {
setAnimatorState (false);
} else {
//the third person mode is enabled, so enable the animator
setAnimatorState (true);
}
//if the animator is enabled,
if (animator.enabled) {
//check the state of the animator to set the values in the mecanim
usingAnimator = true;
} else {
//disable the functions that set the values in the mecanim, and apply force to the player rigidbody directly, instead of using the animation motion
usingAnimator = false;
}
if (updateFootStepStateActive) {
//change the type of footsteps, with the triggers in the feet of the player or the raycast checking the surface under the player
stepManager.changeFootStespType (usingAnimator);
}
}
public void setUseFirstPersonPhysicsInThirdPersonActiveState (bool state)
{
useFirstPersonPhysicsInThirdPersonActive = state;
}
public void setFootStepManagerState (bool state)
{
if (updateFootStepStateActive) {
if (state) {
stepManager.enableOrDisableFootStepsComponents (false);
} else {
stepManager.enableOrDisableFootStepsWithDelay (true, 0);
}
}
}
public void setCurrentFootStepsState ()
{
if (updateFootStepStateActive) {
if (!stepManager.isDelayToNewStateActive ()) {
if (running) {
if (crouching) {
if (currentFootStepState != footStepState.Run_Crouching) {
stepManager.setFootStepState ("Run Crouching");
currentFootStepState = footStepState.Run_Crouching;
}
} else {
if (currentFootStepState != footStepState.Running) {
stepManager.setFootStepState ("Running");
currentFootStepState = footStepState.Running;
}
}
} else {
if (crouching) {
if (currentFootStepState != footStepState.Crouching) {
stepManager.setFootStepState ("Crouching");
currentFootStepState = footStepState.Crouching;
}
} else {
if (currentFootStepState != footStepState.Walking) {
stepManager.setFootStepState ("Walking");
currentFootStepState = footStepState.Walking;
}
}
}
}
}
}
public void setCurrentHeadBobState ()
{
if (isMoving && !obstacleToAvoidMovementFound) {
if (running) {
if (crouching) {
if (currentHeadbobState != headbobState.Run_Crouching) {
headBobManager.setState ("Run Crouching");
currentHeadbobState = headbobState.Run_Crouching;
}
} else {
if (currentHeadbobState != headbobState.Running) {
headBobManager.setState ("Running");
currentHeadbobState = headbobState.Running;
}
}
} else {
if (crouching) {
if (currentHeadbobState != headbobState.Crouching) {
headBobManager.setState ("Crouching");
currentHeadbobState = headbobState.Crouching;
}
} else {
if (currentHeadbobState != headbobState.Walking) {
headBobManager.setState ("Walking");
currentHeadbobState = headbobState.Walking;
}
}
}
if (headBobManager.useDynamicIdle) {
setLastTimeMoved ();
}
} else {
if (headBobManager.useDynamicIdle && canMove && !usingDevice && firstPersonActive && !headBobManager.isExternalShakingActive ()) {
float timeToActiveDynamicIdle = headBobManager.timeToActiveDynamicIdle;
if (Time.time > lastTimeMoved + timeToActiveDynamicIdle &&
Time.time > playerCameraManager.getLastTimeMoved () + timeToActiveDynamicIdle &&
Time.time > lastTimeFiring + timeToActiveDynamicIdle &&
!headBobPaused) {
if (currentHeadbobState != headbobState.Dynamic_Idle) {
headBobManager.setState ("Dynamic Idle");
currentHeadbobState = headbobState.Dynamic_Idle;
}
} else {
if (currentHeadbobState != headbobState.Static_Idle) {
headBobManager.setState ("Static Idle");
currentHeadbobState = headbobState.Static_Idle;
}
}
} else {
if (currentHeadbobState != headbobState.Static_Idle) {
headBobManager.setState ("Static Idle");
currentHeadbobState = headbobState.Static_Idle;
}
}
}
}
public void resetHeadBodState ()
{
currentHeadbobState = headbobState.None;
}
public bool isLastJumpActivatedExternally ()
{
return lastJumpActivatedExternally;
}
//if the vehicle driven by the player ejects him, add force to his rigidbody
public void ejectPlayerFromVehicle (float force)
{
extraForceOnJumpActive = true;
extraForceOnJumpAmount = force;
jumpInput = true;
lastJumpActivatedExternally = true;
//mainRigidbody.AddForce (force * currentNormal, ForceMode.Impulse);
}
bool extraForceOnJumpActive;
float extraForceOnJumpAmount;
//use a jump platform
public void useJumpPlatform (Vector3 direction, ForceMode forceMode)
{
jumpInput = true;
lastJumpActivatedExternally = true;
if (forceMode == ForceMode.VelocityChange) {
mainRigidbody.linearVelocity = vector3Zero;
currentVelocity = vector3Zero;
}
mainRigidbody.AddForce (direction, forceMode);
}
public void useJumpPlatformWithKeyButton (bool state, float newJumpPower)
{
if (state) {
setJumpPower (newJumpPower);
} else {
setOriginalJumpPower ();
}
}
public void setJumpPower (float newValue)
{
jumpPower = newValue;
halfJumpPower = jumpPower * half;
}
public void setOriginalJumpPower ()
{
setJumpPower (originalJumpPower);
}
public Vector3 getCurrentNormal ()
{
return gravityManager.getCurrentNormal ();
}
public void externalForce (Vector3 direction)
{
externalForceActive = true;
externalForceValue = direction;
}
public void setExternalForceOnAir (Vector3 direction, float externalForceOnAirControl)
{
externalForceOnAirActive = true;
externalForceOnAirValue = direction;
externalForceOnAirControlValue = externalForceOnAirControl;
}
public void disableExternalForceOnAirActive ()
{
externalForceOnAirActive = false;
}
public void changeHeadScale (bool state)
{
if (drivingRemotely) {
return;
}
if (fullBodyAwarenessActive) {
return;
}
if (playerCameraManager.isFullBodyAwarenessEnabled ()) {
return;
}
headScaleChanged = state;
if (head != null) {
if (state) {
head.localScale = vector3Zero;
} else {
head.localScale = Vector3.one;
}
}
}
public bool isHeadScaleChanged ()
{
return headScaleChanged;
}
//if the player is driving, set to 0 his movement values and disable the player controller component
public void setDrivingState (bool state, GameObject vehicle, string vehicleName, Transform vehicleCameraControllerTransform)
{
driving = state;
lastTimeDriving = Time.time;
if (driving) {
currentVehicle = vehicle;
currentVehicleName = vehicleName;
currentVehicleCameraControllerTransform = vehicleCameraControllerTransform;
} else {
currentVehicle = null;
currentVehicleName = "";
currentVehicleCameraControllerTransform = vehicleCameraControllerTransform;
}
if (usingAnimator) {
if (customCharacterControllerActive) {
} else {
if (lastForwardAnimatorIDValue != 0) {
lastForwardAnimatorIDValue = 0;
animator.SetFloat (forwardAnimatorID, 0);
}
if (lastTurnAnimatorIDValue != 0) {
lastTurnAnimatorIDValue = 0;
animator.SetFloat (turnAnimatorID, 0);
}
currentHorizontalValue = 0;
currentVerticalValue = 0;
}
}
playerCameraManager.setDrivingState (driving);
}
public float getLastTimeDriving ()
{
return lastTimeDriving;
}
public void setTemporalVehicle (GameObject newVehicle)
{
currentTemporaVehicle = newVehicle;
}
public GameObject getTemporalVehicle ()
{
return currentTemporaVehicle;
}
public bool isPlayerRotatingToSurface ()
{
return characterRotatingToSurface;
}
public void setCharacterRotatingToSurfaceState (bool state)
{
characterRotatingToSurface = state;
}
public bool isPlayerDriving ()
{
return driving;
}
public bool isDrivingRemotely ()
{
return drivingRemotely;
}
public void setDrivingRemotelyState (bool state)
{
drivingRemotely = state;
}
public bool isOverridingElement ()
{
return overridingElement;
}
public void setOverridingElementState (bool state)
{
overridingElement = state;
playerCameraManager.setHeadColliderStateOnFBA (!overridingElement);
}
public void setUsingDeviceState (bool state)
{
usingDevice = state;
playerCameraManager.setHeadColliderStateOnFBA (!usingDevice);
playerCameraManager.checkResetLeanState (false);
setLastTimeMoved ();
}
public void setUsingGeneralDriveRiderSystem (bool state)
{
usingGeneralDriveRiderSystem = state;
}
public bool isUsingGeneralDriveRiderSystem ()
{
return usingGeneralDriveRiderSystem;
}
public bool isUsingDevice ()
{
return usingDevice;
}
//Menu States
public void setUsingSubMenuState (bool state)
{
usingSubMenu = state;
}
public bool isUsingSubMenu ()
{
return usingSubMenu;
}
public void setPlayerMenuActiveState (bool state)
{
playerMenuActive = state;
healthManager.setPlayerMenuActiveState (playerMenuActive);
}
public bool isPlayerMenuActive ()
{
return playerMenuActive;
}
public void setGamePausedState (bool state)
{
gamePaused = state;
setLastTimeMoved ();
}
public bool isGamePaused ()
{
return gamePaused;
}
public void setHeadBobPausedState (bool state)
{
headBobPaused = state;
}
public GameObject getCurrentVehicle ()
{
return currentVehicle;
}
public Transform getCurrentVehicleCameraControllerTransform ()
{
return currentVehicleCameraControllerTransform;
}
public string getCurrentVehicleName ()
{
return currentVehicleName;
}
//if it is neccessary, stop any movement from the keyboard or the touch controls in the player controller
public void changeScriptState (bool state)
{
if (usingAnimator) {
if (customCharacterControllerActive) {
} else {
if (lastForwardAnimatorIDValue != 0) {
lastForwardAnimatorIDValue = 0;
animator.SetFloat (forwardAnimatorID, 0);
}
if (lastTurnAnimatorIDValue != 0) {
lastTurnAnimatorIDValue = 0;
animator.SetFloat (turnAnimatorID, 0);
}
}
}
isMoving = false;
setCanMoveState (state);
resetOtherInputFields ();
resetPlayerControllerInput ();
}
public void removeJumpInputState ()
{
jumpInput = false;
lastJumpActivatedExternally = false;
}
public void resetOtherInputFields ()
{
jump = false;
jumpInput = false;
doubleJump = false;
slowingFall = false;
slowingFallInput = false;
setHeadbodStatesPaused = false;
gravityMultiplier = currentGravityMultiplier;
slowFallExternallyActive = false;
}
public void setCanMoveState (bool state)
{
canMove = state;
if (showDebugPrint) {
print ("setting can move state to " + state);
}
if (customCharacterControllerActive) {
currentCustomCharacterControllerBase.updateCanMoveState (canMove);
}
}
public void setCanMoveAIState (bool state)
{
canMoveAI = state;
if (showDebugPrint) {
print ("setting can move AI state to " + state);
}
}
public void setPlayerVelocityToZero ()
{
mainRigidbody.linearVelocity = vector3Zero;
currentVelocity = vector3Zero;
velocityChange = vector3Zero;
}
public void setCurrentVelocityValue (Vector3 newValue)
{
currentVelocity = newValue;
}
public void setVelocityChangeValue (Vector3 newValue)
{
velocityChange = newValue;
}
public void smoothChangeScriptState (bool state)
{
setCanMoveState (state);
if (!state) {
smoothResetPlayerControllerInput ();
} else {
if (resetInputCoroutine != null) {
StopCoroutine (resetInputCoroutine);
}
}
}
public bool canPlayerMove ()
{
return canMove;
}
public void setMoveInputPausedState (bool state)
{
moveIputPaused = state;
}
bool moveInputPausedWithDurationActive;
float moveInputPausedWithDurationAmount;
float lastTimeMoveInputPausedWithDurationActive;
public void setMoveInputPausedWithDuration (bool state, float newDuration)
{
moveInputPausedWithDurationActive = state;
moveInputPausedWithDurationAmount = newDuration;
lastTimeMoveInputPausedWithDurationActive = Time.time;
}
public bool canPlayerRagdollMove ()
{
return canRagdollMove;
}
public void setCanRagdollMoveState (bool state)
{
canRagdollMove = state;
}
bool ragdollCurrentlyActive;
public void setRagdollCurrentlyActiveState (bool state)
{
ragdollCurrentlyActive = state;
if (customCharacterControllerActive) {
currentCustomCharacterControllerBase.setRagdollCurrentlyActiveState (ragdollCurrentlyActive);
}
playerCameraManager.setHeadColliderStateOnFBA (!state);
}
public bool isRagdollCurrentlyActive ()
{
return ragdollCurrentlyActive;
}
public void setPlayerActionsInputEnabledState (bool state)
{
playerActionsInputEnabled = state;
}
public void enablePlayerActionsInput ()
{
setPlayerActionsInputEnabledState (true);
}
public void disablePlayerActionsInput ()
{
setPlayerActionsInputEnabledState (false);
}
public void smoothResetPlayerControllerInput ()
{
if (resetInputCoroutine != null) {
StopCoroutine (resetInputCoroutine);
}
resetInputCoroutine = StartCoroutine (smoothResetPlayerControllerInputCoroutine ());
}
IEnumerator smoothResetPlayerControllerInputCoroutine ()
{
float currentTime = 0;
while (verticalInput != 0 || horizontalInput != 0) {
currentTime = getCurrentDeltaTime ();
verticalInput = Mathf.MoveTowards (verticalInput, 0, currentTime * 2);
horizontalInput = Mathf.MoveTowards (horizontalInput, 0, currentTime * 2);
yield return null;
}
}
public void enableOrDisablePlayerControllerScript (bool state)
{
enabled = state;
if (!enabled) {
if (customCharacterControllerActive) {
} else {
if (lastForwardAnimatorIDValue != 0) {
lastForwardAnimatorIDValue = 0;
animator.SetFloat (forwardAnimatorID, 0);
}
if (lastTurnAnimatorIDValue != 0) {
lastTurnAnimatorIDValue = 0;
animator.SetFloat (turnAnimatorID, 0);
}
if (lastJumpAnimatorIDValue != 0) {
lastJumpAnimatorIDValue = 0;
animator.SetFloat (jumpAnimatorID, 0);
}
if (lastJumpLegAnimatorIDValue != 0) {
lastJumpLegAnimatorIDValue = 0;
animator.SetFloat (jumpLegAnimatorID, 0);
}
if (lastHorizontalAnimatorIDValue != 0) {
lastHorizontalAnimatorIDValue = 0;
animator.SetFloat (horizontalAnimatorID, 0);
}
if (lastVerticalAnimatorIDValue != 0) {
lastVerticalAnimatorIDValue = 0;
animator.SetFloat (verticalAnimatorID, 0);
}
animator.SetBool (movingAnimatorID, false);
}
previousValueAimingModeActiveAnimatorState = false;
}
}
public void resetAnimatorState ()
{
if (isCrouching ()) {
crouch ();
if (customCharacterControllerActive) {
} else {
animator.SetBool (crouchAnimatorID, false);
}
}
if (customCharacterControllerActive) {
} else {
if (lastJumpAnimatorIDValue != 0) {
lastJumpAnimatorIDValue = 0;
animator.SetFloat (jumpAnimatorID, 0);
}
if (lastJumpLegAnimatorIDValue != 0) {
lastJumpLegAnimatorIDValue = 0;
animator.SetFloat (jumpLegAnimatorID, 0);
}
if (lastTurnAnimatorIDValue != 0) {
lastTurnAnimatorIDValue = 0;
animator.SetFloat (turnAnimatorID, 0);
}
if (lastForwardAnimatorIDValue != 0) {
lastForwardAnimatorIDValue = 0;
animator.SetFloat (forwardAnimatorID, 0);
}
if (!pauseResetAnimatorStateFOrGroundAnimator) {
animator.SetBool (onGroundAnimatorID, true);
setTimeOnAirAnimatorIDValue ();
}
}
pauseResetAnimatorStateFOrGroundAnimator = false;
}
public void setPauseResetAnimatorStateFOrGroundAnimatorState (bool state)
{
pauseResetAnimatorStateFOrGroundAnimator = state;
}
public void setOnGroundAnimatorIDValue (bool state)
{
if (!customCharacterControllerActive) {
setOnGroundAnimatorIDValueWithoutCheck (state);
}
}
public void setOnGroundAnimatorIDValueWithoutCheck (bool state)
{
animator.SetBool (onGroundAnimatorID, state);
setTimeOnAirAnimatorIDValue ();
}
public void setJumpAnimatorIDValue (float newValue)
{
if (lastJumpAnimatorIDValue != newValue) {
lastJumpAnimatorIDValue = newValue;
animator.SetFloat (jumpAnimatorID, newValue);
}
}
public void setRightArmdIDAnimatorIDValue (int newValue)
{
animator.SetInteger (rightArmdIDAnimatorID, newValue);
}
public void setLeftArmIDAnimatorIDValue (int newValue)
{
animator.SetInteger (leftArmIDAnimatorID, newValue);
}
public void setTimeOnAirAnimatorIDValue ()
{
float newValue = Time.time - lastTimeOnAirAnimator;
if (newValue < 0) {
newValue = 0;
}
animator.SetFloat (timeOnAirAnimatorID, newValue);
}
public void equipJetpack (bool state)
{
jetPackEquiped = state;
}
public void setUsingJetpackState (bool state)
{
usingJetpack = state;
}
public bool isJetpackEquiped ()
{
return jetPackEquiped;
}
public bool isUsingJetpack ()
{
return usingJetpack;
}
public void enableOrDisableFlyingMode (bool state)
{
flyModeActive = state;
if (!swimModeActive) {
setEnableExternalForceOnFlyModeState (false);
}
}
public bool isFlyingActive ()
{
return flyModeActive;
}
public void enableOrDisableFlyModeTurbo (bool state)
{
}
public void setFreeClimbActiveState (bool state)
{
freeClimbActive = state;
playerCameraManager.setHeadColliderStateOnFBA (!freeClimbActive);
}
public bool isFreeClimbActive ()
{
return freeClimbActive;
}
public void setGrabbingToSurfaceActiveState (bool state)
{
grabbingToSurfaceActive = state;
}
public bool isGrabbingToSurfaceActive ()
{
return grabbingToSurfaceActive;
}
public void setAdjustingToSurfaceToGrabInProcessState (bool state)
{
adjustingToSurfaceToGrabInProcess = state;
}
public bool isAjustingToSurfaceToGrabInProcess ()
{
return adjustingToSurfaceToGrabInProcess;
}
public void setCarryingPhysicalObjectState (bool state)
{
carryingPhysicalObject = state;
}
public bool isCarryingPhysicalObject ()
{
return carryingPhysicalObject;
}
public void enableOrDisableSwimMode (bool state)
{
swimModeActive = state;
if (!swimModeActive) {
setEnableExternalForceOnSwimModeState (false);
}
}
public bool isSwimModeActive ()
{
return swimModeActive;
}
public void setEnableExternalForceOnSwimModeState (bool state)
{
enableExternalForceOnSwimMode = state;
}
public void setEnableExternalForceOnFlyModeState (bool state)
{
enableExternalForceOnFlyMode = state;
}
public void setTurnAndForwardAnimatorValuesPausedState (bool state)
{
turnAndForwardAnimatorValuesPaused = state;
}
public void setPauseCameraShakeFromGravityActiveState (bool state)
{
pauseCameraShakeFromGravityActive = state;
}
public bool isPauseCameraShakeFromGravityActive ()
{
return pauseCameraShakeFromGravityActive;
}
public externalControllerBehaviorManager mainExternalControllerBehaviorManager;
string currentExternalControllerBehaviorName = "";
public void setExternalControllerBehavior (externalControllerBehavior newExternalControllerBehavior)
{
currentExternalControllerBehavior = newExternalControllerBehavior;
externalControllBehaviorActive = currentExternalControllerBehavior != null;
if (newExternalControllerBehavior != null) {
currentExternalControllerBehaviorName = newExternalControllerBehavior.behaviorName;
}
if (externalControllBehaviorActive) {
if (freeFloatingModeOn) {
GKC_Utils.enableOrDisableFreeFloatingModeOnState (gameObject, false);
}
}
if (mainExternalControllerBehaviorManager != null) {
if (externalControllBehaviorActive) {
mainExternalControllerBehaviorManager.setExternalControllerActive (currentExternalControllerBehaviorName);
} else {
mainExternalControllerBehaviorManager.setExternalControllerDeactive (currentExternalControllerBehaviorName);
}
}
if (newExternalControllerBehavior == null) {
currentExternalControllerBehaviorName = "";
}
resetLastMoveInputOnJumpValue ();
if (externalControllBehaviorActive) {
releaseJumpButton ();
}
}
public externalControllerBehavior getCurrentExternalControllerBehavior ()
{
return currentExternalControllerBehavior;
}
public bool isExternalControllBehaviorActive ()
{
return externalControllBehaviorActive;
}
public string getCurrentExternalControllerBehaviorName ()
{
return currentExternalControllerBehaviorName;
}
public void setUseExternalControllerBehaviorPausedState (bool state)
{
useExternalControllerBehaviorPaused = state;
}
public bool isUseExternalControllerBehaviorPaused ()
{
return useExternalControllerBehaviorPaused;
}
public externalControllerBehavior getExternalControllerBehaviorWallRunning ()
{
return wallRunningExternalControllerBehavior;
}
public void checkChangeCameraViewStateOnExternalControllerBehavior ()
{
if (externalControllBehaviorActive) {
currentExternalControllerBehavior.checkChangeCameraViewStateOnExternalControllerBehavior ();
}
}
public void setAvoidListOfExternalControllerStatesActiveState (bool state, List<string> newList)
{
avoidListOfExternalControllerStatesActive = state;
externalControllerToAvoidList = newList;
}
public bool isAvoidListOfExternalControllerStatesActive ()
{
return avoidListOfExternalControllerStatesActive;
}
public List<string> getExternalControllerToAvoidList ()
{
return externalControllerToAvoidList;
}
public bool checkIfInsideExternalControllerToAvoidList (string nameToCheck)
{
return externalControllerToAvoidList.Contains (nameToCheck);
}
bool avoidListOfExternalControllerStatesActive;
List<string> externalControllerToAvoidList = new List<string> ();
public void setCustomCharacterControllerActiveState (bool state, customCharacterControllerBase customCharacterControllerBaseInfo)
{
customCharacterControllerActive = state;
currentCustomCharacterControllerBase = customCharacterControllerBaseInfo;
if (currentCustomCharacterControllerBase != null) {
currentCustomCharacterControllerBase.updateCanMoveState (canMove);
currentCustomCharacterControllerBase.setRagdollCurrentlyActiveState (ragdollCurrentlyActive);
}
}
public bool isCustomCharacterControllerActive ()
{
return customCharacterControllerActive;
}
public void setExternalControlBehaviorForAirTypeActiveState (bool state)
{
externalControlBehaviorForAirTypeActive = state;
}
public void enableOrDisableAiminig (bool state)
{
if (playerCameraManager.isFirstPersonActive ()) {
enableOrDisableAimingInFirstPerson (state);
enableOrDisableAimingInThirdPerson (false);
} else {
enableOrDisableAimingInThirdPerson (state);
enableOrDisableAimingInFirstPerson (false);
}
if (!state) {
lastTimePlayerUserInput = 0;
}
}
public void enableOrDisableAimingInFirstPerson (bool state)
{
aimingInFirstPerson = state;
playerIsAiming = isPlayerAiming ();
}
public void enableOrDisableAimingInThirdPerson (bool state)
{
aimingInThirdPerson = state;
playerIsAiming = isPlayerAiming ();
checkOtherStatesOnAirID (state);
}
public bool isPlayerAiming ()
{
return aimingInFirstPerson || aimingInThirdPerson;
}
public bool isPlayerAimingInThirdPerson ()
{
return aimingInThirdPerson;
}
public bool isPlayerAimingInFirstPerson ()
{
return aimingInFirstPerson;
}
public void checkOtherStatesOnAirID (bool state)
{
if (state) {
if (!regularAirboneIDActivePreviously) {
if (currentAirID == regularAirboneID) {
setCurrentAirIDValue (regularAirID);
regularAirboneIDActivePreviously = true;
}
}
} else {
if (regularAirboneIDActivePreviously) {
if (!isPlayerOnFFOrZeroGravityModeOn ()) {
setCurrentAirIDValue (regularAirboneID);
}
regularAirboneIDActivePreviously = false;
}
}
}
public bool isLookingInCameraDirection ()
{
return ((isPlayerAiming () && hasToLookInCameraDirectionOnFreeFire ()) || lookInCameraDirectionActive || firstPersonActive);
}
public playerCamera getPlayerCameraManager ()
{
return playerCameraManager as playerCamera;
}
public GameObject getPlayerCameraGameObject ()
{
return playerCameraGameObject;
}
public bool isPlayerOnFirstPerson ()
{
return firstPersonActive;
}
public void setFirstPersonViewActiveState (bool state)
{
firstPersonActive = state;
resetHeadBodState ();
if (firstPersonActive) {
if (setHeadbodStatesPaused) {
setHeadbodStatesPaused = false;
playerCameraManager.setShakeCameraState (false, "");
}
} else {
if (currentSurfaceBelowPlayer != null) {
previousValueOnGroundAnimatorState = false;
}
previousValueCrouching = !crouching;
}
IKSystemManager.setIsThirdPersonViewState (!firstPersonActive);
}
bool strafeModeActivatedExternally;
public void setFullBodyAwarenessActiveStateAtStart (bool state)
{
fullBodyAwarenessActiveAtStart = state;
}
public void setFullBodyAwarenessActiveStateExternally (bool state)
{
fullBodyAwarenessActive = state;
}
public void setFullBodyAwarenessActiveState (bool state)
{
fullBodyAwarenessActive = state;
if (fullBodyAwarenessActive) {
activateStrafeMode ();
if (!useRootMotionOnFullBodyAwareness) {
setApplyRootMotionState (false);
setUseRootMotionActiveState (false);
setNoRootMotionValues (FBAWalkMovementSpeed, FBARunMovementSpeed, FBASprintMovementSpeed,
FBACrouchMovementSpeed, FBACrouchRunMovementSpeed, FBAWalkStrafeMovementSpeed, FBARunStrafeMovementSpeed);
}
if (useFBACustomMoveSpeedMultiplier) {
useCustomMoveSpeedMultiplier = true;
customMoveSpeedMultiplier = FBACustomMoveSpeedMultiplier;
}
} else {
if (!strafeModeActivatedExternally) {
deactivateStrafeMode ();
}
if (!useRootMotionOnFullBodyAwareness) {
setApplyRootMotionState (originalSetUseRootMotionActiveState);
setUseRootMotionActiveState (originalSetUseRootMotionActiveState);
setOriginalNoRootMotionValues ();
}
if (useFBACustomMoveSpeedMultiplier) {
useCustomMoveSpeedMultiplier = false;
}
}
playerCameraManager.setFBAPivotCameraTransformActiveState (state);
playerCameraManager.startOrStopUpdatePivotPositionOnFBA (state);
playerCameraManager.checkActivateOrDeactivateHeadColliderOnFBA (state);
IKSystemManager.setFullBodyAwarenessActiveState (state);
animator.SetBool (animatorFBAActiveID, state);
}
public bool isFullBodyAwarenessActive ()
{
return fullBodyAwarenessActive;
}
public void setPivotCameraTransformParentCurrentTransformToFollow ()
{
playerCameraManager.setPivotCameraTransformParentCurrentTransformToFollow ();
}
public void setPivotCameraTransformOriginalParent ()
{
playerCameraManager.setPivotCameraTransformOriginalParent ();
}
public void resetPivotCameraTransformLocalRotation ()
{
playerCameraManager.resetPivotCameraTransformLocalRotation ();
}
public void setNewPlayerCharacterPositionAndRotation (Vector3 targetPosition, Vector3 targetRotation)
{
playerTransform.position = targetPosition;
playerTransform.eulerAngles = targetRotation;
playerCameraTransform.position = targetPosition;
playerCameraTransform.eulerAngles = targetRotation;
}
public void stopShakeCamera ()
{
playerCameraManager.stopShakeCamera ();
}
public float getForwardAmount ()
{
return forwardAmount;
}
public void setForwardAmountExternally (float newValue)
{
animator.SetFloat (forwardAnimatorID, newValue);
}
public bool isPlayerMoving (float movingTolerance)
{
if (Mathf.Abs (horizontalInput) > movingTolerance || Mathf.Abs (verticalInput) > movingTolerance) {
return true;
}
return false;
}
public bool isPlayerMovingHorizontal (float movingTolerance)
{
if (Mathf.Abs (horizontalInput) > movingTolerance) {
return true;
}
return false;
}
public bool isPlayerMovingVertical (float movingTolerance)
{
if (Mathf.Abs (verticalInput) > movingTolerance) {
return true;
}
return false;
}
public bool isPlayerUsingInput ()
{
if (rawAxisValues.x != 0 || rawAxisValues.y != 0) {
return true;
}
return false;
}
public bool isPlayerUsingVerticalInput ()
{
if (rawAxisValues.y != 0) {
return true;
}
return false;
}
public bool isPlayerUsingHorizontalInput ()
{
if (rawAxisValues.x != 0) {
return true;
}
return false;
}
public Vector2 getAxisValues ()
{
return axisValues;
}
public Vector2 getRawAxisValues ()
{
return rawAxisValues;
}
public void resetPlayerControllerInput ()
{
horizontalInput = 0;
verticalInput = 0;
}
public void resetLastMoveInputOnJumpValue ()
{
lastMoveInputOnJump = vector3Zero;
ignoreLastMoveInputOnJump = false;
}
public void overrideMainCameraTransformDirection (Transform newCameraDirection, bool overrideState)
{
overrideMainCameraTransform = newCameraDirection;
overrideMainCameraTransformActive = overrideState;
}
public void setUseForwardDirectionForCameraDirectionState (bool state)
{
useForwardDirectionForCameraDirection = state;
}
public void setUseRightDirectionForCameraDirectionState (bool state)
{
useRightDirectionForCameraDirection = state;
}
public void setOverrideTurnAmount (float newTurnAmount, bool newOverrideTurnAmountActiveState)
{
overrideTurnAmount = newTurnAmount;
overrideTurnAmountActive = newOverrideTurnAmountActiveState;
}
public void setLockedCameraState (bool state, bool useTankControlsValue, bool useRelativeMovementToLockedCameraValue,
bool playerCanMoveOnAimInTankModeValue)
{
lockedCameraActive = state;
useTankControls = useTankControlsValue;
playerCanMoveOnAimInTankMode = playerCanMoveOnAimInTankModeValue;
tankModeCurrentlyEnabled = lockedCameraActive && useTankControls;
useRelativeMovementToLockedCamera = useRelativeMovementToLockedCameraValue;
if (!lockedCameraActive) {
checkCameraDirectionFromLockedToFree = true;
}
}
public bool isLockedCameraStateActive ()
{
return lockedCameraActive;
}
public void setUpdate2_5dClampedPositionPausedState (bool state)
{
update2_5dClampedPositionPaused = state;
}
public bool isTankModeActive ()
{
return useTankControls && lockedCameraActive;
}
public bool canCharacterGetOnVehicles ()
{
return canGetOnVehicles;
}
public void setCanCharacterGetOnVehiclesState (bool state)
{
canGetOnVehicles = state;
}
public void setOriginalCanCharacterGetOnVehiclesState ()
{
setCanCharacterGetOnVehiclesState (originalCanCharacterGetOnVehiclesState);
}
public bool isActionToGetOnVehicleActive ()
{
return actionToGetOnVehicleActive;
}
public void setActionToGetOnVehicleActiveState (bool state)
{
actionToGetOnVehicleActive = state;
}
public bool isActionToGetOffFromVehicleActive ()
{
return actionToGetOffFromVehicleActive;
}
public void setActionToGetOffFromVehicleActiveState (bool state)
{
actionToGetOffFromVehicleActive = state;
}
public bool canCharacterDrive ()
{
return canDrive;
}
public void setCanDriveState (bool state)
{
canDrive = state;
}
public void setOriginalCanDriveState ()
{
setCanDriveState (originalCanDrive);
}
public void setCanMoveWhileAimLockedCameraValue (bool state)
{
canMoveWhileAimLockedCamera = state;
}
public void setOriginalCanMoveWhileAimLockedCameraValue ()
{
setCanMoveWhileAimLockedCameraValue (originalCanMoveWhileAimLockedCamera);
}
public GameObject getPlayerManagersParentGameObject ()
{
if (playerManagersParentGameObject != null) {
return playerManagersParentGameObject;
} else {
return playerTransform.parent.gameObject;
}
}
public void setPlayerAndCameraParent (Transform newParent)
{
playerCameraManager.setPlayerAndCameraParent (newParent);
if (newParent != null) {
setPlayerSetAsChildOfParentState (true);
} else {
setPlayerSetAsChildOfParentState (false);
}
currentTemporalPlayerParent = newParent;
}
public void setPlayerAndCameraAndFBAPivotTransformParent (Transform newParent)
{
if (newParent == null) {
playerCameraManager.setFBAPivotTransformParentFromPlayer (null);
}
setPlayerAndCameraParent (newParent);
if (newParent != null) {
playerCameraManager.setFBAPivotTransformParentFromPlayer (newParent);
}
}
public Transform getCurrentTemporalPlayerParent ()
{
return currentTemporalPlayerParent;
}
public void setMovingOnPlatformActiveState (bool state)
{
movingOnPlatformActive = state;
}
public void setUpdatePlayerCameraPositionOnLateUpdateActiveState (bool state)
{
playerCameraManager.setUpdatePlayerCameraPositionOnLateUpdateActiveState (state);
}
public void setUpdatePlayerCameraPositionOnFixedUpdateActiveState (bool state)
{
playerCameraManager.setUpdatePlayerCameraPositionOnFixedUpdateActiveState (state);
}
public void setMovingInsideVehicleState (bool state)
{
movingInsideVehicle = state;
}
public bool isMovingInsideVehicle ()
{
return movingInsideVehicle;
}
Vector3 externalForceInsideVehicle;
public void setMovingInsideVehicleState (Vector3 externalForceInsideVehicleValue)
{
externalForceInsideVehicle = externalForceInsideVehicleValue;
}
public bool isMovingOnPlatformActive ()
{
return movingOnPlatformActive;
}
//AI input and functions to use this controller with an AI system
public void setReducedVelocity (float newValue)
{
setAnimSpeedMultiplierValue (newValue);
}
public void setNormalVelocity ()
{
setAnimSpeedMultiplierValue (originalAnimationSpeed);
}
void setAnimSpeedMultiplierValue (float newValue)
{
animSpeedMultiplier = newValue;
}
public float getAnimSpeedMultiplier ()
{
return animSpeedMultiplier;
}
public void setMoveSpeedMultiplierValue (float newValue)
{
moveSpeedMultiplier = newValue;
}
public void setOriginalMoveSpeedMultiplierValue ()
{
setMoveSpeedMultiplierValue (originalMoveSpeedMultiplier);
}
public void setNewAnimSpeedMultiplierDuringXTime (float newValue)
{
changeAnimSpeedMultiplierDuration = newValue;
stopSetNewAnimSpeedMultiplierDuringXTimeCoroutine ();
changeAnimSpeedMultiplierCoroutine = StartCoroutine (setNewAnimSpeedMultiplierDuringXTimeCoroutine ());
}
public void setRegularAnimSpeedMultiplier ()
{
if (overrideAnimationSpeedActive) {
stopSetNewAnimSpeedMultiplierDuringXTimeCoroutine ();
setNormalVelocity ();
if (usedByAI) {
setCanMoveAIState (true);
}
}
}
IEnumerator setNewAnimSpeedMultiplierDuringXTimeCoroutine ()
{
animSpeedMultiplierChangedDuringXTimeActive = true;
overrideAnimationSpeedActive = true;
WaitForSeconds delay = new WaitForSeconds (changeAnimSpeedMultiplierDuration);
yield return delay;
setNormalVelocity ();
overrideAnimationSpeedActive = false;
animSpeedMultiplierChangedDuringXTimeActive = false;
if (usedByAI) {
setCanMoveAIState (true);
}
}
void stopSetNewAnimSpeedMultiplierDuringXTimeCoroutine ()
{
if (changeAnimSpeedMultiplierCoroutine != null) {
StopCoroutine (changeAnimSpeedMultiplierCoroutine);
}
overrideAnimationSpeedActive = false;
animSpeedMultiplierChangedDuringXTimeActive = false;
}
public bool isAnimSpeedMultiplierChangedDuringXTimeActive ()
{
return animSpeedMultiplierChangedDuringXTimeActive;
}
int pauseCharacterPriority = 0;
public void setPauseCharacterPriorityValue (int newValue)
{
pauseCharacterPriority = newValue;
}
public int getPauseCharacterPriorityValue ()
{
return pauseCharacterPriority;
}
public void changeControlInputType (bool value)
{
usedByAI = value;
if (usedByAI) {
resetPlayerControllerInput ();
} else {
playerInput.overrideInputValues (Vector2.zero, false);
}
}
public void setAIElementsEnabledState (bool state)
{
if (AIElements.activeSelf != state) {
AIElements.SetActive (state);
}
}
public void setUsedByAIState (bool state)
{
usedByAI = state;
if (!usedByAI) {
updateOverrideInputValues (Vector2.zero, false);
}
}
public void startOverride ()
{
overrideCharacterControlState (true);
}
public void stopOverride ()
{
overrideCharacterControlState (false);
}
public void overrideCharacterControlState (bool state)
{
usedByAI = !state;
characterControlOverrideActive = state;
if (!usedByAI) {
playerInput.overrideInputValues (Vector2.zero, false);
}
}
public bool isCharacterUsedByAI ()
{
return usedByAI;
}
public bool isCharacterControlOverrideActive ()
{
return characterControlOverrideActive;
}
public float getHorizontalInput ()
{
return horizontalInput;
}
public float getVerticalInput ()
{
return verticalInput;
}
public Vector3 getMoveInputDirection ()
{
return currentMoveInput;
}
public void setLookInCameraDirectionState (bool state)
{
lookInCameraDirection = state;
}
// The Move function is designed to be called from a separate component
// based on User input, or an AI control script
public void Move (AINavMeshMoveInfo inputInfo)
{
if (inputInfo.moveInput.magnitude > 1) {
inputInfo.moveInput.Normalize ();
}
navMeshMoveInput = inputInfo.moveInput;
// crouchInput = inputInfo.crouchInput;
if (inputInfo.jumpInput) {
activateJump ();
}
lookInCameraDirection = inputInfo.lookAtTarget;
AIStrafeModeActive = inputInfo.strafeModeActive;
AIEnableInputMovementOnStrafe = inputInfo.AIEnableInputMovementOnStrafe;
}
public void setVisibleToAIState (bool state)
{
visibleToAI = state;
}
public bool isCharacterInVisibleState ()
{
return visibleToAI;
}
public bool isCharacterVisibleToAI ()
{
return visibleToAI && !stealthModeActive;
}
public void setStealthModeActiveState (bool state)
{
stealthModeActive = state;
}
public bool isCharacterInStealthMode ()
{
return stealthModeActive;
}
public void setCharacterStateIcon (string stateName)
{
if (characterStateIconManager != null) {
characterStateIconManager.setCharacterStateIcon (stateName);
}
}
public void disableCharacterStateIcon ()
{
if (characterStateIconManager != null) {
characterStateIconManager.disableCharacterStateIcon ();
}
}
public int getPlayerID ()
{
return playerID;
}
public void setPlayerID (int newID)
{
playerID = newID;
}
public bool isPlayerNonLocalAvatar ()
{
return playerIsNonLocalAvatar;
}
public void setPlayerIsNonLocalAvatarState (bool state)
{
playerIsNonLocalAvatar = state;
}
public int getPlayerNonLocalAvatarID ()
{
return playerNonLocalAvatarID;
}
public void setPlayerNonLocalAvatarID (int newID)
{
playerNonLocalAvatarID = newID;
}
public void setPlayerDeadState (bool state)
{
isDead = state;
if (isDead) {
if (isPlayerRunning ()) {
stopRun ();
}
if (isCrouching ()) {
crouch ();
}
lastTimeResurrect = 0;
} else {
lastTimeResurrect = Time.time;
}
}
public bool isPlayerDead ()
{
return isDead;
}
public float getLastTimeResurrect ()
{
return lastTimeResurrect;
}
public void setFallDamageCheckPausedState (bool state)
{
fallDamageCheckPaused = state;
}
public void setFallDamageCheckOnHealthPausedState (bool state)
{
fallDamageCheckOnHealthPaused = state;
}
public bool checkIfPlayerDeadFromHealthComponent ()
{
return healthManager.isDead ();
}
public void setDamageReactionPausedState (bool state)
{
healthManager.setDamageReactionPausedState (state);
}
bool playerUsingWeapons;
public void setPlayerUsingWeaponsState (bool state)
{
playerUsingWeapons = state;
}
public bool isPlayerUsingWeapons ()
{
if (weaponsManagerLocated) {
return playerUsingWeapons;
}
return false;
}
public bool isPlayerUsingPowers ()
{
return usingPowers;
}
public bool isPlayerUsingMeleeWeapons ()
{
return playerUsingMeleeWeapons;
}
public bool isPlayerMeleeWeaponThrown ()
{
return playerMeleeWeaponThrown;
}
public void setPlayerMeleeWeaponThrownState (bool state)
{
playerMeleeWeaponThrown = state;
}
public void setPlayerUsingMeleeWeaponsState (bool state)
{
playerUsingMeleeWeapons = state;
}
public void setPlayerNavMeshEnabledState (bool state)
{
playerNavMeshEnabled = state;
resetPlayerControllerInput ();
if (!playerNavMeshEnabled) {
playerInput.overrideInputValues (Vector2.zero, false);
}
}
public bool isPlayerNavMeshEnabled ()
{
return playerNavMeshEnabled;
}
public void enableOrDisableDoubleJump (bool state)
{
enabledDoubleJump = state;
}
public void setMaxNumberJumpsInAir (float amount)
{
maxNumberJumpsInAir = (int)amount;
}
public void enableOrDisableJump (bool state)
{
enabledRegularJump = state;
}
public void setcanJumpActiveState (bool state)
{
canJumpActive = state;
}
public void setJumpInputPausedState (bool state)
{
jumpInputPaused = state;
}
public void setHoldJumpSlowDownFallEnabledState (bool state)
{
holdJumpSlowDownFallEnabled = state;
}
public void setRunInputPausedState (bool state)
{
runInputPaused = state;
}
public void setPhysicMaterialAssigmentPausedState (bool state)
{
physicMaterialAssigmentPaused = state;
}
public void setUsingAbilityActiveState (bool state)
{
usingAbilityActive = state;
}
public bool isUsingAbilityActive ()
{
return usingAbilityActive;
}
public void setCrouchInputPausedState (bool state)
{
crouchInputPaused = state;
}
public void setHighFrictionMaterial ()
{
if (!highFrictionMaterialActive) {
capsule.material = highFrictionMaterial;
highFrictionMaterialActive = true;
}
}
public void setZeroFrictionMaterial ()
{
if (highFrictionMaterialActive) {
capsule.material = zeroFrictionMaterial;
highFrictionMaterialActive = false;
}
}
public bool playerCanRunNow ()
{
return (!playerCameraManager.isFirstPersonActive () && canRunThirdPersonActive) ||
(playerCameraManager.isFirstPersonActive () && (noAnimatorCanRun && (getVerticalInput () > 0 || noAnimatorCanRunBackwards)));
}
public void setNoAnimatorWalkMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorWalkMovementSpeed = originalNoAnimWalkMovementSpeed;
} else {
noAnimatorWalkMovementSpeed = originalNoAnimWalkMovementSpeed * newValue;
}
}
public void setNoAnimatorRunMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorRunMovementSpeed = originalNoAnimRunMovementSpeed;
} else {
noAnimatorRunMovementSpeed = originalNoAnimRunMovementSpeed * newValue;
}
}
public void setNoAnimatorCrouchMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorCrouchMovementSpeed = originalNoAnimCrouchMovementSpeed;
} else {
noAnimatorCrouchMovementSpeed = originalNoAnimCrouchMovementSpeed * newValue;
}
}
public void setNoAnimatorStrafeMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorStrafeMovementSpeed = originalNoAnimStrafeMovementSpeed;
} else {
noAnimatorStrafeMovementSpeed = originalNoAnimStrafeMovementSpeed * newValue;
}
}
public void setNoAnimatorWalkBackwardMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorWalkBackwardMovementSpeed = originalNoAnimWalkBackwardMovementSpeed;
} else {
noAnimatorWalkBackwardMovementSpeed = originalNoAnimWalkBackwardMovementSpeed * newValue;
}
}
public void setNoAnimatorRunBackwardMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorRunBackwardMovementSpeed = originalNoAnimRunBackwardMovementSpeed;
} else {
noAnimatorRunBackwardMovementSpeed = originalNoAnimRunBackwardMovementSpeed * newValue;
}
}
public void setNoAnimatorCrouchBackwardMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorCrouchBackwardMovementSpeed = originalNoAnimCrouchBackwardMovementSpeed;
} else {
noAnimatorCrouchBackwardMovementSpeed = originalNoAnimCrouchBackwardMovementSpeed * newValue;
}
}
public void setNoAnimatorStrafeBackwardMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorStrafeBackwardMovementSpeed = originalNoAnimStrafeBackwardMovementSpeed;
} else {
noAnimatorStrafeBackwardMovementSpeed = originalNoAnimStrafeBackwardMovementSpeed * newValue;
}
}
public void setNoAnimatorCanRunState (bool newState, bool setOriginalValue)
{
if (setOriginalValue) {
noAnimatorCanRun = originalNoAnimCanRun;
} else {
noAnimatorCanRun = newState;
}
}
public void setNoAnimatorGeneralMovementSpeed (float newValue, bool setOriginalValue)
{
setNoAnimatorWalkMovementSpeed (newValue, setOriginalValue);
setNoAnimatorRunMovementSpeed (newValue, setOriginalValue);
setNoAnimatorCrouchMovementSpeed (newValue, setOriginalValue);
setNoAnimatorStrafeMovementSpeed (newValue, setOriginalValue);
setNoAnimatorWalkBackwardMovementSpeed (newValue, setOriginalValue);
setNoAnimatorRunBackwardMovementSpeed (newValue, setOriginalValue);
setNoAnimatorCrouchBackwardMovementSpeed (newValue, setOriginalValue);
setNoAnimatorStrafeBackwardMovementSpeed (newValue, setOriginalValue);
}
public void setNoAnimatorSpeedValue (float newValue)
{
noAnimatorSpeed = newValue;
}
public void setAnimatorCanRunState (bool newState, bool setOriginalValue)
{
if (setOriginalValue) {
canRunThirdPersonActive = true;
} else {
canRunThirdPersonActive = newState;
}
}
public void setAnimatorGeneralMovementSpeed (float newValue, bool setOriginalValue)
{
if (setOriginalValue) {
setOriginalWalkSpeed ();
} else {
setWalkSpeedValue (newValue);
}
}
public bool hasToLookInCameraDirection ()
{
//if the player has active the option to look in the camera direction, or to look on that direction when the camera is looking to a target, return true
//also, check if the player only follows the camera direction while moving or not, and also, check if he is currently on ground state
return (lookAlwaysInCameraDirection || (lookInCameraDirectionIfLookingAtTarget && playerCameraManager.isPlayerLookingAtTarget ()))
&& lookInCameraDirectionOnFreeFireActive
&& (playerOnGround || !ignoreStrafeStateOnAirEnabled || fullBodyAwarenessActive);
}
bool ignoreLookInCameraDirectionOnFreeFireActive;
public void setIgnoreLookInCameraDirectionOnFreeFireActiveState (bool state)
{
ignoreLookInCameraDirectionOnFreeFireActive = state;
}
public bool hasToLookInCameraDirectionOnFreeFire ()
{
if (ignoreLookInCameraDirectionOnFreeFireActive) {
return false;
}
return (!usingFreeFireMode && !checkToKeepWeaponAfterAimingWeaponFromShooting) || lookInCameraDirectionOnFreeFire || useRelativeMovementToLockedCamera;
}
public bool isPlayerLookingAtTarget ()
{
return playerCameraManager.isPlayerLookingAtTarget ();
}
public bool istargetToLookLocated ()
{
return playerCameraManager.istargetToLookLocated ();
}
public Transform getCurrentTargetToLook ()
{
return playerCameraManager.getCurrentTargetToLook ();
}
public Vector3 getOriginalLockedCameraPivotPosition ()
{
return playerCameraManager.getOriginalLockedCameraPivotPosition ();
}
public void setCheckToKeepWeaponAfterAimingWeaponFromShootingState (bool state)
{
checkToKeepWeaponAfterAimingWeaponFromShooting = state;
if (!checkToKeepWeaponAfterAimingWeaponFromShooting) {
lastTimeCheckToKeepWeapon = Time.time;
}
}
public bool isCheckToKeepWeaponAfterAimingWeaponFromShooting ()
{
return checkToKeepWeaponAfterAimingWeaponFromShooting;
}
public void setLookAlwaysInCameraDirectionState (bool state)
{
lookAlwaysInCameraDirection = state;
}
public bool isLookAlwaysInCameraDirectionActive ()
{
return lookAlwaysInCameraDirection;
}
public void setOriginalLookAlwaysInCameraDirectionState ()
{
if (fullBodyAwarenessActive) {
setLookAlwaysInCameraDirectionState (true);
return;
}
setLookAlwaysInCameraDirectionState (originalLookAlwaysInCameraDirection);
}
public void setLookInCameraDirectionIfLookingAtTargetState (bool state)
{
lookInCameraDirectionIfLookingAtTarget = state;
}
public void setLookOnlyIfMovingState (bool state)
{
lookOnlyIfMoving = state;
}
public void setOriginalLookOnlyIfMovingState ()
{
if (fullBodyAwarenessActive) {
setLookOnlyIfMovingState (false);
return;
}
setLookOnlyIfMovingState (originalLookOnlyIfMoving);
}
public void activateOrDeactivateStrafeModeDuringActionSystem (bool state)
{
if (state) {
activateStrafeMode ();
} else {
deactivateStrafeMode ();
}
}
public void activateOrDeactivateStrafeMode (bool state)
{
if (!state) {
if (fullBodyAwarenessActive) {
strafeModeActivatedExternally = false;
return;
}
}
if (state) {
activateStrafeMode ();
} else {
deactivateStrafeMode ();
}
strafeModeActivatedExternally = state;
}
public void activateStrafeMode ()
{
setLookAlwaysInCameraDirectionState (true);
setLookOnlyIfMovingState (false);
}
public void deactivateStrafeMode ()
{
setOriginalLookAlwaysInCameraDirectionState ();
setOriginalLookOnlyIfMovingState ();
}
public void setZeroGravityModeOnState (bool state)
{
zeroGravityModeOn = state;
if (zeroGravityModeOn) {
if (pushPlayerWhenZeroGravityModeIsEnabled) {
useJumpPlatform (pushZeroGravityEnabledAmount * playerTransformUp, ForceMode.Impulse);
}
if (!playerOnGround) {
setCheckOnGrundStatePausedFFOrZGState (true);
}
} else {
setCheckOnGrundStatePausedFFOrZGState (false);
}
movingVertically = false;
setLastTimeFalling ();
IKSystemManager.setIKBodyState (zeroGravityModeOn, "Zero Gravity Mode");
setFootStepManagerState (zeroGravityModeOn);
checkOtherStatesOnAirID (state);
ignoreSetCheckOnGrundStatePausedFFOrZGStateActive = false;
}
public void setPushPlayerWhenZeroGravityModeIsEnabledState (bool state)
{
pushPlayerWhenZeroGravityModeIsEnabled = state;
}
public bool isPlayerOnZeroGravityMode ()
{
return zeroGravityModeOn;
}
public void changeZeroGravityMovementVelocity (bool value)
{
if (value) {
currentZeroGravitySpeedMultiplier = zeroGravitySpeedMultiplier;
playerCameraManager.changeCameraFov (true);
} else {
currentZeroGravitySpeedMultiplier = 1;
playerCameraManager.changeCameraFov (false);
}
movementSpeedIncreased = value;
}
public void setCheckOnGrundStatePausedFFOrZGState (bool state)
{
if (state) {
if ((zeroGravityModeOn && pauseCheckOnGroundStateZG) || (freeFloatingModeOn && pauseCheckOnGroundStateFF)) {
checkOnGroundStatePausedFFOrZG = state;
}
} else {
checkOnGroundStatePausedFFOrZG = state;
}
}
public void setIgnoreSetCheckOnGrundStatePausedFFOrZGStateActive (bool state)
{
ignoreSetCheckOnGrundStatePausedFFOrZGStateActive = state;
}
public void setcheckOnGroundStatePausedState (bool state)
{
checkOnGroundStatePaused = state;
}
public bool isPauseCheckOnGroundStateZGActive ()
{
return pauseCheckOnGroundStateZG;
}
public void setfreeFloatingModeOnState (bool state)
{
freeFloatingModeOn = state;
if (freeFloatingModeOn) {
useJumpPlatform (playerTransformUp * pushFreeFloatingModeEnabledAmount, ForceMode.Force);
if (!playerOnGround) {
setCheckOnGrundStatePausedFFOrZGState (true);
}
} else {
setCheckOnGrundStatePausedFFOrZGState (false);
}
setLastTimeFalling ();
movingVertically = false;
playerCameraManager.changeCameraFov (false);
IKSystemManager.setIKBodyState (freeFloatingModeOn, "Free Floating Mode");
setFootStepManagerState (freeFloatingModeOn);
checkOtherStatesOnAirID (state);
}
public void enableOrDisableIKSystemManagerState (bool state)
{
IKSystemManager.enableOrDisableIKSystemManagerState (state);
}
public void setIKBodyPausedState (bool state)
{
IKSystemManager.setIKBodyPausedState (state);
}
public bool isPlayerOnFreeFloatingMode ()
{
return freeFloatingModeOn;
}
public void changeFreeFloatingMovementVelocity (bool value)
{
if (value) {
currentFreeFloatingSpeedMultiplier = freeFloatingSpeedMultiplier;
playerCameraManager.changeCameraFov (true);
} else {
currentFreeFloatingSpeedMultiplier = 1;
playerCameraManager.changeCameraFov (false);
}
movementSpeedIncreased = value;
}
public void changeSprintFovThirdPerson (bool value)
{
if (value) {
playerCameraManager.changeCameraFov (true);
} else {
playerCameraManager.changeCameraFov (false);
}
}
public bool isPlayerOnFFOrZeroGravityModeOn ()
{
return zeroGravityModeOn || freeFloatingModeOn;
}
public bool isMovementSpeedIncreased ()
{
return movementSpeedIncreased;
}
public float getCharacterHeight ()
{
return originalHeight;
}
public float getVerticalSpeed ()
{
return playerTransform.InverseTransformDirection (mainRigidbody.linearVelocity).y;
}
public float getCurrentSurfaceHitAngle ()
{
return hitAngle;
}
public void setWalkSpeedValue (float newValue)
{
walkSpeed = Mathf.Clamp (newValue, 0, 1);
}
public void setOriginalWalkSpeed ()
{
setWalkSpeedValue (originalWalkSpeedValue);
}
public void setWalkByDefaultState (bool state)
{
if (state) {
setWalkSpeedValue (half);
} else {
setWalkSpeedValue (1);
}
}
public void setIncreaseMovementSpeedState (bool state)
{
if (state) {
setWalkSpeedValue (increaseWalkSpeedValue);
} else {
setWalkSpeedValue (originalWalkSpeedValue);
}
}
public void setIncreaseWalkSpeedValue (float newValue)
{
increaseWalkSpeedValue = newValue;
if (increaseWalkSpeedValue < originalWalkSpeedValue) {
increaseWalkSpeedActive = true;
} else {
increaseWalkSpeedActive = false;
}
}
public void setIncreaseWalkSpeedEnabled (bool state)
{
increaseWalkSpeedEnabled = state;
increaseWalkSpeedActive = false;
}
public void setOriginalIncreaseWalkSpeedEnabledValue ()
{
setIncreaseWalkSpeedEnabled (originalIncreaseWalkSpeedEnabledValue);
}
public void setNewStationaryTurnSpeedValue (float newValue)
{
stationaryTurnSpeed = newValue;
}
public void setOriginalStationaryTurnSpeed ()
{
setNewStationaryTurnSpeedValue (originalStationaryTurnSpeed);
}
public void setStairsValues (float stairsMin, float stairsMax, float stairsAdherence)
{
currentStairAdherenceSystemMinValue = stairsMin;
currentStairAdherenceSystemMaxValue = stairsMax;
currentStairAdherenceSystemAdherenceValue = stairsAdherence;
}
bool usingExternalCharacterMeshList;
public List<GameObject> externalCharacterMeshList = new List<GameObject> ();
public void setUsingExternalCharacterMeshListState (bool state)
{
usingExternalCharacterMeshList = state;
}
public void setExternalCharacterMeshList (List<GameObject> newList)
{
externalCharacterMeshList = newList;
}
public void setCharacterMeshGameObjectStateOnlyIfThirdPersonActive (bool state)
{
if (firstPersonActive) {
return;
}
setCharacterMeshGameObjectState (state);
}
public void setExternalCharacterMeshListGameObjectState (bool state)
{
if (usingExternalCharacterMeshList) {
int externalCharacterMeshListCount = externalCharacterMeshList.Count;
if (externalCharacterMeshListCount > 0) {
for (int i = 0; i < externalCharacterMeshListCount; i++) {
if (externalCharacterMeshList [i] != null && externalCharacterMeshList [i].activeSelf != state) {
externalCharacterMeshList [i].SetActive (state);
}
}
}
}
}
public void setCharacterMeshGameObjectState (bool state)
{
if (!checkCharacterMeshIfGeneratedOnStartInitialized) {
if (checkCharacterMeshIfGeneratedOnStart) {
Transform objectToCheckCharacterIfGeneratedOnStartTransform = objectToCheckCharacterIfGeneratedOnStart.transform;
int count = objectToCheckCharacterIfGeneratedOnStartTransform.childCount;
for (int i = 0; i < count; i++) {
Transform child = objectToCheckCharacterIfGeneratedOnStartTransform.GetChild (i);
if (child != null) {
if (child.GetComponent<SkinnedMeshRenderer> () != null) {
extraCharacterMeshGameObject.Add (child.gameObject);
}
}
}
}
checkCharacterMeshIfGeneratedOnStartInitialized = true;
}
if (usingExternalCharacterMeshList) {
setExternalCharacterMeshListGameObjectState (state);
} else {
if (characterMeshGameObject != null) {
if (characterMeshGameObject.activeSelf != state) {
characterMeshGameObject.SetActive (state);
}
}
int extraCharacterMeshGameObjectCount = extraCharacterMeshGameObject.Count;
if (extraCharacterMeshGameObjectCount > 0) {
for (int i = 0; i < extraCharacterMeshGameObjectCount; i++) {
if (extraCharacterMeshGameObject [i] != null && extraCharacterMeshGameObject [i].activeSelf != state) {
extraCharacterMeshGameObject [i].SetActive (state);
}
}
}
}
if (useEventsOnEnableDisableCharacterMeshes) {
if (Application.isPlaying) {
if (state) {
eventOnEnableCharacterMeshes.Invoke ();
} else {
eventOnDisableCharacterMeshes.Invoke ();
}
} else {
if (state) {
eventOnEnableCharacterMeshesOnEditor.Invoke ();
} else {
eventOnDisableCharacterMeshesOnEditor.Invoke ();
}
}
}
}
public void setCharacterMeshesListToDisableOnEventState (bool state)
{
characterMeshesListToDisableOnEvent.Invoke (state);
}
public void setUsingGenericModelActiveState (bool state)
{
usingGenericModelActive = state;
}
public bool isUsingGenericModelActive ()
{
return usingGenericModelActive;
}
public void setExtraHeightDiffRaycastRadius (float newValue)
{
extraHeightDiffRaycastRadius = newValue;
}
public void setCustomMaxStepHeight (float newValue)
{
customMaxStepHeight = newValue;
}
public void setNewRayDistance (float newValue)
{
rayDistance = newValue;
}
public void setOriginalRayDistance ()
{
setNewRayDistance (originalRayDistance);
}
public Transform getGravityCenter ()
{
return gravityManager.getGravityCenter ();
}
public bool isUsingRegularGravity ()
{
return gravityManager.isUsingRegularGravity ();
}
public GameObject getCharacterMeshGameObject ()
{
return characterMeshGameObject;
}
public Transform getCharacterHumanBone (HumanBodyBones boneToFind)
{
return animator.GetBoneTransform (boneToFind);
}
public Transform getRightHandTransform ()
{
Transform rightHandTransform = getCharacterHumanBone (HumanBodyBones.RightHand);
if (rightHandTransform != null) {
return rightHandTransform;
} else {
return weaponsManager.getRightHandTransform ();
}
}
public Transform getLeftHandTransform ()
{
Transform leftHandTransform = getCharacterHumanBone (HumanBodyBones.LeftHand);
if (leftHandTransform != null) {
return leftHandTransform;
} else {
return weaponsManager.getLeftHandTransform ();
}
}
public bool checkPlayerIsNotCarringWeapons ()
{
if (weaponsManagerLocated) {
return weaponsManager.checkPlayerIsNotCarringWeapons ();
}
return false;
}
public Animator getCharacterAnimator ()
{
return animator;
}
public void setAnimatorState (bool state)
{
animator.enabled = state;
}
public void resetAnimator ()
{
if (playerCameraManager.isFullBodyAwarenessEnabled ()) {
return;
}
resetAndRebindAnimator ();
}
public void resetAnimatorEvenIfFullBodyAwarenessActive ()
{
resetAndRebindAnimator ();
}
void resetAndRebindAnimator ()
{
animator.Rebind ();
animator.Update (0f);
}
public void setAnimatorUnscaledTimeState (bool state)
{
if (state) {
animator.updateMode = AnimatorUpdateMode.UnscaledTime;
} else {
animator.updateMode = AnimatorUpdateMode.Normal;
}
}
public void playerCrossFadeInFixedTime (string actionName)
{
animator.CrossFadeInFixedTime (actionName, updateSetFloatAnimatorSpeed);
}
public void setAnimatorLayerWeight (string animatorLayerName, float animatorLayerWeight)
{
animator.SetLayerWeight (animator.GetLayerIndex (animatorLayerName), animatorLayerWeight);
}
public void enableAnimatorLayerWeight (string animatorLayerName)
{
setAnimatorLayerWeight (animatorLayerName, 1);
}
public void disableAnimatorLayerWeight (string animatorLayerName)
{
setAnimatorLayerWeight (animatorLayerName, 0);
}
public playerInputManager getPlayerInput ()
{
return playerInput;
}
public void set3dOr2_5dWorldType (bool movingOn3dWorld)
{
if (movingOn3dWorld) {
lockedPlayerMovement = lockedPlayerMovementMode.world3d;
} else {
lockedPlayerMovement = lockedPlayerMovementMode.world2_5d;
}
}
public void setMoveInXAxisOn2_5dState (bool state)
{
moveInXAxisOn2_5d = state;
}
public bool isMoveInXAxisOn2_5d ()
{
return moveInXAxisOn2_5d;
}
public bool isPlayerMovingOn3dWorld ()
{
return lockedPlayerMovement == lockedPlayerMovementMode.world3d;
}
public bool isPlayerMovingOn2_5dWorld ()
{
return lockedPlayerMovement == lockedPlayerMovementMode.world2_5d;
}
public bool isPlayerLookingAtRightOn2_5d ()
{
if (isPlayerMovingOn2_5dWorld ()) {
float angle = Vector3.SignedAngle (playerTransform.forward, currentLockedCameraTransform.right, playerTransform.up);
if (Mathf.Abs (angle) < 10) {
return true;
}
}
return false;
}
public void setFollowSplinePathActiveState (bool state)
{
followSplinePathActive = state;
}
public bool isPlayerSetAsChildOfParent ()
{
return playerSetAsChildOfParent;
}
public Rigidbody getRigidbody ()
{
return mainRigidbody;
}
public void setPlayerSetAsChildOfParentState (bool state)
{
playerSetAsChildOfParent = state;
}
public void setHeadTrackCanBeUsedState (bool state)
{
headTrackCanBeUsed = state;
}
public bool canHeadTrackBeUsed ()
{
return headTrackCanBeUsed;
}
public void setAddExtraRotationPausedState (bool state)
{
addExtraRotationPaused = state;
}
public void setAutoTurnSpeed (float newValue)
{
autoTurnSpeed = newValue;
}
public void setAimTurnSpeed (float newValue)
{
aimTurnSpeed = newValue;
}
public void updateLandMark ()
{
landMarkRayPosition = playerTransform.position;
landMarkRayDirection = -playerTransformUp;
if (gravityManager.isPlayerSearchingGravitySurface ()) {
landMarkRayPosition = mainCameraTransform.position;
landMarkRayDirection = mainCameraTransform.forward;
}
if (zeroGravityModeOn && useGravityDirectionLandMark) {
if (firstPersonActive) {
landMarkRayPosition = mainCameraTransform.position;
landMarkRayDirection = mainCameraTransform.forward;
} else {
landMarkRayPosition = forwardSurfaceRayPosition.position;
landMarkRayDirection = forwardSurfaceRayPosition.forward;
}
currentMaxLandDistance = maxDistanceToAdjust;
} else {
currentMaxLandDistance = maxLandDistance;
}
if (!playerOnGround && canMove) {
if (flyModeActive || swimModeActive) {
if (landMark.activeSelf) {
landMark.SetActive (false);
}
} else {
if (Physics.Raycast (landMarkRayPosition, landMarkRayDirection, out hit, currentMaxLandDistance, layer)) {
if (hit.distance >= minDistanceShowLandMark) {
if (!landMark.activeSelf) {
landMark.SetActive (true);
}
landMark.transform.position = hit.point + 0.08f * hit.normal;
landMarkForwardDirection = Vector3.Cross (landMark.transform.right, hit.normal);
landMarkTargetRotation = Quaternion.LookRotation (landMarkForwardDirection, hit.normal);
landMark.transform.rotation = landMarkTargetRotation;
landMark1.transform.Rotate (0, 100 * currentUpdateDeltaTime, 0);
landMark2.transform.Rotate (0, -100 * currentUpdateDeltaTime, 0);
} else {
if (landMark.activeSelf) {
landMark.SetActive (false);
}
}
} else {
if (zeroGravityModeOn && useGravityDirectionLandMark) {
if (landMark.activeSelf) {
landMark.SetActive (false);
}
} else {
if (landMark.activeSelf) {
landMark.SetActive (false);
}
}
}
}
} else {
if (landMark.activeSelf) {
landMark.SetActive (false);
}
}
}
public void setUseLandMarkState (bool state)
{
useLandMark = state;
}
public void rotateCharacterTowardDirection (Transform directionTransform, float minRotationAngle, float minRotationAmount, float maxRotationAmount)
{
stopRotateCharacterTowardDirectionCoroutine ();
rotateCharacterCoroutine = StartCoroutine (rotateCharacterTowardDirectionCoroutine (directionTransform, minRotationAngle, minRotationAmount, maxRotationAmount));
}
public void stopRotateCharacterTowardDirectionCoroutine ()
{
if (rotateCharacterCoroutine != null) {
StopCoroutine (rotateCharacterCoroutine);
}
actionActiveWithMovement = false;
applyRootMotionAlwaysActive = false;
actionActive = false;
lastTimeActionActive = Time.time;
setCanMoveState (true);
}
IEnumerator rotateCharacterTowardDirectionCoroutine (Transform directionTransform, float minRotationAngle, float minRotationAmount, float maxRotationAmount)
{
float timer = 0;
bool targetReached = false;
actionActiveWithMovement = true;
applyRootMotionAlwaysActive = true;
actionActive = true;
setCanMoveState (false);
resetPlayerControllerInput ();
resetOtherInputFields ();
while (!targetReached) {
float newTurnAmount = 0;
float angle = Vector3.SignedAngle (playerTransformForward, directionTransform.forward, playerTransformUp);
if (Mathf.Abs (angle) > minRotationAngle) {
newTurnAmount = angle * Mathf.Deg2Rad;
newTurnAmount = Mathf.Clamp (newTurnAmount, -maxRotationAmount, maxRotationAmount);
} else {
newTurnAmount = 0;
}
float turnAmountToApply = newTurnAmount;
if (turnAmountToApply < 0) {
if (turnAmountToApply > -minRotationAmount) {
turnAmountToApply = -minRotationAmount;
}
} else {
if (turnAmountToApply < minRotationAmount) {
turnAmountToApply = minRotationAmount;
}
}
setOverrideTurnAmount (turnAmountToApply, true);
timer += Time.deltaTime;
if (newTurnAmount == 0) {
targetReached = true;
setOverrideTurnAmount (0, false);
}
yield return null;
}
stopRotateCharacterTowardDirectionCoroutine ();
}
bool turnBasedCombatActionActive;
public bool isTurnBasedCombatActionActive ()
{
return turnBasedCombatActionActive;
}
public void setTurnBasedCombatActionActiveState (bool state)
{
turnBasedCombatActionActive = state;
}
public bool isTerrainDetected ()
{
return terrainDetected;
}
public void setTerrainDetectedState (bool state)
{
terrainDetected = state;
}
public void destroyCharacterAtOnce ()
{
Destroy (playerManagersParentGameObject);
Destroy (playerCameraGameObject);
Destroy (gameObject);
}
//EDITOR FUNCTIONS
public void setCharacterMeshGameObject (GameObject characterMesh)
{
characterMeshGameObject = characterMesh;
updateComponent ();
}
public void setStrafeModeFromEditor (bool state)
{
setLookAlwaysInCameraDirectionState (state);
setLookOnlyIfMovingState (false);
updateComponent ();
}
public void setCrouchSlidingEnabledStateFromEditor (bool state)
{
setCrouchSlidingEnabledState (state);
updateComponent ();
}
public void setAirDashEnabledStateFromEditor (bool state)
{
setAirDashEnabledState (state);
updateComponent ();
}
public void setWallRunningEnabledStateFromEditor (bool state)
{
wallRunningEnabled = state;
updateComponent ();
}
public void setUseObstacleDetectionToAvoidMovementStateFromEditor (bool state)
{
setUseObstacleDetectionToAvoidMovementState (state);
updateComponent ();
}
public void setCheckQuickMovementTurn180DegreesOnRunStateFromEditor (bool state)
{
setCheckQuickMovementTurn180DegreesOnRunState (state);
updateComponent ();
}
public void enableOrDisableDoubleJumpFromEditor (bool state)
{
enableOrDisableDoubleJump (state);
updateComponent ();
}
public void setUseLandMarkStateFromEditor (bool state)
{
setUseLandMarkState (state);
updateComponent ();
}
public void setSprintEnabledStateFromEditor (bool state)
{
setSprintEnabledState (state);
updateComponent ();
}
void updateComponent ()
{
GKC_Utils.updateComponent (this);
GKC_Utils.updateDirtyScene ("Update Player Controller", gameObject);
}
#if UNITY_EDITOR
//Draw gizmos
void OnDrawGizmos ()
{
if (!showGizmo) {
return;
}
if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) {
DrawGizmos ();
}
}
void OnDrawGizmosSelected ()
{
DrawGizmos ();
}
void DrawGizmos ()
{
if (showGizmo) {
if (playerTransform == null) {
playerTransform = transform;
}
if (useAutoCrouch) {
Gizmos.color = gizmoColor;
Vector3 position = autoCrouchRayPosition.position;
Gizmos.DrawSphere (position, gizmoRadius);
Gizmos.color = Color.white;
Gizmos.DrawLine (position, position + raycastDistanceToAutoCrouch * playerTransform.forward);
Gizmos.DrawSphere (position + secondRaycastOffset, gizmoRadius);
Gizmos.DrawLine (position + secondRaycastOffset, position + secondRaycastOffset + raycastDistanceToAutoCrouch * playerTransform.forward);
}
Debug.DrawRay (playerTransform.position + playerTransform.up, rayDistance * (-playerTransform.up), Color.white);
if (useSphereRaycastForGroundDetection) {
Gizmos.DrawSphere (currentPlayerPosition - sphereCastOffset * currentPlayerUp, sphereCastRadius);
}
showNewGroundAdherenceGizmo ();
}
}
void showNewGroundAdherenceGizmo ()
{
Vector3 localUp = playerTransform.up;
Gizmos.color = Color.green;
Vector3 bottom = transform.position + localUp * capsule.radius;
Vector3 top = transform.position + localUp * (capsule.height - capsule.radius);
Gizmos.DrawLine (bottom, top);
Gizmos.DrawWireSphere (bottom, capsule.radius);
Gizmos.DrawWireSphere (top, capsule.radius);
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere (dbgFuturePos, 0.05f);
if (dbgHasGroundHit) {
Gizmos.color = Color.red;
Gizmos.DrawSphere (dbgGroundHit.point, 0.06f);
Gizmos.DrawLine (playerTransform.position, dbgGroundHit.point);
Gizmos.color = Color.blue;
Gizmos.DrawLine (dbgGroundHit.point, dbgGroundHit.point + dbgGroundHit.normal);
UnityEditor.Handles.Label (dbgGroundHit.point + localUp * 0.2f,
$"Slope: {dbgSlopeAngle:F1}°");
}
//Gizmos.color = Color.cyan;
//Gizmos.DrawLine (playerTransform.position, playerTransform.position - localUp * stickToGroundDistance);
}
#endif
void updateAutoCrouchCheck ()
{
if (!crouching) {
if (!Physics.Raycast (autoCrouchRayPosition.position, playerTransformForward, raycastDistanceToAutoCrouch, layerToCrouch)) {
if (showGizmo) {
Debug.DrawRay (autoCrouchRayPosition.position, raycastDistanceToAutoCrouch * playerTransformForward, Color.white);
}
if (Physics.Raycast (autoCrouchRayPosition.position + secondRaycastOffset, playerTransformForward, raycastDistanceToAutoCrouch, layerToCrouch)) {
if (showGizmo) {
Debug.DrawRay (autoCrouchRayPosition.position + secondRaycastOffset, raycastDistanceToAutoCrouch * playerTransformForward, Color.red);
}
crouch ();
}
}
}
}
//check if the player is in the ground with a raycast
void checkOnGround ()
{
if (useNewGroundAdherenceEnabled) {
newCheckOnGroundAdherence ();
} else {
oldCheckOnGroundAdherence ();
}
}
void newCheckOnGroundAdherence ()
{
if (checkOnGroundPaused) {
if (currentSurfaceBelowPlayerLocated) {
currentSurfaceBelowPlayer = null;
currentSurfaceBelowPlayerLocated = false;
previousSurfaceBelowPlayer = null;
terrainDetected = false;
}
return;
}
if (pauseAllPlayerDownForces) {
return;
}
//START OF CHECK ON GROUND STATE
if (!gravityPowerActive && !usingJetpack && !flyModeActive && !swimModeActive && !externalControlBehaviorForAirTypeActive) {
currentPlayerPosition = playerTransform.position;
currentPlayerUp = playerTransform.up;
downSpeedValue = halfJumpPower;
if (downSpeedValue == 0) {
downSpeedValue = Mathf.Abs (gravityForce) * half;
}
if (playerTransform.InverseTransformDirection (mainRigidbody.linearVelocity).y < downSpeedValue) {
previouslyOnGround = playerOnGround;
setOnGroundState (false);
if (jump || slowingFall) {
if (!gravityForcePaused &&
!zeroGravityModeOn &&
!freeFloatingModeOn &&
!wallRunningActive &&
!pauseAllPlayerDownForces &&
!externalControlBehaviorForAirTypeActive) {
Vector3 totalAirForce = gravityForce * (mainRigidbody.mass * jumpMassMultiplier) * currentNormal;
mainRigidbody.AddForce (totalAirForce);
}
}
//check what it is under the player
mainRaycastPosition = currentPlayerPosition + currentPlayerUp;
hitAngle = 0;
groundPoint = vector3Zero;
mainHitPoint = currentPlayerPosition;
groundDetected = false;
if (Physics.Raycast (mainRaycastPosition, -currentPlayerUp, out mainGroundHit, rayDistance, layer)) {
groundDetected = true;
}
if (useSphereRaycastForGroundDetection) {
if (!groundDetected) {
if (Physics.Raycast (mainRaycastPosition, -currentPlayerUp, out temporalHit, rayDistance + 1.5f, layer)) {
float temporalHitDistance = temporalHit.distance;
if (temporalHitDistance < rayDistance + 0.2f) {
mainGroundHit = temporalHit;
groundDetected = true;
}
}
}
if (!groundDetected) {
sphereRaycastRay = new Ray (currentPlayerPosition - sphereCastOffset * currentPlayerUp, -currentPlayerUp);
if (Physics.SphereCast (sphereRaycastRay, sphereCastRadius, out sphereRaycastHit, maxDistanceSphereCast, layer)) {
groundDetected = true;
mainGroundHit = sphereRaycastHit;
if (showGizmo) {
Debug.DrawRay (mainGroundHit.point, 100 * Vector3.up, Color.black, 10);
}
bool nextSurfaceLocated = false;
Vector3 playerMovementDirection = 5 * mainRigidbody.linearVelocity;
playerMovementDirection.Normalize ();
Vector3 temporalRaycastPosition = currentPlayerPosition + 0.05f * playerMovementDirection + 0.1f * currentPlayerUp;
int temporalRaycastCheckAmount = 0;
while (!nextSurfaceLocated) {
if (Physics.Raycast (temporalRaycastPosition, -currentPlayerUp, out sphereRaycastHit, 0.17f, layer)) {
mainGroundHit = sphereRaycastHit;
nextSurfaceLocated = true;
} else {
temporalRaycastPosition += 0.03f * playerMovementDirection;
temporalRaycastCheckAmount++;
if (showGizmo) {
Debug.DrawRay (temporalRaycastPosition, 100 * Vector3.up, Color.yellow, 10);
}
}
if (temporalRaycastCheckAmount >= 5) {
nextSurfaceLocated = true;
groundDetected = false;
}
}
}
}
if (!groundDetected) {
if (Physics.Raycast (mainRaycastPosition, -currentPlayerUp, out temporalHit, rayDistance + 1.5f, layer)) {
float temporalHitDistance = temporalHit.distance;
if (previouslyOnGround) {
if (temporalHitDistance < rayDistance + maxExtraRaycastDistanceToGroundDetection) {
mainGroundHit = temporalHit;
groundDetected = true;
}
}
}
}
}
if (groundDetected) {
//get the angle of the current surface
hitAngle = Vector3.Angle (currentNormal, mainGroundHit.normal);
canSetGroundState = false;
//check max angle between the ground and the player if he is on zero gravity or free floating mode
if ((freeFloatingModeOn || zeroGravityModeOn) && !checkOnGroundStatePausedFFOrZG && !previouslyOnGround) {
if (useMaxAngleToCheckOnGroundStateZGFF) {
if (hitAngle < maxAngleToChekOnGroundStateZGFF) {
canSetGroundState = true;
}
} else {
canSetGroundState = true;
}
} else {
canSetGroundState = true;
}
if (zeroGravityModeOn && ignoreSetCheckOnGrundStatePausedFFOrZGStateActive) {
canSetGroundState = true;
}
if (canSetGroundState) {
setOnGroundState (true);
}
jump = false;
slowingFall = false;
slowFallExternallyActive = false;
groundPoint = mainGroundHit.point;
currentSurfaceBelowPlayer = mainGroundHit.collider.transform;
currentSurfaceBelowPlayerLocated = true;
currentNumberOfDash = 0;
distanceToGround = mainGroundHit.distance;
if (!useSphereRaycastForGroundDetection) {
distanceToGround -= 1;
}
mainHitPoint = groundPoint;
mainHitAngle = hitAngle;
if (checkIfSurfaceBelowIsTerrainEnabled) {
if (previousSurfaceBelowPlayer != currentSurfaceBelowPlayer) {
previousSurfaceBelowPlayer = currentSurfaceBelowPlayer;
terrainDetected = previousSurfaceBelowPlayer.GetComponent<Terrain> ();
}
}
} else {
if (currentSurfaceBelowPlayerLocated) {
currentSurfaceBelowPlayer = null;
currentSurfaceBelowPlayerLocated = false;
previousSurfaceBelowPlayer = null;
terrainDetected = false;
}
}
if (useMaxWalkSurfaceAngle && !stairStepDetected) {
if (playerOnGround && hitAngle > maxWalkSurfaceAngle && (!useMaxDistanceToCheckSurfaceAngle || distanceToGround > maxDistanceToCheckSurfaceAngle)) {
if (lastTimeMaxWalkSurfaceAngleLocated == 0) {
lastTimeMaxWalkSurfaceAngleLocated = Time.time;
} else if (Time.time > lastTimeMaxWalkSurfaceAngleLocated + 0.3f) {
setOnGroundState (false);
}
} else {
lastTimeMaxWalkSurfaceAngleLocated = 0;
}
}
//new checks for the new ground adherence
//check if the player has to adhere to the surface or not
adhereToGround = false;
if (playerOnGround) {
adhereToGround = true;
}
//ignore to adhere to the ground below if the player is rotating to a different gravity direction
if (lockedCameraActive) {
if (isPlayerMovingOn2_5dWorld ()) {
if (characterRotatingToSurface) {
adhereToGround = false;
}
}
}
//the player has to adhere to the current surface, so
if (adhereToGround) {
//check what states should allow the adhere to ground
inputDir = GetInputDirection ();
stickToGroundOnIdleResult = true;
bool pressingInput = isPlayerUsingInput ();
//if the player is not moving and the angle of the surface is 0, adhere to it, so if the player jumps for example, the player is correctly
//placed in the ground, with out a gap between the player's collider and the ground
if (useTankControls) {
pressingInput = isPlayerUsingVerticalInput ();
}
if ((pressingInput && isPlayerMoving (0.1f)) || (!pressingInput && isPlayerMoving (0.4f))) {
stickToGroundOnIdleResult = false;
}
//add a check to avoid movement from input axis at the end of an action system
//during the transition to the movement state machine
if (actionActive) {
if (!canMove) {
checkingLastTimeActionActiveAndCantMove = true;
} else {
checkingLastTimeActionActiveAndCantMove = false;
}
} else {
if (checkingLastTimeActionActiveAndCantMove) {
if (Time.time > lastTimeActionActive + 0.3f) {
checkingLastTimeActionActiveAndCantMove = false;
}
}
}
//Maybe check if an action is active and using movement or forces, to avoid to stick to the ground
if (stickToGroundOnIdleResult) {
StickToGroundIdle (true, false, false);
} else {
TryMove (inputDir);
}
}
//END OF CHECK ON GROUND STATE
if (showGizmo) {
Debug.DrawLine (currentPlayerPosition + (4 * currentPlayerUp), adherenceHit.point, Color.black);
}
if (playerOnGround) {
if (useAutoCrouch) {
updateAutoCrouchCheck ();
}
}
}
if (!playerOnGround) {
lastTimeAir = Time.time;
}
} else {
setOnGroundState (false);
}
}
public void setIgnoreNewGroundAdherenceActiveState (bool state)
{
ignoreNewGroundAdherenceActive = state;
}
Vector3 GetInputDirection ()
{
if (lockedCameraActive && useRelativeMovementToLockedCamera && !usedByAI) {
currentAdherenceInput = lockedCameraMoveInput;
} else {
currentAdherenceInput = currentMoveInput;
}
return currentAdherenceInput * raycastPositionRange;
}
void TryMove (Vector3 moveDirectionInput)
{
if (ignoreNewGroundAdherenceActive) {
return;
}
//add also a check for the input values
float dt = Time.fixedDeltaTime;
Vector3 localUp = playerTransform.up;
//add a check for the different view types, first or third person and the locked cameras
if (!playerCameraManager.is2_5ViewActive ()) {
if (useTankControls) {
if (!playerIsAiming && !isPlayerUsingVerticalInput ()) {
StickToGroundIdle (false, true, false);
return;
}
}
}
Vector3 mainMovementDirection = moveDirectionInput.normalized;
//if (usedByAI || (hitAngle > minAngleToUsedInputNormalized) || (walkSpeed <= 0.5f)) {
// moveDirectionInput = moveDirectionInput.normalized;
//}
if (hitAngle > minAngleToUsedInputNormalized) {
moveDirectionInput = moveDirectionInput.normalized;
}
if (!actionActive) {
if (checkingLastTimeActionActiveAndCantMove) {
moveDirectionInput /= 20;
}
}
Vector3 desiredMove = moveDirectionInput * dt;
Vector3 futurePos = playerTransform.position + desiredMove;
dbgFuturePos = futurePos;
futureHasGround = TryGetGroundAtPosition (futurePos, localUp, out RaycastHit groundHit);
dbgHasGroundHit = futureHasGround;
dbgGroundHit = groundHit;
dbgSlopeAngle = 0f;
groundHeightDifference = 0f;
float slopeAngle = 0;
//tryMoveValue = 0;
float capsuleRadius = capsule.radius;
if (usingGenericModelActive) {
if (characterRadius > 0) {
capsuleRadius = characterRadius;
}
}
float currentHeightDiffRaycastRadius = heightDiffRaycastRadius;
if (extraHeightDiffRaycastRadius > 0) {
currentHeightDiffRaycastRadius += extraHeightDiffRaycastRadius;
}
float currentMaxStepHeight = maxStepHeight;
if (customMaxStepHeight > 0) {
currentMaxStepHeight = customMaxStepHeight;
}
//add a check for max slope to prevent movement into that direction, using stick to ground instead
if (futureHasGround) {
Vector3 surfaceInFront = playerTransform.position + mainMovementDirection * (currentHeightDiffRaycastRadius + 0.3f);
if (TryGetGroundAtPosition (surfaceInFront, localUp, out RaycastHit futureGroundHit)) {
futureSurfaceAngle = Vector3.Angle (futureGroundHit.normal, localUp);
if (futureSurfaceAngle > maxSlopeAngle) {
movingTowardWall = false;
//add a check to see if the surface is an actual wall that should
//stop movement by just collision and not stick to ground
groundHeightDifference = Vector3.Dot (futureGroundHit.point - playerTransform.position, localUp);
float heightDiffABS = Mathf.Abs (groundHeightDifference);
if (heightDiffABS > currentMaxStepHeight) {
movingTowardWall = true;
} else {
if (Physics.SphereCast (playerTransform.position + capsule.center, originalRadius,
mainMovementDirection, out RaycastHit hitInFront, capsuleRadius + 0.5f, layer)) {
movingTowardWall = true;
}
}
StickToGroundIdle (false, true, movingTowardWall);
return;
}
}
}
if (futureHasGround) {
//calculate height from the ground to the player pivot position
groundHeightDifference = Vector3.Dot (groundHit.point - playerTransform.position, localUp);
float heightDiffABS = Mathf.Abs (groundHeightDifference);
slopeAngle = Vector3.Angle (groundHit.normal, localUp);
float slopeAngleABS = Mathf.Abs (slopeAngle);
//check to avoid this if the character is moving on a slope
stepsDetected = false;
//maybe launch a raycast in the movement slope direction to check for possible steps
Vector3 raycastPosition = playerTransform.position + localUp * checkStepRaycastHeight;
Vector3 raycastDirection = mainMovementDirection;
//tryMoveValue = 1;
if (slopeAngleABS > 2) {
if (lastTimeStepDetected == 0) {
raycastDirection = Vector3.ProjectOnPlane (mainMovementDirection, groundHit.normal).normalized;
if (showGizmo) {
Debug.DrawRay (raycastPosition, raycastDirection * 3, Color.black);
}
if (Physics.Raycast (raycastPosition, raycastDirection, out RaycastHit hitInFront, capsuleRadius + checkStepRaycastDistance, layer)) {
float futureStepAngle = Vector3.Angle (hitInFront.normal, localUp);
float futureStepAngleABS = Mathf.Abs (futureStepAngle);
if (futureStepAngleABS > maxSlopeAngle || futureStepAngleABS > 60) {
stepsDetected = true;
lastTimeStepDetected = Time.time;
}
}
} else {
if (Time.time > lastTimeStepDetected + durationToWalkToStep) {
lastTimeStepDetected = 0;
} else {
stepsDetected = true;
}
}
} else {
//maybe check a delay to use this check as true for x amount of time to climb into the step if it goes up
if (lastTimeStepDetected == 0) {
if (showGizmo) {
Debug.DrawRay (raycastPosition, raycastDirection * (capsuleRadius + checkStepRaycastDistance), Color.black);
}
if (Physics.Raycast (raycastPosition, raycastDirection, out RaycastHit hitInFront, capsuleRadius + checkStepRaycastDistance, layer)) {
if (groundHeightDifference < 0.01f) {
stepsDetected = true;
lastTimeStepDetected = Time.time;
}
}
} else {
if (Time.time > lastTimeStepDetected + durationToWalkToStep) {
lastTimeStepDetected = 0;
} else {
stepsDetected = true;
}
}
}
if (stepsDetected) {
Vector3 surfaceInFront = playerTransform.position + mainMovementDirection * currentHeightDiffRaycastRadius;
futureHasGround = TryGetGroundAtPosition (surfaceInFront, localUp, out groundHit);
dbgHasGroundHit = futureHasGround;
dbgGroundHit = groundHit;
groundHeightDifference = Vector3.Dot (groundHit.point - playerTransform.position, localUp);
if (showGizmo) {
Debug.DrawLine (groundHit.point, groundHit.point + localUp * 5, Color.red);
}
slopeAngle = Vector3.Angle (groundHit.normal, localUp);
//tryMoveValue = 2;
}
movementDirection = raycastDirection;
}
//check if the slope is high enough to avoid movement on that direction
if (futureHasGround) {
dbgSlopeAngle = slopeAngle;
if (slopeAngle > maxSlopeAngle) {
//tryMoveValue = 3;
return;
}
}
//allow movement
Vector3 newPos = playerTransform.position + desiredMove;
if (!actionActive) {
if (checkingLastTimeActionActiveAndCantMove) {
newPos = playerTransform.position;
}
}
//a surface in the future movement direction was found, so adjust player position to that position
if (futureHasGround) {
//tryMoveValue = 4;
movingOnSlopeUp = false;
movingOnSlopeDown = false;
if (slopeAngle > 1) {
float movementAngle = Vector3.Angle (movementDirection, localUp);
if (movementAngle > 90) {
movingOnSlopeDown = true;
} else {
movingOnSlopeUp = true;
}
}
if (groundHeightDifference > 0f && groundHeightDifference <= currentMaxStepHeight) {
//go up
newPos = Vector3.Lerp (newPos, playerTransform.position + localUp * groundHeightDifference, groundLerpSpeed * dt);
isGrounded = true;
//tryMoveValue = 5;
} else if (groundHeightDifference < 0f && Mathf.Abs (groundHeightDifference) <= currentMaxStepHeight) {
//go down
newPos = Vector3.Lerp (newPos, playerTransform.position + localUp * groundHeightDifference, groundLerpSpeed * dt);
isGrounded = true;
//tryMoveValue = 6;
} else if (Mathf.Abs (groundHeightDifference) > currentMaxStepHeight) {
isGrounded = false;
//tryMoveValue = 7;
}
} else {
isGrounded = false;
//tryMoveValue = 8;
}
//check when the input axis is not pressed after release or is not fully pressed, to keep the position to adhere better
bool pressingInput = isPlayerUsingInput ();
if (!pressingInput && hitAngle == 0) {
//if no steps or slope is found, use the position below the player
if (!stepsDetected && !movingOnSlopeDown && !movingOnSlopeUp) {
newPos = mainHitPoint;
}
} else if (!pressingInput || (movingOnSlopeUp && hitAngle != 0 && !isPlayerMoving (0.99f)) || (movingOnSlopeDown && hitAngle != 0 && !isPlayerMoving (0.99f))) {
//if on a slope, check if moving up or down on it and the distance to the ground
bool sphereCastFound = false;
if (Physics.SphereCast (currentPlayerPosition + currentPlayerUp, originalRadius, -currentPlayerUp, out adherenceHit, 0.75f, layer)) {
if (showGizmo) {
Debug.DrawLine (currentPlayerPosition + currentPlayerUp, adherenceHit.point, Color.black);
}
sphereCastFound = true;
}
float heightDiffABS = Mathf.Abs (Vector3.Dot (mainHitPoint - playerTransform.position, localUp));
if (movingOnSlopeUp) {
if (heightDiffABS < 0.05f || sphereCastFound) {
newPos = currentPlayerPosition;
} else {
newPos = mainHitPoint;
}
} else if (movingOnSlopeDown) {
if (pressingInput) {
if (!isPlayerMoving (0.25f) && (sphereCastFound || heightDiffABS < 0.05f)) {
newPos = currentPlayerPosition;
}
} else {
if (sphereCastFound) {
if (heightDiffABS > 0.1f) {
if (Mathf.Abs (adherenceHit.distance) > heightDiffABS) {
newPos = currentPlayerPosition;
}
} else {
newPos = currentPlayerPosition;
}
} else {
if (heightDiffABS > 0.1f) {
if (Mathf.Abs (adherenceHit.distance) > heightDiffABS) {
newPos = currentPlayerPosition;
}
} else {
newPos = currentPlayerPosition;
}
}
}
}
}
//apply the position to the rigidbody
mainRigidbody.MovePosition (newPos);
}
bool TryGetGroundAtPosition (Vector3 samplePos, Vector3 localUp, out RaycastHit hitInfo)
{
float originHeight = capsule.height + 1f;
Vector3 origin = samplePos + localUp * originHeight;
float maxDist = originHeight + groundRaycastDistance;
if (Physics.Raycast (origin, -localUp, out RaycastHit hit, maxDist, layer)) {
hitInfo = hit;
return true;
}
hitInfo = new RaycastHit ();
return false;
}
void StickToGroundIdle (bool useMovePositionLerp, bool useFixedPositionBelowPlayer, bool movingTowardWall)
{
if (ignoreNewGroundAdherenceActive) {
return;
}
lastTimeStepDetected = 0;
Vector3 localUp = playerTransform.up;
//stickToGroundValue = 0;
if (TryGetGroundAtPosition (playerTransform.position, localUp, out RaycastHit groundHit)) {
//stickToGroundValue = 1;
groundHeightDifference = Vector3.Dot (groundHit.point - playerTransform.position, localUp);
float heightDiffABS = Mathf.Abs (groundHeightDifference);
//add checks to stick to the surfce below according to if the player is on a certain slope angle
currentPlayerPosition = playerTransform.position;
adjustPositionResult = false;
Vector3 targetPosition = groundHit.point;
//add a check for the surface below, to check its angle
if (hitAngle < 1) {
adjustPositionResult = true;
} else {
float currentMaxStepHeight = maxStepHeight;
if (customMaxStepHeight > 0) {
currentMaxStepHeight = customMaxStepHeight;
}
if (heightDiffABS <= currentMaxStepHeight) {
//on terrain, maybe add a check for a higher distance or depending of the surface angle
bool surfaceFoundBySphereCastResult = false;
if (Physics.SphereCast (currentPlayerPosition + currentPlayerUp, originalRadius, -currentPlayerUp, out adherenceHit, raycastDistanceOnSphereCastOnIdle, layer)) {
if (showGizmo) {
Debug.DrawLine (currentPlayerPosition + currentPlayerUp, adherenceHit.point, Color.black);
}
surfaceFoundBySphereCastResult = true;
}
if (useFixedPositionBelowPlayer) {
if (heightDiffABS > 0.1f) {
adjustPositionResult = true;
} else {
if (surfaceFoundBySphereCastResult) {
adjustPositionResult = true;
targetPosition = currentPlayerPosition;
}
}
} else {
if (heightDiffABS > 0.1f) {
adjustPositionResult = true;
if (surfaceFoundBySphereCastResult) {
if (Mathf.Abs (adherenceHit.distance) > heightDiffABS) {
targetPosition = currentPlayerPosition;
}
}
} else {
if (surfaceFoundBySphereCastResult) {
adjustPositionResult = true;
targetPosition = currentPlayerPosition;
}
}
}
}
}
if (movingTowardWall) {
adjustPositionResult = true;
targetPosition = groundHit.point;
useMovePositionLerp = false;
}
if (adjustPositionResult) {
if (useMovePositionLerp) {
Vector3 pos = Vector3.Lerp (playerTransform.position, targetPosition, groundLerpSpeed * Time.fixedDeltaTime);
mainRigidbody.MovePosition (pos);
} else {
if (showGizmo) {
Debug.DrawRay (targetPosition, playerTransform.up * 100, Color.white);
}
mainRigidbody.MovePosition (targetPosition);
}
isGrounded = true;
//stickToGroundValue = 2;
} else {
isGrounded = false;
//stickToGroundValue = 3;
}
} else {
isGrounded = false;
//stickToGroundValue = 4;
}
}
//###############################################################################################################
//old ground adherence code, it will be revamped to make some improvements to the new method in another update
void oldCheckOnGroundAdherence ()
{
if (checkOnGroundPaused) {
if (currentSurfaceBelowPlayerLocated) {
currentSurfaceBelowPlayer = null;
currentSurfaceBelowPlayerLocated = false;
previousSurfaceBelowPlayer = null;
terrainDetected = false;
}
return;
}
if (pauseAllPlayerDownForces) {
return;
}
//START OF CHECK ON GROUND STATE
if (!gravityPowerActive && !usingJetpack && !flyModeActive && !swimModeActive && !externalControlBehaviorForAirTypeActive) {
currentPlayerPosition = playerTransform.position;
currentPlayerUp = playerTransform.up;
downSpeedValue = halfJumpPower;
if (downSpeedValue == 0) {
downSpeedValue = Mathf.Abs (gravityForce) * half;
}
if (playerTransform.InverseTransformDirection (mainRigidbody.linearVelocity).y < downSpeedValue) {
previouslyOnGround = playerOnGround;
setOnGroundState (false);
if (jump || slowingFall) {
if (!gravityForcePaused &&
!zeroGravityModeOn &&
!freeFloatingModeOn &&
!wallRunningActive &&
!pauseAllPlayerDownForces &&
!externalControlBehaviorForAirTypeActive) {
Vector3 totalAirForce = gravityForce * (mainRigidbody.mass * jumpMassMultiplier) * currentNormal;
mainRigidbody.AddForce (totalAirForce);
}
}
//check what it is under the player
mainRaycastPosition = currentPlayerPosition + currentPlayerUp;
hitAngle = 0;
groundPoint = vector3Zero;
mainHitPoint = currentPlayerPosition;
groundDetected = false;
if (Physics.Raycast (mainRaycastPosition, -currentPlayerUp, out mainGroundHit, rayDistance, layer)) {
groundDetected = true;
}
if (useSphereRaycastForGroundDetection) {
if (!groundDetected) {
if (Physics.Raycast (mainRaycastPosition, -currentPlayerUp, out temporalHit, rayDistance + 1.5f, layer)) {
float temporalHitDistance = temporalHit.distance;
if (temporalHitDistance < rayDistance + 0.2f) {
mainGroundHit = temporalHit;
groundDetected = true;
}
}
}
if (!groundDetected) {
sphereRaycastRay = new Ray (currentPlayerPosition - sphereCastOffset * currentPlayerUp, -currentPlayerUp);
if (Physics.SphereCast (sphereRaycastRay, sphereCastRadius, out sphereRaycastHit, maxDistanceSphereCast, layer)) {
groundDetected = true;
mainGroundHit = sphereRaycastHit;
if (showGizmo) {
Debug.DrawRay (mainGroundHit.point, 100 * Vector3.up, Color.black, 10);
}
bool nextSurfaceLocated = false;
Vector3 playerMovementDirection = 5 * mainRigidbody.linearVelocity;
playerMovementDirection.Normalize ();
Vector3 temporalRaycastPosition = currentPlayerPosition + 0.05f * playerMovementDirection + 0.1f * currentPlayerUp;
int temporalRaycastCheckAmount = 0;
while (!nextSurfaceLocated) {
if (Physics.Raycast (temporalRaycastPosition, -currentPlayerUp, out sphereRaycastHit, 0.17f, layer)) {
mainGroundHit = sphereRaycastHit;
nextSurfaceLocated = true;
} else {
temporalRaycastPosition += 0.03f * playerMovementDirection;
temporalRaycastCheckAmount++;
if (showGizmo) {
Debug.DrawRay (temporalRaycastPosition, 100 * Vector3.up, Color.yellow, 10);
}
}
if (temporalRaycastCheckAmount >= 5) {
nextSurfaceLocated = true;
groundDetected = false;
}
}
}
}
if (!groundDetected) {
if (Physics.Raycast (mainRaycastPosition, -currentPlayerUp, out temporalHit, rayDistance + 1.5f, layer)) {
float temporalHitDistance = temporalHit.distance;
if (previouslyOnGround) {
if (temporalHitDistance < rayDistance + maxExtraRaycastDistanceToGroundDetection) {
mainGroundHit = temporalHit;
groundDetected = true;
}
}
}
}
}
if (groundDetected) {
//get the angle of the current surface
hitAngle = Vector3.Angle (currentNormal, mainGroundHit.normal);
canSetGroundState = false;
//check max angle between the ground and the player if he is on zero gravity or free floating mode
if ((freeFloatingModeOn || zeroGravityModeOn) && !checkOnGroundStatePausedFFOrZG && !previouslyOnGround) {
if (useMaxAngleToCheckOnGroundStateZGFF) {
if (hitAngle < maxAngleToChekOnGroundStateZGFF) {
canSetGroundState = true;
}
} else {
canSetGroundState = true;
}
} else {
canSetGroundState = true;
}
if (zeroGravityModeOn && ignoreSetCheckOnGrundStatePausedFFOrZGStateActive) {
canSetGroundState = true;
}
if (canSetGroundState) {
setOnGroundState (true);
}
jump = false;
slowingFall = false;
slowFallExternallyActive = false;
groundPoint = mainGroundHit.point;
currentSurfaceBelowPlayer = mainGroundHit.collider.transform;
currentSurfaceBelowPlayerLocated = true;
currentNumberOfDash = 0;
distanceToGround = mainGroundHit.distance;
if (!useSphereRaycastForGroundDetection) {
distanceToGround -= 1;
}
mainHitPoint = groundPoint;
mainHitAngle = hitAngle;
if (checkIfSurfaceBelowIsTerrainEnabled) {
if (previousSurfaceBelowPlayer != currentSurfaceBelowPlayer) {
previousSurfaceBelowPlayer = currentSurfaceBelowPlayer;
terrainDetected = previousSurfaceBelowPlayer.GetComponent<Terrain> ();
}
}
} else {
if (currentSurfaceBelowPlayerLocated) {
currentSurfaceBelowPlayer = null;
currentSurfaceBelowPlayerLocated = false;
previousSurfaceBelowPlayer = null;
terrainDetected = false;
}
}
if (useMaxWalkSurfaceAngle && !stairStepDetected) {
if (playerOnGround && hitAngle > maxWalkSurfaceAngle && (!useMaxDistanceToCheckSurfaceAngle || distanceToGround > maxDistanceToCheckSurfaceAngle)) {
setOnGroundState (false);
}
}
//check if the player has to adhere to the surface or not
adhereToGround = false;
if (playerOnGround) {
movingOnSlopeUp = false;
movingOnSlopeDown = false;
//use a raycast to check the distance to the ground in front of the player,
//if the ray doesn't find a collider, it means that the player is going down in an inclinated surface, so adhere to that surface
bool hitInFront = false;
slopeFound = false;
stairsFound = false;
//assign the current input direction, taking into account if the player is moving in free mode or in locked camera with movement relative to the camera direction
if (lockedCameraActive && useRelativeMovementToLockedCamera && !usedByAI) {
currentAdherenceInput = lockedCameraMoveInput;
} else {
currentAdherenceInput = currentMoveInput;
}
rayPosition = mainRaycastPosition + (maxRayDistanceRange * currentAdherenceInput);
//Debug.DrawRay (rayPosition - currentPlayerUp, currentPlayerUp * 10, Color.yellow);
raycastDistance = rayDistance - 0.2f;
if (walkSpeed <= half) {
raycastDistance = rayDistance;
}
float hitAngleInFront = 0;
if (Physics.Raycast (rayPosition, -currentPlayerUp, out mainGroundHit, raycastDistance, layer)) {
//Debug.DrawRay (rayPosition, -currentPlayerUp * raycastDistance, Color.red);
hitInFront = true;
hitAngleInFront = Vector3.Angle (currentNormal, mainGroundHit.normal);
}
bool ignoringSlopesFromInclination = false;
//check for slopes while aiming in third person or moving in first person
if (hitAngle != 0 || hitAngleInFront != 0) {
checkForSlopes = false;
if (firstPersonActive) {
rayPosition = mainRaycastPosition + (maxSlopeRayDistance * currentAdherenceInput);
checkForSlopes = true;
} else {
if (!playerCameraManager.is2_5ViewActive ()) {
if ((playerIsAiming && lookInCameraDirectionOnFreeFireActive) || lookInCameraDirectionActive) {
rayPosition = mainRaycastPosition + (maxSlopeRayDistance * currentAdherenceInput);
checkForSlopes = true;
} else {
if (useTankControls) {
if (!isPlayerUsingVerticalInput ()) {
currentAdherenceInput = vector3Zero;
}
rayPosition = mainRaycastPosition + (maxSlopeRayDistance * currentAdherenceInput);
} else {
rayPosition = mainRaycastPosition + (maxSlopeRayDistance * playerTransformForward);
}
checkForSlopes = true;
}
} else {
if (playerIsAiming) {
rayPosition = mainRaycastPosition + (maxSlopeRayDistance * currentAdherenceInput);
} else {
rayPosition = mainRaycastPosition + (maxSlopeRayDistance * playerTransformForward);
}
checkForSlopes = true;
}
}
if (useMaxSlopeInclination) {
if (hitAngle < minSlopeInclination || hitAngle > maxSlopeInclination ||
hitAngleInFront < minSlopeInclination || hitAngleInFront > maxSlopeInclination) {
checkForSlopes = false;
ignoringSlopesFromInclination = true;
}
}
if (checkForSlopes) {
if (showGizmo) {
Debug.DrawRay (rayPosition + 4 * Vector3Up, (rayDistance + half) * (-currentPlayerUp) - 4 * Vector3Up, Color.green, 3);
}
if (Physics.Raycast (rayPosition, -currentPlayerUp, out adherenceHit, (rayDistance + half), layer)) {
hitPointVerticalPosition = playerTransform.InverseTransformPoint (adherenceHit.point).y;
mainHitPointVerticalPosition = playerTransform.InverseTransformPoint (mainHitPoint).y;
adhereToGround = true;
groundPoint = adherenceHit.point;
if (usingAnimator && !useFirstPersonPhysicsInThirdPersonActive) {
if (hitPointVerticalPosition >= mainHitPointVerticalPosition) {
currentGroundAdherence = slopesGroundAdherenceUp;
movingOnSlopeUp = true;
} else {
currentGroundAdherence = slopesGroundAdherenceDown;
movingOnSlopeDown = true;
}
} else {
if (hitPointVerticalPosition >= mainHitPointVerticalPosition) {
currentGroundAdherence = noAnimatorSlopesGroundAdherenceUp;
movingOnSlopeUp = true;
} else {
currentGroundAdherence = noAnimatorSlopesGroundAdherenceDown;
movingOnSlopeDown = true;
}
}
slopeFound = true;
//Debug.DrawRay (rayPosition + Vector3Up * 4, -currentPlayerUp * (rayDistance + half) - Vector3Up * 4, Color.green, 3);
} else {
//Debug.DrawRay (rayPosition + Vector3Up * 4, -currentPlayerUp * (rayDistance + half) - Vector3Up * 4, Color.yellow, 3);
}
}
}
//check for stairs below and in front of the player
stairsMoveInput = (1 / walkSpeed) * currentAdherenceInput;
rayPosition = mainRaycastPosition + stairsMoveInput;
if (Physics.Raycast (rayPosition, -currentPlayerUp, out adherenceHit, raycastDistance, layer)) {
hitAngle = Vector3.Angle (currentNormal, adherenceHit.normal);
if (checkStairsWithInclination) {
if (!stairStepDetected) {
stairInclinationDetected = false;
}
if (hitAngle != 0 && hitAngle >= minStairInclination && hitAngle <= maxStairInclination) {
stairInclinationDetected = true;
}
}
}
bool canCheckStairsState = true;
if (terrainDetected) {
canCheckStairsState = false;
}
//walk on stairs
if (hitInFront && (hitAngle == 0 || stairInclinationDetected) && !ignoringSlopesFromInclination && canCheckStairsState) {
if (!slopeFound || mainHitAngle == 0 || (mainHitAngle >= minStairInclination && mainHitAngle <= maxStairInclination)) {
if (checkForStairAdherenceSystem) {
rayPosition = mainRaycastPosition + stairsMoveInput;
//Debug.DrawRay (rayPosition, -currentPlayerUp * raycastDistance, Color.black);
if (Physics.Raycast (rayPosition, -currentPlayerUp, out adherenceHit, raycastDistance, layer)) {
currentDetectedSurface = adherenceHit.collider.gameObject;
} else {
currentDetectedSurface = null;
}
if (currentTargetDetected != currentDetectedSurface) {
stairAdherenceSystemDetected = false;
currentTargetDetected = currentDetectedSurface;
if (currentTargetDetected != null) {
stairAdherenceSystem currentStairAdherenceSystem = currentTargetDetected.GetComponent<stairAdherenceSystem> ();
if (currentStairAdherenceSystem != null) {
if (currentStairAdherenceSystem.modifyStairsValuesOnPlayer) {
currentStairAdherenceSystem.setStairsValuesOnPlayer (this);
}
stairAdherenceSystemDetected = true;
} else {
currentStairAdherenceSystem = currentSurfaceBelowPlayer.GetComponent<stairAdherenceSystem> ();
if (currentStairAdherenceSystem != null) {
if (currentStairAdherenceSystem.modifyStairsValuesOnPlayer) {
currentStairAdherenceSystem.setStairsValuesOnPlayer (this);
}
stairAdherenceSystemDetected = true;
}
}
}
}
}
if (stairAdherenceSystemDetected) {
currentStairMaxValue = currentStairAdherenceSystemMaxValue;
currentStairMinValue = currentStairAdherenceSystemMinValue;
currentStairAdherenceValue = currentStairAdherenceSystemAdherenceValue;
} else {
currentStairMaxValue = stairsMaxValue;
currentStairMinValue = stairsMinValue;
currentStairAdherenceValue = stairsGroundAdherence;
}
rayPosition = mainRaycastPosition + (maxStairsRayDistance * stairsMoveInput);
Vector3 clampRayPosition = rayPosition - currentPlayerPosition;
clampRayPosition = Vector3.ClampMagnitude (clampRayPosition, 1.1f);
clampRayPosition = currentPlayerPosition + clampRayPosition;
//Debug.DrawRay (clampRayPosition, -currentPlayerUp, Color.grey, 20);
//MAYBE HERE GET THE LAST Y POSITION TO REACH AND USE THAT TO CHECK TEH DIFFERENCE WITH CURRENT PLAYER Y POSITION
//maybe add a vertical movement speed on slope up or down instead of forcing vertical position
if (Physics.Raycast (clampRayPosition, -currentPlayerUp, out adherenceHit, raycastDistance, layer)) {
if (!stairStepDetected) {
float stepPosition = playerTransform.InverseTransformPoint (adherenceHit.point).y;
if (stepPosition > 0) {
upDistance = Mathf.Abs (Mathf.Abs (playerTransform.InverseTransformPoint (currentPlayerPosition).y) - Mathf.Abs (stepPosition));
if (upDistance >= currentStairMinValue && upDistance <= currentStairMaxValue) {
stairStepDetected = true;
if (showDebugPrint) {
print ("stair step detected");
}
}
}
}
if (stairStepDetected) {
if (showDebugPrint) {
print ("climbing step");
}
adhereToGround = true;
groundPoint = adherenceHit.point;
if (showGizmo) {
Debug.DrawLine (currentPlayerPosition + currentPlayerUp * 2, groundPoint, Color.grey, 2);
}
if (usingAnimator && !useFirstPersonPhysicsInThirdPersonActive) {
currentGroundAdherence = currentStairAdherenceValue;
if (walkSpeed < 1) {
float extraValue = walkSpeed;
extraValue += 0.3f;
extraValue = Mathf.Clamp (extraValue, 0, 1);
currentGroundAdherence *= extraValue;
}
} else {
currentGroundAdherence = noAnimatorStairsGroundAdherence;
}
stairsFound = true;
if (Mathf.Abs (playerTransform.InverseTransformPoint (adherenceHit.point).y) < 0.02f) {
stairStepDetected = false;
if (showDebugPrint) {
print ("new step reached");
}
}
}
} else {
stairStepDetected = false;
}
}
}
if (!slopeFound && !stairsFound) {
adhereToGround = true;
currentGroundAdherence = regularGroundAdherence;
}
//if the player is not moving and the angle of the surface is 0, adhere to it, so if the player jumps for example, the player is correctly
//placed in the ground, with out a gap between the player's collider and the ground
bool pressingInput = isPlayerUsingInput ();
if (useTankControls) {
pressingInput = isPlayerUsingVerticalInput ();
}
if (!pressingInput && hitAngle == 0) {
adhereToGround = true;
currentGroundAdherence = regularGroundAdherence;
if (stairStepDetected) {
groundPoint = currentPlayerPosition;
}
} else if (!pressingInput || (movingOnSlopeUp && hitAngle != 0 && !isPlayerMoving (0.99f)) || (movingOnSlopeDown && hitAngle != 0 && !isPlayerMoving (0.99f))) {
adhereToGround = true;
bool sphereCastFound = false;
if (Physics.SphereCast (currentPlayerPosition + currentPlayerUp, originalRadius, -currentPlayerUp, out adherenceHit, 0.75f, layer)) {
if (showGizmo) {
Debug.DrawLine (currentPlayerPosition + currentPlayerUp, adherenceHit.point, Color.black);
}
sphereCastFound = true;
}
if (movingOnSlopeUp) {
if (distanceToGround < 0.05f || sphereCastFound) {
groundPoint = currentPlayerPosition;
} else {
groundPoint = mainHitPoint;
}
} else if (movingOnSlopeDown) {
if (pressingInput) {
if (!isPlayerMoving (0.25f) && (sphereCastFound || distanceToGround < 0.05f)) {
groundPoint = currentPlayerPosition;
}
} else {
if (distanceToGround < 0.05f || sphereCastFound) {
if (!isPlayerMoving (0.05f)) {
groundPoint = currentPlayerPosition;
}
} else {
groundPoint = mainHitPoint;
}
}
}
}
}
//ignore to adhere to the ground below if the player is rotating to a different gravity direction
if (lockedCameraActive) {
if (isPlayerMovingOn2_5dWorld ()) {
if (characterRotatingToSurface) {
adhereToGround = false;
}
}
}
//the player has to ahdere to the current surface, so
if (adhereToGround) {
//move towards the surface the player's rigidbody
mainRigidbody.position = Vector3.MoveTowards (mainRigidbody.position, groundPoint, currentFixedUpdateDeltaTime * currentGroundAdherence);
if (showGizmo) {
Debug.DrawLine (mainRigidbody.position, groundPoint + 4 * playerTransform.up, Color.black);
}
}
//END OF CHECK ON GROUND STATE
if (showGizmo) {
Debug.DrawLine (currentPlayerPosition + (4 * currentPlayerUp), adherenceHit.point, Color.black);
}
if (playerOnGround) {
if (useAutoCrouch) {
updateAutoCrouchCheck ();
}
}
}
if (!playerOnGround) {
lastTimeAir = Time.time;
}
} else {
setOnGroundState (false);
}
}
}