在这个教程中,我们将学习在虚幻引擎中如何使用C创建第一人称角色。 1、第一人称游戏机制 在视频游戏中,第一人称(FirstPerson)是对游戏玩家角色视点的图形渲染。当今最流行的第一人称游戏类型包括第一人称射击游戏、基于模拟的系统如飞行模拟器等。在这里,游戏玩家无法看到实际的游戏角色网格。虽然他们可能会看到一些零件,如手,武器等。此外,具有第一人称视角的游戏也不需要复杂的动画。2、第一人称游戏示例 VillageBioHazard8(2021) HaloInfinite(2021) BioHazard7(2017) 3、使用虚幻引擎创建第一人称角色 我们将使用C创建一个第一人称角色,然后基于该C类创建子蓝图类。我们要创建的角色将如下所示: 这里你可以看到摄像机充当了视点,并为玩家提供第一人称视角视图。胶囊组件以及骨架网格组件、角色移动组件提供了有关角色移动的属性,如行走速度、跳跃Z速度、重力等,默认情况下与虚幻引擎中的角色类一起出现。 打开C类文件夹,然后右键单击创建新C类 选择角色类并为C类命名,然后单击创建。 现在,虚幻编辑器将打开源代码编辑器。 打开C类的头文件,可以看到它已经附带了一些用于构造函数和覆盖方法的模板代码,例如在游戏启动时调用的BeginPlay()和为每帧调用的Tick()。在public或protected部分中添加以下函数声明。在这里,每种方法都对应于角色的特定运动。 然后为UCameraComponent声明一个实例,该实例充当摄像机以提供第一人称视角。在这里,我们指定了UPROPERTY()宏,它告诉虚幻引擎的反射系统,给定的属性应该在基于这个C类创建的蓝图类中可访问。UPROPERTY(EditAnywhere,CategoryComponents)UCameraComponentCamera; 注意:请确保导入必要的头文件。 整个头文件代码如下所示:FilloutyourcopyrightnoticeintheDescriptionpageofProjectSettings。pragmaonceincludeCoreMinimal。hincludeGameFrameworkCharacter。hincludeCameraCameraComponent。hincludeFirstPersonPlayerCharacter。generated。hUCLASS()classFIRSTPERSONCHARACTERAPIAFirstPersonPlayerCharacter:publicACharacter{GENERATEDBODY()public:SetsdefaultvaluesforthischaracterspropertiesAFirstPersonPlayerCharacter();protected:CalledwhenthegamestartsorwhenspawnedvirtualvoidBeginPlay()override;UPROPERTY(EditAnywhere,CategoryComponents)UCameraComponentCamera;public:CalledeveryframevirtualvoidTick(floatDeltaTime)override;CalledtobindfunctionalitytoinputvirtualvoidSetupPlayerInputComponent(classUInputComponentPlayerInputComponent)override;voidLookRightLeft(floataxisvalue);voidLookUpDown(floataxisvalue);voidMoveForwardBackward(floataxisvalue);voidMoveRightLeft(floataxisvalue);voidBeginCrouch();voidEndCrouch();}; 现在打开项目设置,在input部分,我们添加键绑定以使用键盘和鼠标作为输入设备来控制角色: 现在打开FirstPerson角色类的CPP文件,该文件具有在头文件中声明的构造函数,BeginPlay()和Tick()函数的实现。 现在,我们需要在构造函数中初始化相机实例:AFirstPersonPlayerCharacter::AFirstPersonPlayerCharacter(){SetthischaractertocallTick()everyframe。Youcanturnthisofftoimproveperformanceifyoudontneedit。PrimaryActorTick。bCanEverTicktrue;CameraCreateDefaultSubobjectUCameraComponent(TEXT(PlayerCamera));CameraSetupAttachment(RootComponent);thisGetCharacterMovement()GetNavAgentPropertiesRef()。bCanCrouchtrue;} 在这里,我们使用CreateDefaultSubobject()模板方法来创建实际的相机组件,该方法通过指定组件类类型来创建实际组件,在我们的例子中它是一个相机组件,所以使用UCameraComponent类,并在TEXT()宏中传入组件的名称。然后,我们将相机附加到根组件,该组件是角色类中的胶囊组件。然后,为了让我们的角色蹲下,我们将角色移动类的蹲伏属性(crouch)设置为true。 接下来,为头文件中声明的方法创建实现代码:voidAFirstPersonPlayerCharacter::LookRightLeft(floataxisvalue){thisAddControllerYawInput(axisvalue);}voidAFirstPersonPlayerCharacter::LookUpDown(floataxisvalue){thisAddControllerPitchInput(axisvalue);}voidAFirstPersonPlayerCharacter::MoveForwardBackward(floataxisvalue){thisAddMovementInput(thisGetActorForwardVector()axisvalue);}voidAFirstPersonPlayerCharacter::MoveRightLeft(floataxisvalue){thisAddMovementInput(thisGetActorRightVector()axisvalue);}voidAFirstPersonPlayerCharacter::BeginCrouch(){thisCrouch();}voidAFirstPersonPlayerCharacter::EndCrouch(){thisUnCrouch();} AddMovementInput():此方法沿给定的世界方向矢量(通常归一化)添加移动输入,按ScaleValue的值缩放。如果ScaleValue0,则移动方向相反。scale值是函数中的轴值参数。其值范围为1。0f至1。0f。 此方法有一个FVector类型的参数WorldDirection。对于前后移动,我们获取角色的前向向量并将其乘以比例值。在我们的例子中,当玩家按W时,比例值将为1。0f,乘以向前矢量,它成为ve矢量,玩家向前移动类似,当玩家按S时,比例值将为1。0f,乘以向前矢量,它成为ve矢量,玩家向后移动相同的概念应用于左右移动。 AddControllerPitchInput():围绕Y轴的旋转被称为俯仰,它处理角色的上下观察。AddControllerYawInput():旋转的Z轴称为偏航,它处理角色的左右观察。Crouch()和Uncrouch()这两个方法是角色类的内置方法,用于执行蹲伏和取消蹲伏操作。 接下来,我们需要将输入键与这些函数挂钩。它可以通过使用角色类的SetupPlayerInputComponent(UInputComponentPlayerInputComponent)方法来完成,因为角色类是pawn类的子类。在该函数中,在下面添加此代码行:PlayerInputComponentBindAxis(TEXT(Horizontal),this,AFirstPersonPlayerCharacter::LookRightLeft);PlayerInputComponentBindAxis(TEXT(Vertical),this,AFirstPersonPlayerCharacter::LookUpDown);PlayerInputComponentBindAxis(TEXT(ForwardBackward),this,AFirstPersonPlayerCharacter::MoveForwardBackward);PlayerInputComponentBindAxis(TEXT(RightLeft),this,AFirstPersonPlayerCharacter::MoveRightLeft);PlayerInputComponentBindAction(TEXT(Jump),IEPressed,this,ACharacter::Jump);PlayerInputComponentBindAction(TEXT(Crouch),IEPressed,this,AFirstPersonPlayerCharacter::BeginCrouch);PlayerInputComponentBindAction(TEXT(Crouch),IEReleased,this,AFirstPersonPlayerCharacter::EndCrouch); 在这里,我们设置实际的轴输入和动作输入,并传递要调用的函数引用将它们与移动函数挂钩。 现在编译代码并在ue4编辑器中打开C文件夹,右键单击并基于此C类创建蓝图。 打开蓝图,确保勾选相机选项中的UsePawnControlRotation。这将允许相机在充当控制器时根据鼠标移动进行旋转。 完整的FirtPersonPlayerCharacter。cpp代码:FilloutyourcopyrightnoticeintheDescriptionpageofProjectSettings。includeFirstPersonPlayerCharacter。hincludeDrawDebugHelpers。hincludeEngineWorld。hincludeKismetGameplayStatics。hincludeGameFrameworkPlayerController。hincludeGameFrameworkCharacterMovementComponent。hincludeComponentsInputComponent。hSetsdefaultvaluesAFirstPersonPlayerCharacter::AFirstPersonPlayerCharacter(){SetthischaractertocallTick()everyframe。Youcanturnthisofftoimproveperformanceifyoudontneedit。PrimaryActorTick。bCanEverTicktrue;CameraCreateDefaultSubobjectUCameraComponent(TEXT(PlayerCamera));CameraSetupAttachment(RootComponent);thisGetCharacterMovement()GetNavAgentPropertiesRef()。bCanCrouchtrue;PhysicsHandleCreateDefaultSubobjectUPhysicsHandleComponent(TEXT(Hand));HoldingSocketCreateDefaultSubobjectUSceneComponent(TEXT(HoldingSocket));}CalledwhenthegamestartsorwhenspawnedvoidAFirstPersonPlayerCharacter::BeginPlay(){Super::BeginPlay();if(PhysicsHandlenullptr){UELOG(LogTemp,Warning,TEXT(Gotit));}}CalledeveryframevoidAFirstPersonPlayerCharacter::Tick(floatDeltaTime){Super::Tick(DeltaTime);}}CalledtobindfunctionalitytoinputvoidAFirstPersonPlayerCharacter::SetupPlayerInputComponent(UInputComponentPlayerInputComponent){Super::SetupPlayerInputComponent(PlayerInputComponent);PlayerInputComponentBindAxis(TEXT(Horizontal),this,AFirstPersonPlayerCharacter::LookRightLeft);PlayerInputComponentBindAxis(TEXT(Vertical),this,AFirstPersonPlayerCharacter::LookUpDown);PlayerInputComponentBindAxis(TEXT(ForwardBackward),this,AFirstPersonPlayerCharacter::MoveForwardBackward);PlayerInputComponentBindAxis(TEXT(RightLeft),this,AFirstPersonPlayerCharacter::MoveRightLeft);PlayerInputComponentBindAction(TEXT(Jump),IEPressed,this,ACharacter::Jump);PlayerInputComponentBindAction(TEXT(Crouch),IEPressed,this,AFirstPersonPlayerCharacter::BeginCrouch);PlayerInputComponentBindAction(TEXT(Crouch),IEReleased,this,AFirstPersonPlayerCharacter::EndCrouch);}voidAFirstPersonPlayerCharacter::LookRightLeft(floataxisvalue){thisAddControllerYawInput(axisvalue);}voidAFirstPersonPlayerCharacter::LookUpDown(floataxisvalue){thisAddControllerPitchInput(axisvalue);}voidAFirstPersonPlayerCharacter::MoveForwardBackward(floataxisvalue){thisAddMovementInput(thisGetActorForwardVector()axisvalue);}voidAFirstPersonPlayerCharacter::MoveRightLeft(floataxisvalue){thisAddMovementInput(thisGetActorRightVector()axisvalue);}voidAFirstPersonPlayerCharacter::BeginCrouch(){thisCrouch();}voidAFirstPersonPlayerCharacter::EndCrouch(){thisUnCrouch();} 原文链接:http:www。bimant。comblogue4firstpersoncharacter