UnrealEngine5 如何为 FPS 游戏设置角色

前言

FPS 是第一人称射击游戏的简称,从反恐精英开始,FPS 游戏已经成为了大热门游戏的首选,今天就让我带大家使用虚幻5(UnrealEngine5)来制作一款简单的FPS游戏吧!

准备

工程创建

打开我们 UE5 的编辑器,选择第一人称射击游戏,选择 C++,设置好您的工程名称,然后创建游戏,我的工程命名叫ROTD。

资源准备

虚幻5的安装我在这里就不铺开给大家演示了,大家可以自行去官方文档了解。 今天文章中所用到的 FPS 的资源均来自于在 Epic 商城,分别如下:

如果大家对这个资源感兴趣的话,可以联系我。

将下载好的资源放入工程的 Content 文件夹下,然后运行我们的工程。

角色蓝图

创建一个蓝图对象,然后继承自父类 ROTDCharacter,命名为 Henry_BP, 因为我给我的角色取名叫亨利,源自于我之前看过的一个电影硬核亨利,如图:

打开 Henry_BP,然后再选中 Viewport 窗口,为其添加 Skeletal Mesh, 我这里用到的骨骼网格体如图:

添加进去后,调整 Mesh 1P 和摄像机的位置如图:

这里的组件名称都是我们在C++代码中设置的名称,大家可以在 xxxCharacter.cpp 中看到:

.h 头文件

C++ 复制代码
	/** Pawn mesh: 1st person view (arms; seen only by self) */
	UPROPERTY(VisibleDefaultsOnly, Category=Mesh)
	USkeletalMeshComponent* Mesh1P;

	/** First person camera */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	UCameraComponent* FirstPersonCameraComponent;

.cpp 文件

C++ 复制代码
AROTDCharacter::AROTDCharacter()
{
	// Set size for collision capsule
	GetCapsuleComponent()->InitCapsuleSize(55.f, 96.0f);

	// set our turn rates for input
	TurnRateGamepad = 45.f;

	// Create a CameraComponent	
	FirstPersonCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
	FirstPersonCameraComponent->SetupAttachment(GetCapsuleComponent());
	FirstPersonCameraComponent->SetRelativeLocation(FVector(-39.56f, 1.75f, 64.f)); // Position the camera
	FirstPersonCameraComponent->bUsePawnControlRotation = true;

	// Create a mesh component that will be used when being viewed from a '1st person' view (when controlling this pawn)
	Mesh1P = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("CharacterMesh1P"));
	Mesh1P->SetOnlyOwnerSee(true);
	Mesh1P->SetupAttachment(FirstPersonCameraComponent);
	Mesh1P->bCastDynamicShadow = false;
	Mesh1P->CastShadow = false;
	Mesh1P->SetRelativeRotation(FRotator(1.9f, -19.19f, 5.2f));
	Mesh1P->SetRelativeLocation(FVector(-0.5f, -4.4f, -155.7f));

}

加上骨骼后,接下来就要给它添加动画了,接着往下看。

动画蓝图

创建一个动画蓝图,双击打开,为其添加三个 Bool 型的变量,如图:

分别代表当前是否在移动,是否跳跃,以及是否在奔跑。

随后,我们为其创建站立,走路奔跑以及跳跃的动画状态机,如图:

每个状态中都去关联对应的动画,这里关联的动画关键字为 Empty_Hand.

随后,打开 EventGraph 为其添加蓝图逻辑,如图所示:

这里解释一下:

1.通过 TryGetPawnOwner 节点获取 Pawn ,然后将其Cast为我们的蓝图对象 Henry_BP,这样我们才能获取它里面的值 2.GetVelocity节点的VectorLength可以判断角色是否在移动,如果 > 0, 就设置 IsMoving 为 true 3.同理,通过Character Movement 的 isFalling 值,可以判断玩家是否跳跃 4.IsRunning 是通过按住 Shift 键来判断是否设置为true 或 false

随后回到我们的角色蓝图中,为角色添加动画蓝图,如图:

角色的移动,也已经在C++代码中模板为我们补充好了,如下:

C++ 复制代码
void AROTDCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
	// Set up gameplay key bindings
	check(PlayerInputComponent);

	// Bind jump events
	PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
	PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);

	// Bind fire event
	PlayerInputComponent->BindAction("PrimaryAction", IE_Pressed, this, &AROTDCharacter::OnPrimaryAction);

	// Enable touchscreen input
	EnableTouchscreenMovement(PlayerInputComponent);

	// Bind movement events
	PlayerInputComponent->BindAxis("Move Forward / Backward", this, &AROTDCharacter::MoveForward);
	PlayerInputComponent->BindAxis("Move Right / Left", this, &AROTDCharacter::MoveRight);

	// We have 2 versions of the rotation bindings to handle different kinds of devices differently
	// "Mouse" versions handle devices that provide an absolute delta, such as a mouse.
	// "Gamepad" versions are 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("Look Up / Down Mouse", this, &APawn::AddControllerPitchInput);
	PlayerInputComponent->BindAxis("Turn Right / Left Gamepad", this, &AROTDCharacter::TurnAtRate);
	PlayerInputComponent->BindAxis("Look Up / Down Gamepad", this, &AROTDCharacter::LookUpAtRate);
}

void AROTDCharacter::MoveForward(float Value)
{
	if (Value != 0.0f)
	{
		// add movement in that direction
		AddMovementInput(GetActorForwardVector(), Value);
	}
}

void AROTDCharacter::MoveRight(float Value)
{
	if (Value != 0.0f)
	{
		// add movement in that direction
		AddMovementInput(GetActorRightVector(), Value);
	}
}

void AROTDCharacter::TurnAtRate(float Rate)
{
	// calculate delta for this frame from the rate information
	AddControllerYawInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}

void AROTDCharacter::LookUpAtRate(float Rate)
{
	// calculate delta for this frame from the rate information
	AddControllerPitchInput(Rate * TurnRateGamepad * GetWorld()->GetDeltaSeconds());
}

结尾

为 FPS 游戏设置角色就完成了,运行我们的编辑器,就可以通过 W A S D 键以及空格键来操作角色了。

相关推荐
charon87784 天前
虚幻引擎 | 实时语音转口型 Multilingual lipsync
人工智能·游戏·语音识别·游戏开发
Thomas_YXQ6 天前
Unity3D 实现水体交互详解
开发语言·unity·编辑器·交互·unity3d·游戏开发
cyt涛6 天前
Redis访问工具
数据库·redis·spring cache·注解·客户端·lettuce·redistemplae
北冥没有鱼啊6 天前
ue5 伤害插件
游戏·ue5·ue4·游戏开发·虚幻
Crazy Struggle15 天前
.NET 8 + WPF 企业级工作流系统
wpf·客户端·工作流·.net 8.0
charon877816 天前
虚幻引擎VR游戏开发02 | 性能优化设置
游戏·游戏引擎·vr·游戏开发·虚幻·技术美术
邂逅岁月17 天前
【网络编程通关之路】 Udp 基础回显服务器(Java实现)及你不知道知识原理详解 ! ! !
服务器·前端·网络·后端·udp·java-ee·客户端
中草药z20 天前
【JavaEE】网络原理 UDP协议
服务器·网络协议·tcp/ip·udp·java-ee·客户端
Fuliy9621 天前
游戏开发设计模式之模板方法模式
java·游戏·设计模式·游戏开发·模板方法模式
Fuliy9622 天前
游戏开发设计模式之外观模式
游戏·unity·设计模式·游戏引擎·游戏开发·外观模式