ezEngine  Release 25.03
ezJoltCharacterControllerComponent Class Referenceabstract

Base class for character controllers (CC). More...

#include <JoltCharacterControllerComponent.h>

Inheritance diagram for ezJoltCharacterControllerComponent:

Classes

struct  ContactPoint
 Describes a point where the CC collided with other geometry. More...
 

Public Member Functions

virtual void SerializeComponent (ezWorldWriter &inout_stream) const override
 Override this to save the current state of the component to the given stream.
 
virtual void DeserializeComponent (ezWorldReader &inout_stream) override
 Override this to load the current state of the component from the given stream. More...
 
void SetObjectToIgnore (ezUInt32 uiObjectFilterID)
 The CC will move through the given physics body. More...
 
void ClearObjectToIgnore ()
 
void SetMaxClimbingSlope (ezAngle slope)
 The maximum slope that the character can walk up.
 
ezAngle GetMaxClimbingSlope () const
 
void SetMass (float fMass)
 The mass with which the character will push down on objects that it is standing on.
 
float GetMass () const
 
void SetStrength (float fStrength)
 The strength with which the character will push against objects that it is running into.
 
float GetStrength () const
 
- Public Member Functions inherited from ezComponent
void SetActiveFlag (bool bEnabled)
 Sets the active flag of the component, which affects its active state. More...
 
bool GetActiveFlag () const
 Checks whether the 'active flag' is set on this component. Note that this does not mean that the component is also 'active'. More...
 
bool IsActive () const
 Checks whether this component is in an active state. More...
 
bool IsActiveAndInitialized () const
 Returns whether this component is active and initialized. More...
 
bool IsActiveAndSimulating () const
 Whether the component is currently active and simulation has been started as well. More...
 
ezComponentManagerBaseGetOwningManager ()
 Returns the corresponding manager for this component.
 
const ezComponentManagerBaseGetOwningManager () const
 Returns the corresponding manager for this component.
 
ezGameObjectGetOwner ()
 Returns the owner game object if the component is attached to one or nullptr.
 
const ezGameObjectGetOwner () const
 Returns the owner game object if the component is attached to one or nullptr.
 
ezWorldGetWorld ()
 Returns the corresponding world for this component.
 
const ezWorldGetWorld () const
 Returns the corresponding world for this component.
 
ezComponentHandle GetHandle () const
 Returns a handle to this component.
 
ezUInt32 GetUniqueID () const
 Returns the unique id for this component.
 
void SetUniqueID (ezUInt32 uiUniqueID)
 Sets the unique id for this component.
 
void EnsureInitialized ()
 Ensures that the component is initialized. Must only be called from another component's Initialize callback.
 
void EnsureSimulationStarted ()
 Ensures that the OnSimulationStarted method has been called. Must only be called from another component's OnSimulationStarted callback.
 
EZ_ALWAYS_INLINE bool SendMessage (ezMessage &ref_msg)
 Sends a message to this component.
 
EZ_ALWAYS_INLINE bool SendMessage (ezMessage &ref_msg) const
 
void PostMessage (const ezMessage &msg, ezTime delay=ezTime::MakeZero(), ezObjectMsgQueueType::Enum queueType=ezObjectMsgQueueType::NextFrame) const
 Queues the message for the given phase. The message is processed after the given delay in the corresponding phase.
 
virtual bool HandlesMessage (const ezMessage &msg) const
 Returns whether the given Message is handled by this component.
 
void SetUserFlag (ezUInt8 uiFlagIndex, bool bSet)
 Be careful to check which flags may already be in use by base classes.
 
bool GetUserFlag (ezUInt8 uiFlagIndex) const
 Retrieves a custom flag. Index must be between 0 and 7.
 
void SetCreatedByPrefab ()
 Adds ezObjectFlags::CreatedByPrefab to the component. See the flag for details.
 
bool WasCreatedByPrefab () const
 Checks whether the ezObjectFlags::CreatedByPrefab flag is set on this component.
 
