qa fix (wip): input assets hard-referenced, static site collision, spawn on sidewalk
Carries the QA fixes for the walkable demo off main onto an error-fixing branch so a live window can be tested without blocking the clean main. - GigLineCharacter: hard-reference the Enhanced Input assets via ConstructorHelpers so the cooker includes /Game/Input (they were soft-only and pruned from the pak -> no inputs bound). Push the mapping context on a deferred timer after possession. - defaultgame.ini: +DirectoriesToAlwaysCook for /Game/Input, Hollywood, Test. - ue_build_demo_map.py: stage site meshes STATIC with explicit collision (QUERY_AND_PHYSICS, WorldStatic, BlockAll); hero facade STATIC; PlayerStart moved onto the north sidewalk at Y -1200. - DemoMap.umap rebuilt with the above. STATUS: packaged build now logs all input assets ok and grounded=1/Walking, so falling + input-nil are fixed in the package; the user still hit a stuck window (no mouse/keys) in one test, so this remains WIP pending a clean interactive run.
This commit is contained in:
1 parent
fee26ade10
commit
3709530977
3 files changed
+84
-45
No files matched your search
@@ -9,6 +9,9 @@
|
||||
#include "InputAction.h"
|
||||
#include "GameFramework/PlayerController.h"
|
||||
#include "InputMappingContext.h"
|
||||
#include "Components/CapsuleComponent.h"
|
||||
#include "Engine/World.h"
|
||||
#include "TimerManager.h"
|
||||
|
||||
AGigLineCharacter::AGigLineCharacter()
|
||||
{
|
||||
@@ -39,51 +42,56 @@ AGigLineCharacter::AGigLineCharacter()
|
||||
GetMesh()->SetHiddenInGame(true);
|
||||
GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision);
|
||||
|
||||
// Input assets are created by Tools/ue_create_input_assets.py. They are loaded in
|
||||
// BeginPlay rather than the constructor: the constructor runs during CDO
|
||||
// construction where asset loads are unreliable, and a missing asset should be
|
||||
// a loud warning, not a silent no-op.
|
||||
}
|
||||
// Hard-reference the Enhanced Input assets with ConstructorHelpers so the
|
||||
// cooker always includes them and they load during CDO construction. Runtime
|
||||
// soft-loading them at BeginPlay was fragile: the assets were pruned from the
|
||||
// pak unless /Game/Input was force-cooked, and a soft path can miss while the
|
||||
// IoStore registry is still mounting. A constructor FObjectFinder is a hard
|
||||
// reference (followed by the cooker) and loads deterministically.
|
||||
// Assets are created by Tools/ue_create_input_assets.py.
|
||||
static ConstructorHelpers::FObjectFinder<UInputMappingContext> CtxFinder(
|
||||
TEXT("/Game/Input/IMC_Default.IMC_Default"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> MoveF(
|
||||
TEXT("/Game/Input/IA_Move.IA_Move"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> StrafeF(
|
||||
TEXT("/Game/Input/IA_Strafe.IA_Strafe"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> BackF(
|
||||
TEXT("/Game/Input/IA_MoveBack.IA_MoveBack"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> LeftF(
|
||||
TEXT("/Game/Input/IA_StrafeLeft.IA_StrafeLeft"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> LookF(
|
||||
TEXT("/Game/Input/IA_Look.IA_Look"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> JumpF(
|
||||
TEXT("/Game/Input/IA_Jump.IA_Jump"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> ResetF(
|
||||
TEXT("/Game/Input/IA_Reset.IA_Reset"));
|
||||
static ConstructorHelpers::FObjectFinder<UInputAction> PauseF(
|
||||
TEXT("/Game/Input/IA_Pause.IA_Pause"));
|
||||
|
||||
void AGigLineCharacter::LoadInputAssets()
|
||||
{
|
||||
auto LoadSoft = [](const TCHAR* Path) -> TObjectPtr<UObject>
|
||||
{
|
||||
return LoadObject<UObject>(nullptr, Path);
|
||||
};
|
||||
MappingContext = Cast<UInputMappingContext>(LoadSoft(TEXT("/Game/Input/IMC_Default.IMC_Default")));
|
||||
MoveAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_Move.IA_Move")));
|
||||
StrafeAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_Strafe.IA_Strafe")));
|
||||
MoveBackAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_MoveBack.IA_MoveBack")));
|
||||
StrafeLeftAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_StrafeLeft.IA_StrafeLeft")));
|
||||
LookAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_Look.IA_Look")));
|
||||
JumpAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_Jump.IA_Jump")));
|
||||
ResetAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_Reset.IA_Reset")));
|
||||
PauseAction = Cast<UInputAction>(LoadSoft(TEXT("/Game/Input/IA_Pause.IA_Pause")));
|
||||
MappingContext = CtxFinder.Object;
|
||||
MoveAction = MoveF.Object;
|
||||
StrafeAction = StrafeF.Object;
|
||||
MoveBackAction = BackF.Object;
|
||||
StrafeLeftAction = LeftF.Object;
|
||||
LookAction = LookF.Object;
|
||||
JumpAction = JumpF.Object;
|
||||
ResetAction = ResetF.Object;
|
||||
PauseAction = PauseF.Object;
|
||||
|
||||
if (!MappingContext || !MoveAction || !MoveBackAction || !StrafeAction || !StrafeLeftAction
|
||||
|| !LookAction)
|
||||
{
|
||||
UE_LOG(LogTemp, Warning,
|
||||
TEXT("GigLine: input assets missing (context=%s move=%s look=%s). ")
|
||||
TEXT("Run Tools/ue_create_input_assets.py to build /Game/Input."),
|
||||
MappingContext ? TEXT("ok") : TEXT("missing"),
|
||||
(MoveAction && MoveBackAction && StrafeAction && StrafeLeftAction) ? TEXT("ok")
|
||||
: TEXT("missing"),
|
||||
LookAction ? TEXT("ok") : TEXT("missing"));
|
||||
TEXT("GigLine: input assets failed to load at construction. ")
|
||||
TEXT("Run Tools/ue_create_input_assets.py to build /Game/Input."));
|
||||
}
|
||||
}
|
||||
|
||||
void AGigLineCharacter::BeginPlay()
|
||||
void AGigLineCharacter::LoadInputAssets()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
LoadInputAssets();
|
||||
|
||||
StartLocation = GetActorLocation();
|
||||
StartRotation = GetActorRotation();
|
||||
|
||||
// Push the mapping context for this local player.
|
||||
// The assets are hard-referenced and loaded in the constructor; this deferred
|
||||
// call pushes the now-valid mapping context to the local player, after the
|
||||
// pawn has been possessed and its PlayerController exists.
|
||||
if (MappingContext)
|
||||
{
|
||||
if (const APlayerController* PC = Cast<APlayerController>(GetController()))
|
||||
@@ -97,6 +105,20 @@ void AGigLineCharacter::BeginPlay()
|
||||
}
|
||||
}
|
||||
|
||||
void AGigLineCharacter::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
StartLocation = GetActorLocation();
|
||||
StartRotation = GetActorRotation();
|
||||
|
||||
// Input assets are hard-referenced in the constructor. Defer the mapping
|
||||
// context push to just after spawn, when the PlayerController exists and a
|
||||
// packaged game has finished mounting its pak IoStore.
|
||||
FTimerHandle InputHandle;
|
||||
GetWorldTimerManager().SetTimer(InputHandle, this, &AGigLineCharacter::LoadInputAssets, 1.0f, false);
|
||||
}
|
||||
|
||||
void AGigLineCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
|
||||
{
|
||||
Super::SetupPlayerInputComponent(PlayerInputComponent);
|
||||
|
||||
Reference in new issue
Block a user