Athrun Aslan 2022-05-14 11:02:48 阅读数:421
C'est une illusion.5Nouveau plug - in de fonctionnalitésEnhanced InputApprentissage de l'utilisation et interprétation du cadre de code,Le système sera analysé à la fois du point de vue de l'application et du niveau inférieur..
Enhanced InputC'est une illusion.InputExtension du système,L'idée et l'origine du traitement de l'entréeInputLes idées du système sur le processus sont cohérentes.La différence est que,Certains concepts de base sont extraits et abstraits,Par exemple:ActionEtAction Context.Plus que ça,Sous le nouveau cadre,Plus de fonctionnalités disponibles,Comme le contact et la pression continue vers le bas, etc..
Enhanced InputEst fourni sous forme de plug - in intégré,InPluginsPanel,Vérifier et redémarrer le moteur pour activer:
InContentBrowserClic droit,Vous pouvez voir qu'il est apparuInputNouvelles entrées pertinentes,SurtoutInputActionActifs etInputMapContextActifs, Description le plug - in a été activé avec succès .
Ensuite, vous devez aller à la configuration du projet Input Dans la colonne , Modifier les paramètres de la classe par défaut :
Par la suite, Au niveau du Code, il est nécessaire de Build.cs Ajouter le module de dépendance approprié au fichier :
public class InsideEnhancedInput : ModuleRules
{
public InsideEnhancedInput(ReadOnlyTargetRules Target) : base(Target)
{
...
PrivateDependencyModuleNames.AddRange(new string[] {"EnhancedInput"});
}
}
Voilà.,Peu importe.Editor Toujours dans le Code du projet ,Nous sommes tous libres d'utiliserEnhanced InputC'est tout..
L'entrée du modèle de troisième personne est principalement définie par Input->Bindings L'interface lie la chaîne d'entrée à la clé , Encore dans le Code / Le plan directeur pour l'action (Utiliser une chaîne) Lier les événements de rappel appropriés .
Code de liaison d'entrée correspondant :
//
// Input
void AInsideEnhancedInputCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
// Set up gameplay key bindings
check(PlayerInputComponent);
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
PlayerInputComponent->BindAxis("Move Forward / Backward", this, &AInsideEnhancedInputCharacter::MoveForward);
PlayerInputComponent->BindAxis("Move Right / Left", this, &AInsideEnhancedInputCharacter::MoveRight);
// We have 2 versions of the rotation bindings to handle different kinds of devices differently
// "turn" handles devices that provide an absolute delta, such as a mouse.
// "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick
PlayerInputComponent->BindAxis("Turn Right / Left Mouse", this, &APawn::AddControllerYawInput);
PlayerInputComponent->BindAxis("Turn Right / Left Gamepad", this, &AInsideEnhancedInputCharacter::TurnAtRate);
PlayerInputComponent->BindAxis("Look Up / Down Mouse", this, &APawn::AddControllerPitchInput);
PlayerInputComponent->BindAxis("Look Up / Down Gamepad", this, &AInsideEnhancedInputCharacter::LookUpAtRate);
// handle touch devices
PlayerInputComponent->BindTouch(IE_Pressed, this, &AInsideEnhancedInputCharacter::TouchStarted);
PlayerInputComponent->BindTouch(IE_Released, this, &AInsideEnhancedInputCharacter::TouchStopped);
}
Créer d'abord les actifs liés à l'entrée ,Y compris:5- Oui.InputAction:
IA_MoveForward Exemple de répartition des actifs d'action :
Recréer1- Oui.InputMappingContext, Ajouter un certain nombre de nouveaux actifs d'action créés précédemment ( N'oubliez pas d'inverser l'une des touches correspondant à l'axe Negate
Fonctionnement, Sinon, les deux touches correspondront au même comportement ,Par exemple:MoveForward- Oui.S Clé inversée ), Et ajouter la liaison clé correspondante :
Tous les actifs de ContentBrowser Affichage sous la vue :
Niveau de code,EntréeCharacterCatégorie( Personnalisation héritée de CharacterCatégorie), Réécrivez une partie de ce code :
UCLASS(config=Game)
class AInsideEnhancedInputCharacter : public ACharacter
{
...
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category="EnhancedInput")
UInputMappingContext* InputMappingContext;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category="EnhancedInput|Action")
UInputAction* IA_MoveForward;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category="EnhancedInput|Action")
UInputAction* IA_MoveRight;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category="EnhancedInput|Action")
UInputAction* IA_Turn;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category="EnhancedInput|Action")
UInputAction* IA_LookUp;
UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category="EnhancedInput|Action")
UInputAction* IA_Jump;
protected:
/** Called for forwards/backward input */
void MoveForward(const FInputActionValue& Value);
/** Called for side to side input */
void MoveRight(const FInputActionValue& Value);
/**
* Called via input to turn at a given rate.
* @param Rate This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
*/
void TurnAtRate(const FInputActionValue& Value);
/**
* Called via input to turn look up/down at a given rate.
* @param Rate This is a normalized rate, i.e. 1.0 means 100% of desired turn rate
*/
void LookUpAtRate(const FInputActionValue& Value);
...
...
void AInsideEnhancedInputCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
// Conserver l'originalInput Réponse d'entrée du système
Super::SetupPlayerInputComponent(PlayerInputComponent);
if(APlayerController* PC = CastChecked<APlayerController>(GetController()))
{
if(UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PC->GetLocalPlayer()))
{
Subsystem->AddMappingContext(InputMappingContext, 100);
}
}
if(UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
{
if(IA_MoveForward)
{
EnhancedInputComponent->BindAction(IA_MoveForward, ETriggerEvent::Triggered, this, &AInsideEnhancedInputCharacter::MoveForward);
}
if(IA_MoveRight)
{
EnhancedInputComponent->BindAction(IA_MoveRight, ETriggerEvent::Triggered, this, &AInsideEnhancedInputCharacter::MoveRight);
}
if(IA_Turn)
{
EnhancedInputComponent->BindAction(IA_Turn, ETriggerEvent::Triggered, this, &AInsideEnhancedInputCharacter::TurnAtRate);
}
if(IA_LookUp)
{
EnhancedInputComponent->BindAction(IA_LookUp, ETriggerEvent::Triggered, this, &AInsideEnhancedInputCharacter::LookUpAtRate);
}
if(IA_Jump)
{
EnhancedInputComponent->BindAction(IA_Jump, ETriggerEvent::Started, this, &AInsideEnhancedInputCharacter::Jump);
EnhancedInputComponent->BindAction(IA_Jump, ETriggerEvent::Completed, this, &AInsideEnhancedInputCharacter::StopJumping);
}
}
}
...
void AInsideEnhancedInputCharacter::TurnAtRate(const FInputActionValue& Value)
{
// calculate delta for this frame from the rate information
AddControllerYawInput(Value.GetMagnitude() * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}
void AInsideEnhancedInputCharacter::LookUpAtRate(const FInputActionValue& Value)
{
// calculate delta for this frame from the rate information
AddControllerPitchInput(Value.GetMagnitude() * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}
void AInsideEnhancedInputCharacter::MoveForward(const FInputActionValue& Value)
{
if ((Controller != nullptr) && (Value.IsNonZero()))
{
// find out which way is forward
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// get forward vector
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
AddMovementInput(Direction, Value.GetMagnitude());
}
}
void AInsideEnhancedInputCharacter::MoveRight(const FInputActionValue& Value)
{
if ( (Controller != nullptr) && (Value.IsNonZero()) )
{
// find out which way is right
const FRotator Rotation = Controller->GetControlRotation();
const FRotator YawRotation(0, Rotation.Yaw, 0);
// get right vector
const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
// add movement in that direction
AddMovementInput(Direction, Value.GetMagnitude());
}
}
Voilà.,Après compilation,En conséquenceCharacter Interface Blueprint , Peut être lié :
Vidéo de l'effet final :
Par ici., Nous utilisons essentiellement EnhancedInput Achèvement de la modification du modèle de troisième personne .
Bien sûr que ce n'est pas fini, Si vous pouviez juste finir ce que vous avez déjà fait , Ça n'explique pas la nécessité de ce nouveau truc . Ensuite, nous introduisons progressivement des caractéristiques différentes .
Résumé succinct,InEnhancedInput Sous extension du système d'entrée , Nous avons des actifs supplémentaires qui peuvent être configurés pour fonctionner , C'est que nous pouvons faire quelque chose de spécial quand nous pouvons mettre en œuvre l'entrée ,Par exemple,IMC Vous pouvez configurer la cartographie des actions et des touches , Vous pouvez spécifier quelles entrées sont valides ;Par exemple,IA Définissons les actions une par une ;Par exemple,ModifierEtTrigger Vous pouvez configurer les conditions d'entrée en vigueur des touches et les effets d'entrée en vigueur, etc .
Le développement de jeux ordinaires n'a pas besoin de connaître les parties du Code de base , Il est déjà difficile de maîtriser son utilisation , La lecture du Code approfondit encore la configuration d'entrée 、 Compréhension du processus d'entrée des réponses , Mais si l'on examine l'origine de son but , J'espère encore améliorer ma compréhension du moteur ,Améliorer sa capacité globale.
Illusoire 5.0 Documentation - Input
Illusoire 5.0 Documentation - Lyra Input Settings
L'auteur Yimi81 Article de《UE5 – EnhancedInput( Système d'entrée amélioré )》
Fiction en direct en chinois No39Période
Copyright:Cet article est[Athrun Aslan]Établi,Veuillez apporter le lien original pour réimprimer,remercier。 https://fra.fheadline.com/2022/134/202205141100542127.html