从QuickDraw项目入门,制作一个简单的2D小游戏3

一.动作输入
如视频中操作,创建一个名为Input的文件夹,在里面创建一个Action文件夹,然后在Action文件夹中创建一个输入操作,命名为IA_Attack

回到Input文件夹,创建一个输入映射情景,命名为IMC_Duel

双击IMC_Duel,编辑映射,如下设置,然后保存

回到VS,打开QuickDraw.Build.cs,在其中添加对增强输入模块的支持,代码如下:

using UnrealBuildTool;

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

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

	}
}

回到Samurai_Player.h中,改写代码

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Controller.h"
//获取玩家控制器的头文件
#include "Kismet/GameplayStatics.h"
//输入组件头文件
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "InputActionValue.h"
#include "InputMappingContext.h"
////////////////////////////////////////
#include "Samurai.h"
#include "Samurai_Player.generated.h"

/**
 * 
 */
UCLASS()
class QUICKDRAW_API ASamurai_Player : public ASamurai
{
	GENERATED_BODY()
public:
	ASamurai_Player();

	virtual void BeginPlay();

	void Attack();

	//输入映射,在蓝图编辑器里选择
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
	TObjectPtr<UInputMappingContext> InputMappingContext;

	//要绑定的动作
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Input")
	TObjectPtr<UInputAction> AttackAction;
};

在Samurai_Player.cpp中如下实现

#include "Samurai_Player.h"

ASamurai_Player::ASamurai_Player()
{

}

void ASamurai_Player::BeginPlay()
{
	Super::BeginPlay();
	//获取该场景的第一个玩家控制
	APlayerController* PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0);
	
	if (PlayerController)
	{
		//拥有该角色的控制权
		PlayerController->Possess(this);
		//加入输入上下文
		if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer()))
		{
			Subsystem->AddMappingContext(this->InputMappingContext, 0);
		}
	}
	//绑定动作
	if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent))
	{
		EnhancedInputComponent->BindAction(AttackAction, ETriggerEvent::Started, this, &ASamurai_Player::Attack);
	}
}


void ASamurai_Player::Attack()
{
	GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Green, FString::Printf(TEXT("Attack")));
}

编译后在实例中选择上下文映射和绑定的动作

然后运行游戏,按下空格会在左上角打印Attack,并且摄像机到精灵的内部去了

二.摄像机设置
感觉这个写成C++不大行,直接跟着视频做成了一个蓝图。添加一个基于Camera Actor的蓝图类,命名为BP_Camera

之后把它拖进场景中,调整到一个合适的位置

回到VS中,在Samurai_Player.cpp中的BeginPlay函数末尾,加如下语句

//获取场景中的第一个ACameraActor单位,然后用它来作为新的镜头位置
ACameraActor* Camera = Cast<ACameraActor>(UGameplayStatics::GetActorOfClass(this->GetWorld(), ACameraActor::StaticClass()));
PlayerController->SetViewTargetWithBlend(Camera);

在Samurai_Player.h中加入新的头文件

//相机头文件
#include "Camera/CameraActor.h"

来到编辑器中,调整相机的曝光选项

在项目设置里关闭自动曝光

关闭运动模糊

调整抗锯齿选项

posted @ 2025-03-11 15:26  SuzumiyaYui  阅读(24)  评论(0)    收藏  举报