Modo de entrada y TWeakObjectPtr
Representar claramente la entrada de la interfaz de usuario y la vida útil del UObject
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
Cuando abre la interfaz de usuario, el mouse funciona, pero puede haber un problema en el que todos los atajos de teclado están bloqueados. La pizarra de ProjectDT tenía que recibir continuamente entradas del teclado mientras manipulaba la interfaz de usuario.
Elija el modo de entrada según su propósito.
FInputModeGameAndUI InputMode;
InputMode.SetHideCursorDuringCapture(false);
PlayerController->SetInputMode(InputMode);
PlayerController->bShowMouseCursor = true;
FInputModeUIOnlyes adecuado cuando se centra en la interfaz de usuario, pero puede ser demasiado fuerte para pantallas que también requieren entradas clave en el lado del juego. FInputModeGameAndUIMantiene la interfaz de usuario y la entrada del juego juntas.
También es importante en qué widget se centra la atención. Si EditableTextBox consume pulsaciones de teclas, es posible que el acceso directo no se pase al PlayerController.
Los objetos que no es necesario sostener durante mucho tiempo son indicadores débiles.
Aunque el subsistema UI actualmente recuerda MainWidget y WhiteBoard, no necesita poseer la vida útil de esos objetos.
TWeakObjectPtr<UMainWidget> MainUI;
TWeakObjectPtr<UInvestigateWhiteBoard> ActiveWhiteBoard;
TObjectPtrrastrea las referencias de UObject y puede afectar la supervivencia de objetos con referencias fuertes. TWeakObjectPtrdeja de ser válido cuando el objeto se destruye, así que compruébelo antes de usarlo.
if (UMainWidget* Widget = MainUI.Get())
{
Widget->ShowOverlay();
}
El definidor en línea de un puntero débil que apunta a un tipo declarado hacia adelante puede provocar un error de compilación. Es más seguro dejar solo la declaración en el encabezado y asignarla en un CPP que incluya la definición completa del tipo.
El modo de entrada y el tipo de puntero no son elecciones sintácticas triviales. Es una opción expresar en código quién recibirá la entrada y quién será el propietario de la vida útil del objeto.