Implement sprinting

This commit is contained in:
2026-05-15 12:51:23 -07:00
parent cd8de0f906
commit 9eed8c5483
8 changed files with 286 additions and 3 deletions
+88
View File
@@ -0,0 +1,88 @@
import unreal
def load(path):
asset = unreal.EditorAssetLibrary.load_asset(path)
if not asset:
raise RuntimeError(f"Could not load {path}")
return asset
def create_input_action(path):
existing = unreal.EditorAssetLibrary.load_asset(path)
if existing:
return existing
template_path = "/Game/Input/Actions/IA_Interact"
template = unreal.EditorAssetLibrary.load_asset(template_path)
if not template:
template_path = "/Game/Input/Actions/IA_Jump"
template = unreal.EditorAssetLibrary.load_asset(template_path)
if not template:
raise RuntimeError("Could not load an input action template")
action = unreal.EditorAssetLibrary.duplicate_asset(template_path, path)
if not action:
raise RuntimeError(f"Could not create {path}")
return action
def set_boolean_value_type(action):
action.set_editor_property("value_type", unreal.InputActionValueType.BOOLEAN)
try:
action.set_editor_property("triggers", [])
except Exception as exc:
unreal.log_warning(f"Could not clear sprint triggers; keeping template defaults: {exc}")
unreal.EditorAssetLibrary.save_loaded_asset(action)
def mapping_exists(context, action, key_name):
mapping_data = context.get_editor_property("default_key_mappings")
for mapping in list(mapping_data.get_editor_property("mappings")):
mapping_key = mapping.get_editor_property("key")
if (
mapping.get_editor_property("action") == action
and str(mapping_key.get_editor_property("key_name")) == key_name
):
return True
return False
def map_key(context, action, key_name):
if mapping_exists(context, action, key_name):
unreal.log(f"Mapping already exists: {action.get_name()} -> {key_name}")
return
key = unreal.Key()
key.set_editor_property("key_name", key_name)
mapping_data = context.get_editor_property("default_key_mappings")
mappings = list(mapping_data.get_editor_property("mappings"))
new_mapping = unreal.EnhancedActionKeyMapping()
new_mapping.set_editor_property("action", action)
new_mapping.set_editor_property("key", key)
mappings.append(new_mapping)
mapping_data.set_editor_property("mappings", mappings)
context.set_editor_property("default_key_mappings", mapping_data)
unreal.log(f"Added mapping: {action.get_name()} -> {key_name}")
def main():
sprint_action = create_input_action("/Game/Input/Actions/IA_Sprint")
set_boolean_value_type(sprint_action)
context = load("/Game/Input/IMC_Default")
map_key(context, sprint_action, "LeftShift")
map_key(context, sprint_action, "Gamepad_LeftThumbstick")
unreal.EditorAssetLibrary.save_loaded_asset(context)
character_bp = load("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter")
character_cdo = unreal.get_default_object(character_bp.generated_class())
character_cdo.set_editor_property("SprintAction", sprint_action)
unreal.EditorAssetLibrary.save_loaded_asset(character_bp)
unreal.log("Agrarian sprint input setup complete.")
main()
+44
View File
@@ -0,0 +1,44 @@
import unreal
def load(path):
asset = unreal.EditorAssetLibrary.load_asset(path)
if not asset:
raise RuntimeError(f"Could not load {path}")
return asset
def mapping_found(context, action, key_name):
mapping_data = context.get_editor_property("default_key_mappings")
for mapping in list(mapping_data.get_editor_property("mappings")):
mapping_key = mapping.get_editor_property("key")
if (
mapping.get_editor_property("action") == action
and str(mapping_key.get_editor_property("key_name")) == key_name
):
return True
return False
def main():
action = load("/Game/Input/Actions/IA_Sprint")
context = load("/Game/Input/IMC_Default")
character_bp = load("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter")
character_cdo = unreal.get_default_object(character_bp.generated_class())
missing = []
for key_name in ["LeftShift", "Gamepad_LeftThumbstick"]:
if not mapping_found(context, action, key_name):
missing.append(f"missing mapping {key_name}")
assigned_action = character_cdo.get_editor_property("SprintAction")
if assigned_action != action:
missing.append("BP_ThirdPersonCharacter SprintAction is not IA_Sprint")
if missing:
raise RuntimeError("Sprint input verification failed: " + "; ".join(missing))
unreal.log("Agrarian sprint input verification complete.")
main()