- Public Member Functions inherited from ezReflectedClass
virtual const ezRTTIGetDynamicRTTI () const
 
bool IsInstanceOf (const ezRTTI *pType) const
 Returns whether the type of this instance is of the given type or derived from it.
 
template<typename T >
EZ_ALWAYS_INLINE bool IsInstanceOf () const
 Returns whether the type of this instance is of the given type or derived from it.
 

Public Attributes

ezUInt8 m_uiCollisionLayer = 0
 The collision layer determines with which other actors this actor collides. More...
 
ezUInt8 m_uiPresenceCollisionLayer = 0
 In case a 'presence shape' is used, this defines which geometry the presence bodies collides with.
 
ezBitflags< ezJoltCharacterDebugFlags > m_DebugFlags
 What aspects of the CC to visualize.
 

Protected Member Functions

virtual void OnSimulationStarted () override
 This method is called once for active components, at the start of the next world update, but only when the world is simulated. More...
 
virtual void OnDeactivated () override
 This method is called when the component gets deactivated. More...
 
EZ_ALWAYS_INLINE float GetUpdateTimeDelta () const
 Returns the time delta to use for updating the character. This may differ from the world delta.
 
EZ_ALWAYS_INLINE float GetInverseUpdateTimeDelta () const
 Returns the inverse of update time delta.
 
virtual JPH::Ref< JPH::Shape > MakeNextCharacterShape ()=0
 Returns the shape that the character is supposed to use next. More...
 
virtual float GetShapeRadius () const =0
 Returns the radius of the shape. This never changes at runtime.
 
virtual void UpdateCharacter ()=0
 Called up to once per frame, but potentially less often, if physics updates were skipped due to high framerates. More...
 
JPH::CharacterVirtual * GetJoltCharacter ()
 Gives access to the internally used JPH::CharacterVirtual.
 
const JPH::CharacterVirtual * GetJoltCharacter () const
 
ezResult TryChangeShape (JPH::Shape *pNewShape)
 Attempts to change the character shape to the new one. Fails if the new shape overlaps with surrounding geometry.
 
void RawMoveWithVelocity (const ezVec3 &vVelocity, float fMaxStairStepUp, float fMaxStepDown)
 Moves the character using the given velocity and timestep, making it collide with and slide along obstacles.
 
void RawMoveIntoDirection (const ezVec3 &vDirection)
 Variant of RawMoveWithVelocity() that takes a direction vector instead.
 
void RawMoveToPosition (const ezVec3 &vTargetPosition)
 Variant of RawMoveWithVelocity() that takes a target position instead.
 
void TeleportToPosition (const ezVec3 &vGlobalFootPos)
 Teleports the character to the destination position, even if it would get stuck there.
 
bool StickToGround (float fMaxDist)
 If the CC is slightly above the ground, this will move it down so that it touches the ground. More...
 
void CollectCastContacts (ezDynamicArray< ContactPoint > &out_Contacts, const JPH::Shape *pShape, const ezVec3 &vQueryPosition, const ezQuat &qQueryRotation, const ezVec3 &vSweepDir) const
 Gathers all contact points that are found by sweeping the shape along a direction.
 
void CollectContacts (ezDynamicArray< ContactPoint > &out_Contacts, const JPH::Shape *pShape, const ezVec3 &vQueryPosition, const ezQuat &qQueryRotation, float fCollisionTolerance) const
 Gathers all contact points of the shape at the target position. More...
 
ezVec3 GetContactVelocityAndPushAway (const ContactPoint &contact, float fPushForce)
 Detects the velocity at the contact point. If it is a dynamic body, a force pushing it away is applied. More...
 
void SpawnContactInteraction (const ContactPoint &contact, const ezHashedString &sSurfaceInteraction, ezSurfaceResourceHandle hFallbackSurface, const ezVec3 &vInteractionNormal=ezVec3(0, 0, 1))
 Spawns a surface interaction prefab at the given contact point. More...
 
