One way platforms weren't being properly detected when the character was stable/grounded. As a result, the only way to detect one way platforms was by jumping on top of them.
Fixed
The character forward rotation produced by ground movement (rotateForwardDirection) was not working.
Characters detected penetration with children colliders while being on top of moving platforms.
Added
SetInputHandler public method to CharacterBrain. This allows you to set any input handler at runtime.
Fixed
A compiler error in Unity 2023.1. This error was caused by a change made to the Animator update mode.
Warning messages, only visible in Unity 2023.1, caused by some API changes.
The character collision detection code was not considering colliders affected by the IgnoreCollision API (e.g. Physics.IgnoreCollision).
Added
Update mode to the CharacterBrain component. The brain now allows actions to be consumed either during FixedUpdate (default behaviour) or Update.
(Demo)Initialization public method to the Camera3D component.
Changed
CharacterBrain and CharacterBody editors have been modified in order to allow prefab changes to be visible in the inspector.
Most character associated flags such as IsStable, IsGrounded, HasBecomeGrounded, and so on, have been re-worked in order to fix some issues and improve performance.
The abstract class CharacterCollisions, previously a plain C# class, is now a MonoBehaviour.
(Demo) Dash's CancelOnContact now checks for the presence of wall contacts instead of comparing the PointVelocity magnitude with a threshold.
Fixed
Small collision detection issues.
The local velocity value used by the OnGroundedStateEnter and OnStableStateEnter events wasn't correct.
CharacterActionsAssetEditor could find and replace any file with the name CharacterActions.
Fixed
The CurrentTrigger property for 2D characters wasn't being updated properly during OnTriggerExit2D.
Fixed
Character penetrated dynamic rigidbodies due to an overlap test issue (bad step detection).
Fixed
2D characters weren't able to push dynamic rigidbodies while being on top of dynamic ground.
Static 2D rigidbodies were considered as dynamic ground.
Changed
CharacterActor's ToString implementation has been removed. Use GetCharacterInfo instead.
Inspector fields (CharacterActor) have been re-arranged in order to keep things a bit more clean and easy to find.
Fixed
Overlaps tests (PhysicsComponent) weren't excluding the body from the results. This caused issues such as inter-penetration with obstacles, failed overlap tests, and probably more.
The character could phase through the ceiling while climbing up steps. In order to prevent this situation, "prevent bad steps" now performs an overlap test.
The recently modified Trigger struct was causing some warning messages on the console due to the IEquatable interface implementation.
Added
OnStableStateEnter and OnStableStateExit events (CharacterActor).
Changed
Minimum editor version required is 2021.3.3f1
Rotation methods and directional properties (Forward, Right and Up) are virtual. This can be useful in case the user wants to further customize how rotation works for the actor.
Fixed
Triggers didn't get updated correctly when useGroundTrigger was enabled (CharacterActor). Because of this, multiple OnTriggerXXX calls were made, causing the firstContact field to be false all the time.
The character collider size didn't get initialized properly when forceGroundedAtStart was disabled.
A small amount of garbage was generated by CharacterActor caused by the RemovePenetrationAction action.
Creating a character action with an empty name caused a null reference exception.
Some events from CharacterActor, especially OnGroundedStateExit, weren't being called by CharacterActor.
Upgrade Guide link broken (Welcome window).
Added
Reset velocity on teleport (CharacterActor). In previous versions, after a teleport was called, the actor had to reset its velocity. Now it is possible to ignore this behaviour if needed. This is enabled by default for compatibility reasons.
New information (3D rotation) added to the upgrade guide.
Changed
The interpolation targets reset code has been changed in order to allow breaking interpolation during Update. In previous versions, triggering a reset was possible only during FixedUpdate. This change also allows you to Teleport an actor during Update, something that was not possible with previous versions.
Fixed
AI behaviours caused the brain to stop working due to a null reference exception.
Enabling and disabling an interpolated actor caused the actor to jump to the last interpolation target.
Enabling and Disabling interpolation through the inspector caused the actor to jump to the last interpolation target.
Landing on a moving platform for just one frame (e.g. classic jump buffering mechanic) caused the actor to gain high velocity.
When landing on a one way platform, the planar velocity was reduced due to a projection error. This was noticeable when the actor was running.
Note: This update is not as "aggressive" as previous features updates and might be considered as a low risk update in general. A very short upgrade guide has been included (see the Documentation folder) just in case you find some issues.
Added
Apply weight layer mask.
Character-vs-Character detection. Now it is possible to exclude characters from being detected as stable surfaces.
Rotation-based acceleration boost (NormalMovement). This allows you to control the amount of movement acceleration based on the angle between current direction and desired direction.
New SetBodySize, CheckBodySize and CheckAndSetBodySize size-oriented methods.
New SetRotation, RotateYaw, RotatePitch, RotateRoll, TurnAround, RotateAround and SetYaw rotation-oriented methods.
New HasBecomeGrounded, HasBecomeStable, HasBecomeNotGrounded and HasBecomeUnstable properties for CharacterActor.
IsAnimatorValid method from CharacterActor.
Mini Planet scene
SpriteRotator component
StepLerper and RotationLerper components (previously integrated within Graphics Root Controller)
Changed
Rotation for a 2D actor has been changed internally in order to fix some unpredictable behaviors. Before this change, a 2D character couldn't do yaw rotation at all since transform.forward = Vector3.forward always. With this new change, forward is directly represented by transform.right.
Size interpolation has been moved out from the CharacterActor component. Now the user is free to change this property however he/she wants. Some new functions added to the actor will make this transition easy for the user.
The NormalMovement component now implements this functionality just like in previous versions (See Crouch and StandUp methods from NormalMovement).
Interpolation reset functionality. In previous versions, it was necessary to change the position/rotation value to the desired value before calling the reset. That way, the target will be updated properly with the current position/rotation.
With this update there is no need to consider the order. A reset call will set an internal flag so that the interpolation target will match with the resulting Position and/or Rotation.
PreCharacterSimulation and PostCharacterSimulation methods (CharacterStateController) don't check for the Animator component anymore. Now it is necessary to do a manual check (e.g. using CharacterActor.IsAnimatorValid) if the user want to get the same functionality as before.
The Graphics Root Controller component is now obsolete. It has been properly separated into two new components called Step Lerper and Rotation Lerper.
The previous OneWayPlatform component (introduced in 1.3.7) has been marked as obsolete. The DynamicOneWayPlatform component has been added.
The asset top menu (/Character Controller Pro) has been moved to /Window/Character Controller Pro.
Fixed
The ExitBehaviour method from CharacterAIBehaviour wasn't being called by the CharacterBrain component.
Landing on a fast moving platform caused the character to project its own planar velocity onto it. This ended up adding an unnatural amount of velocity to the character. The planar velocity component is now compared at the moment of landing and removed in order to match the platform velocity.
When stepping out of a moving platform, the character velocity wasn't affected by the platform.
Character rotation in 2D wasn't working as expected, especially when performing 180 degrees rotation.
Character actions timers (e.g. StartedElapsedTime, ActiveTime, etc) weren't being updated properly.
A high velocity non-convex platform could hit the character really hard, causing it to fly away due to a powerful physics response.
Penetration issues after PostSimulationUpdate while being affected by moving plaforms. A de-penetration method is now involved.
The CharacterStateController state machine wasn't able to "wait" for the initial state to meet the required conditions (initial state active, enabled and not null). This meant that the FSM was capable of doing a only one successful start during the Start message. From now on, the FSM will wait until the required conditions are correct.
Camera2D component rotation issues.
Added
Dynamic ground layer mask. Now it is possible to choose (via a layer mask) which object should be considered as a valid dynamic ground.
ForceState (CharacterStateController) method.
preventUnstableClimbing (CharacterActor) field. This will automatically removed any planar velocity when trying to climb an unstable slope.
Changed
CharacterStateController has been "unsealed" (you can derive from it).
MaxUnstableUpwardsVelocity (CharacterActor) has been fully replaced with the preventUnstableClimbing field. Basically, this new field removes the trial and error component.
2D Scene has been changed.
Fixed
GroundPosition and GroundRotation caused a null reference exception when the Rigidbody object was disable/destroyed.
Camera3D issue associated with a variable frame. The regular delta time (old) was replaced with a fixed delta time.
Small code improvements and an overall formatting.
Added
New OneWayPlatform component. This component allows one way platforms to be fully dynamic. This means that characters should be properly detected by the collision algorithm.
SweepAndTeleport method (CharacterActor).
"maxUnstableUpwardsVelocity" public field (CharacterActor). This field limits the amount of vertical displacement when the obstacle isd unstable. This is very useful to prevent a character from climbing unstable slopes, especially when the acceleration (airborne) is too high.
(Demo) New PositionAndRotationModifier detector. This component replaces the old Teleporter and VerticalDirectionModifier components.
(Demo) NormalMovement's ReduceAirControl method. This allows you to reduce the air control (not grounded acceleration/deceleration) of the character for a certain duration. TIP: It is very useful for wall jumps.
Changed
Read only structs. HitInfo, HitInfoFilter and CollisionInfo have been re-declared as read only structs. This change was extremely important for performance reasons.
(Demo) Camera pitch limits are now asymmectric, meaning that you can specify different limits for positive/negative pitch.
(Demo) 2D Scene character uses now a high (almost instant) acceleration and deceleration.
Fixed
The MaterialController component was throwing a null reference when the character was instantiated at runtime (e.g. using a "spawner").
InputMovementReference was calculated every time the property was needed (getter). Now, the data is updated once before the state machine update.
Actions were not resetting correctly after disabling the CharacterActor component.
There were issues associated with non-convex 2D collision detection (polygons, edges, tilemaps, etc).
The CharacterDetector component was performing its task multiple times, once for each collider involved in the collision. Now, this component does its job only once (per character).
The demo character was capable of climbing unstable slopes when the acceleration was too high (e.g. tight 2D platformer). The displacement is now reduced using the "maxUnstableUpwardsVelocity" field (CharacterActor).
(Demo) The WallSlide width parameter has been removed, this is because the width property should not change at runtime (the state depends on the wall contact).
Added
New "useStableEdgeWhenLanding" field (CharacterActor). See the associated tooltip for more information.
Custom vector math functions added to the utilities namespace. This helps to achieve an increase in performance.
Changed
Most of the vector math operations have been replaced with the custom vector math functions (Core, Demo and Implementation).
The InputSystemHandler.cs file (based on the new input system) has been removed from the package. The recommended way to put this file into your project is by downloading it from the online documentation.
The MaterialController component is no longer a requirement (optional) for the demo states.
The Performance scene has been changed.
Fixed
Vertical displacement from the CharacterGraphicsRootController component was improved. The current version is a mix between the old version (1.3.4) and the one from last release (1.3.5), finding a balance smoothness and ground detection in general.
The collision layer mask (from PhysicsComponent) update process has been modified. The reason behind this is to prevent multiple (and unnecessary) math operations per frame. This should improve performance quite a bit.
Jump pads now includes the OnTriggerStay callback as well.
Added
Custom position and rotation handle logic. Now it is possible to freely move and rotate (scene view) any character while in play mode.
New detectGroundWhileAscending variable. The default value is false, meaning that the character won't detect any new stable ground if it is going up (natural behaviour).
You can go back to the old way by setting this to true.
A few public fields have been added in order to allow the character to inherit the current ground velocity (planar and vertical velocity).
These variables consist of thresholds and multipliers.
New CharacterDetector abstract component. This is just a simple helper component that can detect multiple characters, allowing you to implement custom behaviours on top (derived components). Use it if you want to use OnTriggerXXX methods associated with character actors (e.g. jump pads, conveyor belts, etc.).
JumpPad component (derived from CharacterDetector).
AddForce "impulse" mode to RigidbodyComponent.
Non-generic EnqueueTransition method (CharacterStateController). This method can take a CharacterState reference as an argument.
GraphicsRootController vertical displacement has been improved, allowing the character to smoothly go up and down only when detecting steps (and not always).
This effect is very noticeable with slopes (the character won't penetrate them anymore).
Fixed
Collision detection improvements.
Dynamic ground collide and slide. Characters on top of moving platforms can collide and slide properly with the environment.
Action based platforms were causing a really fast spring effect (2 frames) when reaching the target destination.
Ground contact wasn't correctly added to the contacts list.
2D Rigidbody detection wasn't working as expected (e.g. preving the character from pushing rigidbodies).
Overlap checks (2D and 3D) weren't updating the hits number (causing random issues).
Some fields affected by the Condition attribute weren't behaving as expected, especially when multiple attributes were present (e.g. Condition + Range attributes).
This is now handled by the OnValidate callback.
CharacterDebug component was causing trouble associated with the execution order of things.
CharacterActionsAsset creation process was assuming that the root directory was always located at "Assets/Character Controller Pro/...". Now this process should automatically detect the target file (CharacterActions.cs), allowing you to move the asset folder if needed.
Added
Ground trigger: A simple ground trigger (automatically attached to the character object) has been added. This will allow you to handle OnTriggerXXX events
from external scripts.
OnNewGround event.
Changed
Ground detection: The ground detection algorithm now runs after the simulation, which means better results overall.
Contacts: The character "ground contact" is now part of the "Contacts" list.
Looking direction modes (NormalMovement): Now it is possible to change between looking direction "modes" (movement, external reference or target).
This replaces the old "follow external reference" property.
Fixed
Missing labels in the inspector (Unity 2020.3 or higher): There was an issue associated with the "condition" attribute, causing labels to dissapear.
Edge calculation: There was a bug related to the edge calculation (CharacterCollisions.cs).
Dynamic platform interaction: it was possible to be on top of a dynamic (non-kinematic rigidbody) platform and interact with it, causing all sorts of issues.
Now, if the affected rigidbody is part of the ground (e.g. compound collider), then it will be treated as a static obstacle.
Camera collision: collision detection didn't support multiple hits.
Added
Root motion extra settings: Now it is possible to select how the root position/rotation is going to be applied.
"SetRootMotion" methods (CharacterActor).
Changed
Animator update mode: "Animate physics" update mode is now required by the physics actor in order to produce correct results (especially with root motion).
Fixed
Root motion: Enabling the CharacterActor component was causing the actor to reset to its previous position/rotation.
PhysicsActor sync update: the custom interpolation algorithm was still working even when the character actor was disabled.
Added
OnPreSimulation event (PhysicsActor): This event is called prior to the physics simulation.
PreCharacterSimulation method (CharacterState): This method is called by the state controller, based on the OnPreSimulation event.
OnBodyTypeChange event (RigidbodyComponent): This event is called every time the rigidbody type changes.
Changed
Jump and gravity "auto calculate" (NormalMovement): By disabling the "autoCalculate" boolean variable it is possible to set the jump speed and gravity values separately. Otherwise, the jump and gravity will be calculated based on the apex height and duration of the jump (just like before).
CharacterState animation parameters: Some animation-related parameters were moved from PostUpdateBehaviour to PreCharacterSimulation. This ensures the velocity represented on screen is the one calculated by the CharacterActor, and not by a particular state (execution order). Example: a 2D character stops (visually) right away after hitting an unstable slope.
Fixed
Tilemap collision: The character wasn't able to detect a tilemap obstacle (static rigidbody type) due to a bug associated with the IsKinematic property.
LadderClimbing: There was a problem while entering the ladder trigger with the "useInteractAction" disabled. This bug was caused by the physics system calling OnTriggerExit + OnTriggerEnter every time the body was changed from kinematic to dynamic (and viceversa).
Dynamic rigidbody detection: In some cases, the character wasn't detecting the ground (dynamic rigidbody), causing the character to be unstable for a short period of time.
Added
PhysicsActor and PhysicsActorSync classes.
Frame rate menu: The demo now contains a frame rate-related menu with different settings.
Changed
Root motion properties has been moved over to the CharacterActor component. They can still be accessed from the state controller.
The AnimatorLink component now belongs to the Core namespace.
Character rotation pivot: The rotation pivot automatically changes, depending on the grounded state. If the character is grounded, then the pivot is the bottom center (sphere). Otherwise, the pivot corresponds to the center of the capsule.
Fixed
CharacterState: The starting character state (CharacterStateController) wasn't ignored if it was disabled (monobehaviour).
The body height wasn't being limited by the character properties (inspector).
Root motion movement/rotation wasn't being applied on top of dynamic platforms.
Interpolation (actor) and actions (brain) wasn't working properly with low frame rates.
Ground detection wasn't working as expected with non-convex colliders. This should have improved compared to previous versions.
Added
Custom interpolation: Characters don't use Unity's default interpolation anymore (Rigidbody and Rigidbody2D). Instead, a custom implementation of has been introduced for them. This shouldn't be noticeable for the user.
One way platforms support: The character can use 2D and/or 3D one way platforms. These platforms must be contained in a specific user-defined layer mask.
Dynamic ground improvements (CharacterActor): The character should is able to react to any kind of moving platform, no matter if it is kinematic or dynamic, scripted or animated.
Dynamic ground velocity (CharacterActor): Some limits have been introduced regarding dynamic ground-based movement. Now it is possible to use the ground velocity and influence the character (e.g. jumping while on top of a moving platform, this will (if it is supported by the character) add the ground velocity to the character)
"Zero gravity" scene.
"ZeroGravity" character state (used in "Zero gravity" scene).
Pitch and Roll float actions: Two new actions were added to the character actions.
Edge angle property (CharacterActor)
Character collision info (CharacterActor): The user now has access to the main collision struct.
Root motion position and rotation update (CharacterStateController): Normally root motion updates both position and rotation values. Now, the user can select if one or the other should be ignored or not.
"canRun" (NormalMovement): This public variable enables/disables running.
Looking direction speed (NormalMovement): Now it is possible to configure the rotation speed of the character.
Looking direction modes (NormalMovement): user can select how the looking direction should behave by selecting one of the two modes, "Input" and "Velocity". These modes are separated, one for each CharacterActor state (StableGrounded, UnstableGrounded and NotGrounded)
Jump down (NormalMovement): The character can jump down from one way platforms by pressing combining the "crouch" + "jump" actions.
Changed
Not grounded rotation: Rotation of a "not grounded" character uses the center as the pivot, instead of the rigidbody position (feet).
Assembly definition (terrain reference): CCP's assembly definition file now contains a new reference associated with Unity's terrain module. This also means that the asset now is able ignore all the terrain related functionality if needed (for example, if the user decides to disable this module).
PlanarMovementParameters (NormalMovement): PlanarMovementProperties structs from this class (speed, acceleration and deceleration values) have been replaced with public variables. For those using playmaker, this should be enough to access and/or modify that data.
Fixed
Domain reload: Re-compiling scripts while being in play mode should not thrown any null reference anymore.
2D Rotator scale mode: This mode (facing direction mode) was working only if the character forward = Vector2.right/left.
Yaw rotation: Sometimes rotation changes weren't applied correctly, especially when the character needed to face the opposite direction (180 degrees).
Not grounded physics interactions (CharacterActor): The character wasn't interacting properly with rigidbodies while being not grounded.
Dash animation: The rotation of the character was wrong.
Added
Camera 3D: The camera collision system can filter dynamic and kinematic rigidbodies.
Changed
CharacterActor fields (Core): Most of the serialized variables are now public (e.g. slopeLimit, stepUpDistance, etc.).
Demo states fields (demo): Most of the private variables associated with Demo states are now protected.
Rope Climbing animation: The blend tree was replaced with three states (up, down and idle) in order to get better results.
Fixed
Force Grounded: The character was not using the "force grounded" functionality in some cases.
Dynamic ground velocity: In some cases the dynamic ground velocity was not reset properly.
Ledge hanging animation: The idle animation was missing (Animator state).
CharacterState "Initialize" method: There was a problem with the execution orden of this method (not specified). It has been replaced with "Start".
Rope component: This component was not defined inside a namespace.
Dash: "Force not grounded" sometimes triggered grounded state (depending on the collision). This has been fixed by replacing "ForceNotGrounded" with "always not grounded".
Fixed
Can jump: This variable wasn't doing anything.
Code improvements: Some null checks have been added to the code.
Support for kinematic and dynamic ground using the RigidbodyComponent component.
Support for vanilla rigidbodies (kinematic and dynamic) as moving ground.
"Constraint rotation" option. With this enabled you can toggle on and off this constraint, allowing the character to freely rotate in any direction. This constraint was formerlly known as "vertical alignment".
"Prevent bad steps" option. This is useful to prevent the character from stepping over unstable surfaces.
"Slide on walls" option. This can be used to prevent the character from sliding on walls.
New "WallSlide" state. This component contains all the logic responsible for sliding and climbing on walls.
New "RopeClimbing" state. This is a more retro-styled climbing ability (found on older games like Rune).
"Pre-Grounded" jump: Now the jump action can be triggered before touching the ground (vastly used in platformers).
"BoolAction" timers: These actions now expose some very useful timers such as ActiveTime, InactiveTime, StartedElapsedTime, etc.
Graphics root controller: This component handles the visual behaviour of the graphics root (called "Graphics" in the demo scenes).
Character and camera nested prefabs: Now it is possible to drag and drop one prefab in order to add a character 3D (2D) and a camera 3D (2D) at the same time.
"Can push rigidbodies" option allows you to determine if the character should be able to push other rigidbodies. Additionally, there is a layermask associated with this feature that acts as a filter.
Stable/Unstable "post simulation velocity" settings. This allows you to re-assign the velocity of the character after the simulation is done. You can select between "input velocity", "pre simulation velocity" and "post simulation velocity" (default).
Changed
The concept of "external velocity" has been replaced with a new and better way of interacting with rigidbodies (see "post simulation velocity" and "can push rigidbodies").
Step up/down speed is now properly handled by the graphics components, giving much more better and stable results (especially regarding collisions).
Vertical alignment direction has been changed to "constraint up direction".
Jump release action has been changed to "cancel on release" (instead of stop jumping). The velocity is now reduce when the jump needs to be canceled.
3D animated model "CCP Character" has been "separated" into separated FBX files. This can be useful to modify independent animations without compromising the entire FBX file. By default the character uses the "CCP Character (model)" mesh, which is just a 3D humanoid without any animation.
Animation names (demo character) have been changed from "Armature|XXX" to "XXX". This eliminates a very common error related to the asset store package validator (although this shouldn't be a problem for the user).
Deprecated
The SceneController component has been removed since it is no longer needed by characters and platforms. The update process now relies entirely on FixedUpdate.
The tags and layer profile asset has been removed. The character valid layers are those represented by the collision matrix (Physics settings).
Sphere body: This is exactly the same as using a capsule shape with diameter = height.
Fixed
Unstable movement in terrain: The character didn't slide and prevent unstable surfaces properly when interacting with a terrain.
Memory garbage: Some data structures were generating garbage under certain conditions.
Slide movement in "NormalMovement": The character was moving slowly when the slope was too steep (wrong behaviour).
Added
Assembly Definition: Now the entire asset is wrapped inside an assembly definition (file: com.lightbug.character-controller-pro). The advantage of doing this is that all the CCP C# code will be separated from the predefined Assembly-CSharp.dll assembly.
Jump: "canJump" public boolean.
Changed
Most of the NormalMovement properties are now public..
Fixed
RuntimeAnimatorController: There was a problem with the transition and the runtime animator controller assignment.
Added
Rigidbody component: AddForce and AddExplosiveForce now change the velocity of the rigidbody (useful for characters).
Size lerp speed: The body size can be set to change smoothly from size A to size B (e.g. crouch from NormalMovement).
Changed
Character Actor OnEnable/OnDisable: The character does not change the rigidbody constraints anymore in OnEnable/OnDisable. If you need to do that the best way to do it is by manually set that via code (more freedom).
Fixed
Rigidbody component: it wasn't possible to set the angular velocity of a dynamic rigidbody.
Root motion: root motion for dynamic characters was not working as expected.
Triggers: When the trigger was destroyed the PhysicsComponent wasn't removing it from the list.
AnimatorLink: This component wasn't automatically added to the Animator gameObject.
Default RuntimeAnimatorController: The Animator default RuntimeAnimatorController was set to null, even if there was a controller assigned to it.
Grahpics scaler: The offset was not being considered by the local scale.
DeflectVector (Utilities): This utility wasn't maintaining the vector magnitude (maintainMagnitude = true).
Edge componesation: This feature wasn't working properly with "step up" movement.
Added
Welcome screen: When importing the asset a "welcome" window should appear.
Top menu: A menu was added with links to contact information, documentation and API.
Vertical alignment Gizmos: The vertical alignment direction should be now represented as a gizmo.
Changed
Character Actor OnEnable/OnDisable: The character does not change the rigidbody constraints anymore in OnEnable/OnDisable. If you need to do that the best way to do it is by manually set that via code (more freedom).
Fixed
Multiple characters under a same root: Multiple characters were not detecting its own components (states, brain, actions, etc) when being under a same root object (e.g. "CharacterA" and "CharacterB" as children of "Root")
Input manager handler: The old input system handler now catches any exception caused by not setting up the demo project (input not defined). If for some strange reason the user missed the readme file and/or welcome screen messages (it could happen), then a warning message should appear on the console.
Added
Unstable grounded jump: The NormalMovement incorporates a new variable, useful to allow (or not) the character to jump on unstable grounds (see vertical movement parameters). By default this variable is false.
External velocity settings: More settings related to this feature, now you can choose to ignore (or not) the external velocity caused by static colliders and/or kinematic rigidbodies.
Fixed
Capsule model: The capsule height didn't match the CCP Character model.
Custom input handler: It was impossible to add a custom input handler component to the CharacterBrain.
Graphics scaler offset: There wasn't a way to handle the offset of the graphics when changing the scale.
This was a problem for objects with a pivot at the center (e.g. the default Unity's capsule).
Slide (NormalMovement state): Sometimes the character went from "state grounded" to "unstable" state due to collision detection issues.
AISequenceBehaviour: There was a bug with the OnWallHit type of sequence, basically a false contact, making the character to remain in a loop (same action over and over again).
Added
Crouch: a "enableCrouch" toggle was added to the crouch settings (NormalMovement state).
New input system handler: A new input handler component (based on the implementation presented in the online documentation) has been added. Since managing external packages and dependencies can be difficult and sometimes buggy (at least in 2019.3), the code has been commented from top to bottom (to avoid obvious compile errors). If you have installed the new input system, you only need to uncomment the entire script and use this new component as a custom input handler. For more information about this topic, please see the instructions presented in the "How to..." section (online documentation).
Fixed
External movement reference: A null external movement reference (CharacterStateController) was causing a null reference exception, with no warning mentioning the cause. Now it should at least print a warning on the console (without any null reference exception).
Transitions: The state machine was skipping one element of the transition queue everytime (the "for" loop was replaced with a "while").
Added
Character Actor
Kinematic character (no collision detection): You can enable/disable the "isKinematic" option at any time.
Step up/down transition: The step up/down speed can be controlled in the CharacterActor inspector. This will basically help to prevent abrupt changes to the character vertical movement (grounded).
Grounded and NotGrounded time: You can now easily get the time the character has been grounded or not.
Character Actor state: The character always had two very important flags, "grounded" and "stable". Now you can check for the "state" of the CharacterActor, which basically involves a combination of these two flags. For example: StableGrounded (Grounded && Stable), NotGrounded ( !Grounded ) and UnstableGrounded (Grounded && !Stable ).
External velocity: The velocity caused by the Physics simulation (e.g. a heavier object hitting the character) can be added to the rigidbody original velocity (called input velocity). Basically with this option you are able to handle this effect, whether you want complete control over the velocity (ignoring it), or making the character react to external impulses (for "free", without having to manually process these collisions using contacts).
Animation
Animator: Every CharacterState has access to the Animator component. The state machine will find and "link" the component automatically (it does not need to be in the same object).
Root motion: Enable/Disable root motion from within the state anytime. Basically the position and rotation of the character will be controlled by the animation clip.
IK support: A new virtual method (UpdateIK) is dedicated to modify the IK behaviour (a "linked" version of the OnAnimatorIK message).
New "Demo character": A new fully animated 3D "Humanoid" character, replacing the old one.
Actions
Character Action Asset: Create your custom actions using the editor (ScriptableObject).
AI Behaviours: The AI logic is now separated from the CharacterBrain component, meaning that you can add your custom behaviours. The asset includes the same behaviours as before (Follow and Sequence) and a new one (Wander).
States
Ledge hanging state.
Ladder climbing state.
Run input mode (hold or toggle) for the NormalMovement state.
Crouch input mode (hold or toggle) for the NormalMovement state (now with a proper model animation).
Coyote time for the NormalMovement state.
Speed limit + Acceleration/Deceleration settings. Now you can control these settings separately for planar and vertical movement (this is fully compatible with the materials settings).
Camera
First person mode (Camera3D): The Camera3D now has the first person mode, as well as a hideBody option to hide the character mesh (widely used in first person characters).
Input handler for the camera: The Camera3D now uses an input handler as the main input gathering method.
Changes
Demo content: Most of the example components (previously in the Implementation part) have been moved to the Demo (e.g. states, scriptable objects, camera scripts, materials, etc ). Hopefully this will make much more clear what's part of the controller/system, and what's optional content.
Character hierarchy: Most of the character components (ignoring CharacterActor and CharacterBody) can be placed anywhere within the character hierarchy (character object). This will allow you to organize your content better (if you want to).
Instant changes: The character will process all the important changes (in position, rotation, grounded state, etc) instantly. For example, after you use "ForceNotGrounded", the character grounded state will be false.
Vertical Alignment: The "Gravity" settings has been changed to "Vertical Alignment" settings (since this functionality has nothing to do with gravity itself).
State "Name" property: This property has been removed. In order to refer to a particular state, use the GetState method from the CharacterStateController component.
MaterialsController: The materials are no longer a part of the state controller, since this component wasn't really needed for the state machine (see the "Demo content" from above). Instead, now there is a MaterialController component available for you to use. See the "Environment" child object (any character from the demo scenes).
Material acceleration/deceleration: The "control" parameter has been replaced with acceleration and deceleration (just to avoid confusion).
CharacterGraphics: This component is no longer required for the graphics object. Instead, it has been splitted into two more extra graphics-related components (optional).
Fixed
Abrupt deceleration (NormalMovement state): The character was abruptly decelerating after a jump.
Multi-State transitions: The FSM was not able to check multiple potential states at once.
CharacterAction phase: It was possible to modify the "phase" of the action (e.g. a button action could be "pressed" and "released" at the same time). Now you can only get/set the value of a particular action.
Changes
Input data: the camera now responds to "Camera Horizontal", "Camera Vertical" and "Camera Zoom" inputs.
Fixed
Scene error: "[Physics.PhysX] QuickHullConvexHullLib ...". This was caused by a plane mesh with a convex MeshCollider on it.
Added
Scene Controller events: Now it's possible to listen to events from the scene controller (OnSimulationStart, OnSimulationEnd, OnCharacterSimulationStart and OnCharacterSimulationEnd)
Multi-triggers: This means that the character is able to recognize more than one trigger at the same time, allowing to interesting gameplay mechanics.
Invert axis: Now the "InputAxes" component allows to invert the horizontal and/or vertical axis.
Interact: A new input axis ("Interact") has been added.
Camera inputs: "cameraHorizontalAxis", "cameraVerticalAxis" and "cameraZoomAxis" have been added to the input data.
Character Actor: IgnoreLayer and IgnoreLayerMask methods.
Changes
The scene controller now must be added to the scene. Just drag and drop the "Scene Controller" prefab into the scene, done.
The "3D Scene" scene has been modified (multiple triggers).
The "Mobile Scene" scene has been modified.
Fixed
Import errors: Due to some prefab missing references a bunch of errors were shown on the console when importing the package.
Character Actions: The character was resetting the actions incorrectly when there were two or more "FixedUpdate" calls between "Update" calls. This was causing the character to stop moving when the framerate was really low.
Not grounded jump: The character wasn't reseting the available jumps count.
Material vs trigger: When entering a non-material trigger the character was resetting its material data (default material).
Camera 3D: The camera was looking at a wrong target position.
Added
CharacterActorBehaviour: The character actor component now runs its own "behaviour" before anything else (ensuring a correct execution order). The CharacterStateController has been converted into a CharacterActorBehaviour.
Contacts: The PhysicsComponent now is capable of collecting all the contacts (in a frame) from the OnCollisionEnter and OnCollisionStay callbacks.
Collision response contacts: The CharacterActor now contains a list of contacts that come from OnCollisionEnter callbacks, due to dynamic rigidbodies that use the "Contact Rigidbodies" tag. This is used to create the external velocity in the NormalMovement state.
Max. Rigidbody response velocity: The response velocity now can be clamped to a maximum value.
Debug Gizmos toggle: The CharacterActor allows to show/hide the gizmos.
Changes
Character Graphics: This component does not require any external reference anymore (it will automatically get all the children).
The "Performance" scene has been re-designed.
Jump variables names: some of the jump-related variable names (NormalMovement component) has been changed.
Fixed
Jump: The character was unable to jump when the "Jump cancellation mode" was disabled.
Dash: The character was unable to react to collisions during the Dash state.
Added
Animator: new play "Transition" and "PlayState" modes. Now the states can be use either by playing them directly (Animator.Play) or by using triggers/transitions.
CharacterAnimation: the animation component is now using FixedUpdate rather than Update to handle the states.
CharacterActor: new "TargetPosition" public property.
CharacterActor: new "RigidbodyVelocity" public property.
CharacterActor: new "RigidbodyStaticVelocity" public property.
Camera3D: position interpolation is now divided into "planar" (the plane formed by the character up direction) and "up". Both interpolations can be configured separately.
CharacterGraphics: rotation offset. This basically will offset the orientation of the graphics object.
CharacterGraphics: "Rotation" and "Scale" facing direction modes.
Character Actor and Kinematic Actor: Enable/Disable options. Now both, characters and kinematic actors, can be enabled/disabled at any time (using the classic checkbox from the inspector). These actions will freeze/unfreeze the rigidbody.
Changes
3D Scene: it has been modified a little.
Demo Character: the default Demo character model has been completely replaced with a humanoid model.
Crouch: it is called "Shrink" now, since it's more appropriate.
Arrow modifier: it is called "Gravity modifier", since it's more appropriate.
CharacterAnimation: now it uses hashes rather than strings.
CharacterActor: the character will use the graphics object forward as the desired forward direction, rather than transform.forward (for3D) and transform.right (for 2D).
Fixed
CharacterParticles: the CharacterAnimation caused an error when the CharacterParticles component was disabled (due to a missing "PlayFootstep" method).
Crouch: the character didn't change its size when standing on steep slopes.
Step handling: now the step up action should be much more smoother than before.
Gravity modifiers: incorrect facing direction when the character entered a gravity modifier.
Added
RigidbodyComponent component.
ColliderComponent component.
PhysicsComponent component.
CharacterBody component.
New "Sphere" and "Circle" body types (CharacterBody component).
A new "useGravity" toggle for the NormalMovement component.
A new scene called "Performance".
Changes
The CharacterMotor2D and CharacterMotor3D components were replaced by the CharacterActor component.
The ActionBasedPlatform2D and ActionBasedPlatform3D components were replaced by the ActionBasedPlatform component.
The NodeBasedPlatform2D and NodeBasedPlatform3D components were replaced by the NodeBasedPlatform component.
The KinematicSceneController was replaced by the SceneController. Now the SceneController is responsible for updating the characters and the kinematic actors.
The kinematic platforms and the cameras are now kinematic actors.
Fixed
A bug with the vertical not grounded movement (CharacterMotor). This was making the character to slowly descend (depending on the skinWidth value) even if the vertical velocity was zero.