虚幻5入门,MashRunner项目1

继续之前油管上Cobra Code的The Ultimate Unreal Engine 2D Game Development Course课程的学习,这是第二个项目MashRunner
一.创建项目
启动虚幻引擎,创建一个空白项目,命名为MashRunner。之后打开VS,在MashRunner.Build.cs中添加一下插件包

using UnrealBuildTool;

public class MashRunner : ModuleRules
{
	public MashRunner(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Paper2D", "EnhancedInput" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });
	}
}

回到编辑器中,添加一个新的Basic关卡

在内容中创建一个文件夹Maps,然后在其中保存当前关卡,命名为MAP_Debug

在项目设置中,关闭运动模糊

抗锯齿选择FXAA

在内容浏览器中,创建一个文件夹PaperSprites,然后将下载下来的素材导入

对Background和Goal文件夹中的素材,选中右键,创建他们的精灵形式。而对于Runner文件夹中的精灵表,右键选择提取精灵,设置选取参数后提取精灵

删除多余的空白精灵

选择0号和1号精灵建立动作书,命名为FB_Runner_Idle,选择剩余的精灵建立动作书,命名为FB_Runner_Run

编辑FB_Runner_Idle,调整播放速率

二.绑定动作,控制角色
在内容浏览器中创建Input文件夹,在Input文件夹中创建Actions文件夹,在文件夹中建立输入操作,分别命名为IA_PowerLeft和IA_PowerRight

在Input文件夹中建立映射上下文,命名为IMC_Runner

编辑IMC_Runner,选择按键映射

新建一个基于PaperCharacter的C++类,命名为Runner

然后进入VS实现加入动作,在Runner.h中写

#pragma once

#include "CoreMinimal.h"
#include "PaperCharacter.h"
#include "Runner.generated.h"

class UInputMappingContext;
class UInputAction;

UCLASS()
class MASHRUNNER_API ARunner : public APaperCharacter
{
	GENERATED_BODY()

public:
	//输入上下文,以及动作
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TObjectPtr<UInputMappingContext> MappingContextRunner;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TObjectPtr<UInputAction> ActionPowerLeft;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TObjectPtr<UInputAction> ActionPowerRight;

private:

	//左键和A键按下后发生的事件
	void EventPowerLeft();

	//右键和D键按下后发生的事件
	void EventPowerRight();

	virtual void BeginPlay() override;
};

在Runner.cpp中这样写

#include "Kismet/GameplayStatics.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputAction.h"
#include "InputMappingContext.h"
#include "Runner.h"

void ARunner::BeginPlay()
{
	Super::BeginPlay();

	//如同上一个例子,取得世界中第一个玩家的控制权,并将控制权转到Runner类上
	APlayerController* PlayerController = UGameplayStatics::GetPlayerController(this->GetWorld(), 0);

	//添加映射上下文
	if (PlayerController)
	{
		PlayerController->Possess(this);
		UEnhancedInputLocalPlayerSubsystem* LocalPlayerSubsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
		if (LocalPlayerSubsystem)
		{
			LocalPlayerSubsystem->AddMappingContext(MappingContextRunner, 0);
		}
	}

	//绑定动作
	UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(this->InputComponent);
	if (EnhancedInputComponent)
	{
		EnhancedInputComponent->BindAction(ActionPowerLeft, ETriggerEvent::Started, this, &ARunner::EventPowerLeft);
		EnhancedInputComponent->BindAction(ActionPowerRight, ETriggerEvent::Started, this, &ARunner::EventPowerRight);
	}
}

void ARunner::EventPowerLeft()
{
	GEngine->AddOnScreenDebugMessage(-1, 2.0, FColor::Green, FString(TEXT("Left")));
}

void ARunner::EventPowerRight()
{
	GEngine->AddOnScreenDebugMessage(-1, 2.0, FColor::Red, FString(TEXT("Right")));
}

回到虚幻编辑器,到素材文件夹中,通过属性矩阵批量编辑,调整所有精灵的尺寸,调整逐单元像素为0.25


在内容浏览器的根目录创建一个Blueprints的文件,再在其中创建一个基于Runner类的蓝图类,命名为BP_Runner,然后编辑BP_Runner

调整精灵位置,使其大部分位于碰撞框内

再建立相机和相机杆,调整相机杆的角度。这部分其实都能在C++里做,但我觉得不够直观,最好还是在蓝图里做

之后再建立一个基于GameMode的C++类,命名为GM_Runner

在GM_Runner.h中声明构造函数,然后在GM_Runner.cpp中实现,将默认pawn类设置为BP_Runner类

#include "Runner.h"
#include "GM_Runner.h"

AGM_Runner::AGM_Runner()
{
	TCHAR* BP_RunnerPath = TEXT("/Game/Blueprints/BP_Runner.BP_Runner_C");
	UClass* BP_RunnerClass = LoadClass<APawn>(nullptr, BP_RunnerPath);
	this->DefaultPawnClass = BP_RunnerClass;
}

回到编辑器中,在项目设置选择初始关卡和游戏模式

拖动一个玩家出生点至游戏关卡中

运行游戏可以看到镜头对着小人,按键盘左右方向键和AD键,会出现打印信息。

posted @ 2025-03-27 17:46  SuzumiyaYui  阅读(55)  评论(0)    收藏  举报