AxisConfig
AxisConfig
#Overview
name: AxisConfig
The value of this variable can be defined or overridden in .ini config files. 18
.ini config files referencing this setting variable.
It is referenced in 18
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of AxisConfig is to configure and manage axis properties for input handling in Unreal Engine 5. It is primarily used for setting up and controlling input axis behavior, such as sensitivity, dead zones, and other properties related to input axes.
AxisConfig is mainly utilized by the Input System in Unreal Engine 5. Based on the provided callsites, it is referenced in the following subsystems and modules:
- Input System (Engine/Source/Runtime/Engine)
- Control Rig Editor (Engine/Plugins/Animation/ControlRig)
- Skeletal Mesh Editing Tools (Engine/Plugins/Experimental/MeshModelingToolsetExp)
- Skeletal Debug Rendering (Engine/Source/Runtime/Engine)
The value of this variable is typically set in the UInputSettings class, which is responsible for storing and managing input-related settings. It can be modified through the project settings in the Unreal Engine editor or programmatically.
AxisConfig interacts with other input-related variables and systems, such as:
- ActionMappings and AxisMappings for defining input bindings
- InputAxisProperties for storing specific axis properties
- PlayerInput class for managing player-specific input settings
Developers should be aware of the following when using AxisConfig:
- Changes to AxisConfig may require rebuilding keymaps to take effect
- It affects both editor and runtime behavior of input axes
- Platform-specific settings may override or complement AxisConfig
Best practices when using AxisConfig include:
- Use the UInputSettings class to manage and modify AxisConfig
- Ensure consistency between AxisConfig and other input-related settings
- Consider platform-specific requirements when configuring axis properties
- Use the appropriate editor tools (e.g., Project Settings) to modify AxisConfig when possible
- Be mindful of performance implications when frequently modifying axis properties at runtime
#Setting Variables
#References In INI files
<Workspace>/Engine/Config/BaseInput.ini:27, section: [/Script/Engine.InputSettings]
<Workspace>/Engine/Config/BaseInput.ini:28, section: [/Script/Engine.InputSettings]
<Workspace>/Engine/Config/BaseInput.ini:29, section: [/Script/Engine.InputSettings]
<Workspace>/Engine/Config/BaseInput.ini:30, section: [/Script/Engine.InputSettings]
<Workspace>/Engine/Config/BaseInput.ini:31, section: [/Script/Engine.InputSettings]
<Workspace>/Engine/Config/BaseInput.ini:32, section: [/Script/Engine.InputSettings]
<Workspace>/Engine/Config/BaseInput.ini:33, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:13, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:14, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:15, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:16, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:17, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:18, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:19, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:20, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:21, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:22, section: [/Script/Engine.InputSettings]
<Workspace>/Projects/Lyra/Config/DefaultInput.ini:23, section: [/Script/Engine.InputSettings]
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Plugins/Animation/ControlRig/Source/ControlRigEditor/Private/Editor/ControlRigEditorEditMode.cpp:148
Scope (from outer to inner):
file
function void FControlRigEditorEditMode::Render
Source code excerpt:
// get size setting for bone drawing
FBoneAxisDrawConfig AxisConfig;
float BoneRadius = 1.0f;
if (FAnimationViewportClient* AnimViewportClient = static_cast<FAnimationViewportClient*>(Viewport->GetClient()))
{
BoneRadius = AnimViewportClient->GetBoneDrawSize();
}
#Loc: <Workspace>/Engine/Plugins/Animation/ControlRig/Source/ControlRigEditor/Private/Editor/ControlRigEditorEditMode.cpp:178
Scope (from outer to inner):
file
function void FControlRigEditorEditMode::Render
Source code excerpt:
// draw the little coordinate frame inside the bone ONLY if selected or affected
AxisConfig.bDraw = bIsAffected|| bIsSelected;
// draw cone to each child
// but use a different color if this bone is NOT selected, but the child IS selected
ChildPositions.Reset();
ChildColors.Reset();
ChildrenIndices = Hierarchy->GetChildren(ElementIndex);
#Loc: <Workspace>/Engine/Plugins/Animation/ControlRig/Source/ControlRigEditor/Private/Editor/ControlRigEditorEditMode.cpp:209
Scope (from outer to inner):
file
function void FControlRigEditorEditMode::Render
Source code excerpt:
SDPG_Foreground,
BoneRadius,
AxisConfig);
if (Hierarchy->GetFirstParent(ElementIndex) == INDEX_NONE)
{
SkeletalDebugRendering::DrawConeConnection(PDI, BoneTransform.GetLocation(), FVector::Zero(), BoneRadius, FLinearColor::Red);
}
PDI->SetHitProxy(nullptr);
}
#Loc: <Workspace>/Engine/Plugins/Experimental/MeshModelingToolsetExp/Source/MeshModelingToolsEditorOnlyExp/Private/SkeletalMesh/SkeletonEditingTool.cpp:1727
Scope (from outer to inner):
file
function void USkeletonEditingTool::Render
Source code excerpt:
DrawConfig.SelectedBoneColor = SelectedBoneColor;
DrawConfig.ParentOfSelectedBoneColor = ParentOfSelectedBoneColor;
DrawConfig.AxisConfig.Thickness = Properties->AxisThickness;
DrawConfig.AxisConfig.Length = Properties->AxisLength;
FPrimitiveDrawInterface* PDI = RenderAPI->GetPrimitiveDrawInterface();
const IPrimitiveComponentBackedTarget* TargetComponent = Cast<IPrimitiveComponentBackedTarget>(Target);
const FTransform ComponentTransform = TargetComponent->GetWorldTransform();
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/GameFramework/InputSettings.h:26
Scope (from outer to inner):
file
class class UInputSettings : public UObject
Source code excerpt:
/** Properties of Axis controls */
UPROPERTY(config, EditAnywhere, EditFixedSize, Category="Bindings", meta=(ToolTip="List of Axis Properties"), AdvancedDisplay)
TArray<struct FInputAxisConfigEntry> AxisConfig;
/**
* Platform specific settings for Input.
* @see UInputPlatformSettings
*/
UPROPERTY(EditAnywhere, Category = "Platforms")
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/GameFramework/PlayerInput.h:437
Scope (from outer to inner):
file
class class UPlayerInput : public UObject
Source code excerpt:
/** This player's version of the Axis Properties */
TArray<struct FInputAxisConfigEntry> AxisConfig;
/** This player's version of the Action Mappings */
TArray<struct FInputActionKeyMapping> ActionMappings;
/** This player's version of Axis Mappings */
TArray<struct FInputAxisKeyMapping> AxisMappings;
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Classes/GameFramework/PlayerInput.h:449
Scope: file
Source code excerpt:
TArray<FName> InvertedAxis;
/** Gets the axis properties for a given AxisKey. Returns if true if AxisKey was found in the AxisConfig array. */
ENGINE_API bool GetAxisProperties(const FKey AxisKey, FInputAxisProperties& AxisProperties);
/** Gets the axis properties for a given AxisKey. Returns if true if AxisKey was found in the AxisConfig array. */
ENGINE_API void SetAxisProperties(const FKey AxisKey, const FInputAxisProperties& AxisProperties);
/** Exec function to change the mouse sensitivity */
ENGINE_API void SetMouseSensitivity(const float SensitivityX, const float SensitivityY);
/** Sets both X and Y axis sensitivity to the supplied value. */
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/CheatManager.cpp:1198
Scope (from outer to inner):
file
function void UCheatManager::SetMouseSensitivityToDefault
Source code excerpt:
{
// find default sensitivity restore to that
for (const FInputAxisConfigEntry& AxisConfigEntry : GetDefault<UInputSettings>()->AxisConfig)
{
const FKey AxisKey = AxisConfigEntry.AxisKeyName;
if (AxisKey == EKeys::MouseX)
{
PlayerInput->SetMouseSensitivity(AxisConfigEntry.AxisProperties.Sensitivity,PlayerInput->GetMouseSensitivityY());
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SkeletalDebugRendering.cpp:369
Scope (from outer to inner):
file
namespace SkeletalDebugRendering
function void DrawBonesInternal
Source code excerpt:
}
FBoneAxisDrawConfig AxisConfig = DrawConfig.AxisConfig;
// spin through all required bones and render them
const float BoneRadius = DrawConfig.BoneDrawSize;
for (int32 Index = 0; Index < RequiredBones.Num(); ++Index)
{
const int32 BoneIndex = RequiredBones[Index];
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SkeletalDebugRendering.cpp:397
Scope (from outer to inner):
file
namespace SkeletalDebugRendering
function void DrawBonesInternal
Source code excerpt:
// draw the little coordinate frame inside the bone ONLY if selected or affected
AxisConfig.bDraw = bIsAffected || bIsSelected;
// draw cone to each child
// but use a different color if this bone is NOT selected, but the child IS selected
TArray<FVector> ChildPositions;
TArray<FLinearColor> ChildColors;
for (int32 ChildIndex = 0; ChildIndex < NumBones; ++ChildIndex)
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/SkeletalDebugRendering.cpp:436
Scope (from outer to inner):
file
namespace SkeletalDebugRendering
function void DrawBonesInternal
Source code excerpt:
SDPG_Foreground,
BoneRadius,
AxisConfig);
// special case for root connection to origin
if (GetParentIndex(BoneIndex) == INDEX_NONE)
{
SkeletalDebugRendering::DrawConeConnection(PDI, BoneTransform.GetLocation(), ComponentOrigin, BoneRadius, FLinearColor::Red);
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UserInterface/InputSettings.cpp:104
Scope (from outer to inner):
file
function void UInputSettings::PopulateAxisConfigs
Source code excerpt:
{
TMap<FName, int32> UniqueAxisConfigNames;
for (int32 Index = 0; Index < AxisConfig.Num(); ++Index)
{
UniqueAxisConfigNames.Add(AxisConfig[Index].AxisKeyName, Index);
}
for (int32 Index = AxisConfig.Num() - 1; Index >= 0; --Index)
{
const int32 UniqueAxisIndex = UniqueAxisConfigNames.FindChecked(AxisConfig[Index].AxisKeyName);
if (UniqueAxisIndex != Index)
{
AxisConfig.RemoveAtSwap(Index);
}
}
#if WITH_EDITOR
TArray<FKey> AllKeys;
EKeys::GetAllKeys(AllKeys);
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UserInterface/InputSettings.cpp:128
Scope (from outer to inner):
file
function void UInputSettings::PopulateAxisConfigs
Source code excerpt:
NewAxisConfigEntry.AxisKeyName = Key.GetFName();
NewAxisConfigEntry.AxisProperties.DeadZone = 0.f; // Override the default so that we keep existing behavior
AxisConfig.Add(NewAxisConfigEntry);
}
}
#endif
}
void UInputSettings::AddInternationalConsoleKey()
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UserInterface/InputSettings.cpp:198
Scope (from outer to inner):
file
function void UInputSettings::PostEditChangeChainProperty
Source code excerpt:
if (MemberPropertyName == GET_MEMBER_NAME_CHECKED(UInputSettings, ActionMappings) || MemberPropertyName == GET_MEMBER_NAME_CHECKED(UInputSettings, AxisMappings) ||
MemberPropertyName == GET_MEMBER_NAME_CHECKED(UInputSettings, AxisConfig) || MemberPropertyName == GET_MEMBER_NAME_CHECKED(UInputSettings, SpeechMappings))
{
ForceRebuildKeymaps();
FEditorDelegates::OnActionAxisMappingsChanged.Broadcast();
}
else if (MemberPropertyName == GET_MEMBER_NAME_CHECKED(UInputSettings, bEnableGestureRecognizer))
{
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UserInterface/PlayerInput.cpp:554
Scope (from outer to inner):
file
function void UPlayerInput::SetAxisProperties
Source code excerpt:
void UPlayerInput::SetAxisProperties(const FKey AxisKey, const FInputAxisProperties& InAxisProperties)
{
for (FInputAxisConfigEntry& AxisConfigEntry : AxisConfig)
{
if (AxisConfigEntry.AxisKeyName == AxisKey)
{
AxisConfigEntry.AxisProperties = InAxisProperties;
}
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UserInterface/PlayerInput.cpp:772
Scope (from outer to inner):
file
function void UPlayerInput::ForceRebuildingKeyMaps
Source code excerpt:
if (InputSettings)
{
AxisConfig = InputSettings->AxisConfig;
AxisMappings = InputSettings->GetAxisMappings();
ActionMappings = InputSettings->GetActionMappings();
//append on speech action mappings
const TArray<FInputActionSpeechMapping>& SpeechMappings = InputSettings->GetSpeechMappings();
for (const FInputActionSpeechMapping& SpeechMapping : SpeechMappings)
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Private/UserInterface/PlayerInput.cpp:2132
Scope (from outer to inner):
file
function void UPlayerInput::ConditionalInitAxisProperties
Source code excerpt:
{
// move stuff from config structure to our runtime structure
for (const FInputAxisConfigEntry& AxisConfigEntry : AxisConfig)
{
const FKey AxisKey = AxisConfigEntry.AxisKeyName;
if (AxisKey.IsValid())
{
AxisProperties.Add(AxisKey, AxisConfigEntry.AxisProperties);
}
#Loc: <Workspace>/Engine/Source/Runtime/Engine/Public/SkeletalDebugRendering.h:44
Scope: file
Source code excerpt:
FLinearColor SelectedBoneColor;
FLinearColor ParentOfSelectedBoneColor;
FBoneAxisDrawConfig AxisConfig;
};
namespace SkeletalDebugRendering
{
static const int32 NumSphereSides = 10;
static const int32 NumConeSides = 4;