void VisualizeContact (const ContactPoint &contact, const ezColor &color) const
 Debug draws the contact point.
 
void VisualizeContacts (const ezDynamicArray< ContactPoint > &contacts, const ezColor &color) const
 Debug draws all the contact points.
 
- Protected Member Functions inherited from ezComponent
 ezComponent ()
 Keep the constructor private or protected in derived classes, so it cannot be called manually.
 
bool IsDynamic () const
 Returns whether this component is dynamic and thus can only be attached to dynamic game objects.
 
virtual ezWorldModuleTypeId GetTypeId () const =0
 
virtual ezComponentMode::Enum GetMode () const =0
 
virtual void Initialize ()
 Can be overridden for basic initialization that depends on a valid hierarchy and position. More...
 
virtual void Deinitialize ()
 This method is called before the component is destroyed. A derived type can override this method to do common de-initialization work. More...
 
virtual void OnActivated ()
 This method is called when the component gets activated. More...
 
void EnableUnhandledMessageHandler (bool enable)
 By default disabled. Enable to have OnUnhandledMessage() called for every unhandled message.
 
virtual bool OnUnhandledMessage (ezMessage &msg, bool bWasPostedMsg)
 When EnableUnhandledMessageHandler() was activated, this is called for all messages for which there is no dedicated message handler. More...
 
virtual bool OnUnhandledMessage (ezMessage &msg, bool bWasPostedMsg) const
 When EnableUnhandledMessageHandler() was activated, this is called for all messages for which there is no dedicated message handler. More...
 
bool IsInitialized () const
 
bool IsInitializing () const
 
bool IsSimulationStarted () const
 

Friends

class ezJoltWorldModule
 

Additional Inherited Members

- Static Public Member Functions inherited from ezNoBase
static const ezRTTIGetStaticRTTI ()
 
- Protected Attributes inherited from ezComponent
const ezRTTIm_pMessageDispatchType = nullptr
 Messages will be dispatched to this type. Default is what GetDynamicRTTI() returns, can be redirected if necessary.
 

Detailed Description

Base class for character controllers (CC).

This class provides general functionality for building a character controller. It tries not to implement things that are game specific. It is assumed that most games implement their own character controller to be able to build very specific behavior. The ezJoltDefaultCharacterComponent is an example implementation that shows how this can be achieved on top of this class.

Member Function Documentation

◆ ClearObjectToIgnore()

void ezJoltCharacterControllerComponent::ClearObjectToIgnore ( )

◆ CollectContacts()

void ezJoltCharacterControllerComponent::CollectContacts ( ezDynamicArray< ContactPoint > &  out_Contacts,
const JPH::Shape *  pShape,
const ezVec3 vQueryPosition,
const ezQuat qQueryRotation,
float  fCollisionTolerance 
) const
protected

Gathers all contact points of the shape at the target position.

Use fCollisionTolerance > 0 (e.g. 0.02f) to find contacts with walls/ground that the shape is touching but not penetrating.

◆ DeserializeComponent()

void ezJoltCharacterControllerComponent::DeserializeComponent ( ezWorldReader inout_stream)
overridevirtual

Override this to load the current state of the component from the given stream.

The active state will be automatically serialized. The 'initialized' state is not serialized, all components will be initialized after creation, even if they were already in an initialized state when they were serialized.

Reimplemented from ezComponent.

Reimplemented in ezJoltDefaultCharacterComponent.

◆ GetContactVelocityAndPushAway()

ezVec3 ezJoltCharacterControllerComponent::GetContactVelocityAndPushAway ( const ContactPoint contact,
float  fPushForce 
)
protected

Detects the velocity at the contact point. If it is a dynamic body, a force pushing it away is applied.

This is mainly used to get the velocity of the kinematic object that a character is standing on. It can then be incorporated into the movement, such that the character rides along. If the body at the contact point is dynamic, optionally a force can be applied, simulating that the character's weight pushes down on it.

◆ MakeNextCharacterShape()

virtual JPH::Ref<JPH::Shape> ezJoltCharacterControllerComponent::MakeNextCharacterShape ( )
protectedpure virtual

Returns the shape that the character is supposed to use next.

The desired target state (radius, height, etc) has to be stored somewhere else (e.g. as members in derived classes). The shape can be cached. The shape may not get applied to the character, in case this is used by things like TryResize and the next shape is determined to not fit.

Implemented in ezJoltDefaultCharacterComponent.

◆ OnDeactivated()

void ezJoltCharacterControllerComponent::OnDeactivated ( )
overrideprotectedvirtual

This method is called when the component gets deactivated.

Upon destruction, a component that is active first gets deactivated. Therefore OnDeactivated() should be used for typical game code cleanup.

See also
OnActivated(), OnDeactivated(), Initialize(), Deinitialize(), OnSimulationStarted()

Reimplemented from ezComponent.

Reimplemented in ezJoltDefaultCharacterComponent.

◆ OnSimulationStarted()

void ezJoltCharacterControllerComponent::OnSimulationStarted ( )
overrideprotectedvirtual

This method is called once for active components, at the start of the next world update, but only when the world is simulated.

This is the one preferred method to setup typical game logic. In a pure game environment there is no practical difference between OnActivated() and OnSimulationStarted(), as OnSimulationStarted() will be called right after OnActivated().

However, when a scene is open inside the editor, there is an important difference: OnActivated() is called once the component was created. OnSimulationStarted() is only called once the game simulation is started inside the editor. As an example, if a component starts a sound in OnActivated(), that sound will play right after the scene has been loaded into the editor. If instead the sound gets started in OnSimulationStarted(), it will only play once the user starts the game mode inside the editor.

Additionally, OnSimulationStarted() is only executed once, even if the ezWorld pauses and resumes world simulation multiple times. However, note that it will be called again after the component has been deactivated and is activated again.

See also
OnActivated(), OnDeactivated(), Initialize(), Deinitialize(), OnSimulationStarted()

Reimplemented from ezComponent.

Reimplemented in ezJoltDefaultCharacterComponent.

◆ SetObjectToIgnore()

void ezJoltCharacterControllerComponent::SetObjectToIgnore ( ezUInt32  uiObjectFilterID)

The CC will move through the given physics body.

Currently only one such object can be set. This is mainly used to ignore an object that the player is currently carrying, so that there are no unintended collisions.

Call ClearObjectToIgnore() to re-enable collisions.

◆ SpawnContactInteraction()

void ezJoltCharacterControllerComponent::SpawnContactInteraction ( const ContactPoint contact,
const ezHashedString sSurfaceInteraction,
ezSurfaceResourceHandle  hFallbackSurface,
const ezVec3 vInteractionNormal = ezVec3(0, 0, 1) 
)
protected

Spawns a surface interaction prefab at the given contact point.

hFallbackSurface is used, if no other surface could be determined from the contact point.

◆ StickToGround()

bool ezJoltCharacterControllerComponent::StickToGround ( float  fMaxDist)
protected

If the CC is slightly above the ground, this will move it down so that it touches the ground.

If within the max distance no ground contact is found, the function does nothing and returns false.

◆ UpdateCharacter()

virtual void ezJoltCharacterControllerComponent::UpdateCharacter ( )
protectedpure virtual

Called up to once per frame, but potentially less often, if physics updates were skipped due to high framerates.

All shape modifications and moves should only be executed during this step. The given deltaTime should be used, rather than the world's time diff.

Implemented in ezJoltDefaultCharacterComponent.

Member Data Documentation

◆ m_uiCollisionLayer

ezUInt8 ezJoltCharacterControllerComponent::m_uiCollisionLayer = 0

The collision layer determines with which other actors this actor collides.

See also
ezJoltActorComponent

The documentation for this class was generated from the following files: