// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "MyCharacter.generated.h"
UCLASS()
class CITYTWIN_API AMyCharacter : public APawn
{
GENERATED_BODY()
public:
// Sets default values for this pawn's properties
AMyCharacter();
//box作为根组件
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Camera")
class UBoxComponent* CollisionBox;
//相机组件
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Camera")
class UCameraComponent* FollowCamera;
//相机臂组件
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Camera")
class USpringArmComponent* CameraBoom;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
声明创建组件,硬编码一些基本属性
cpp复制代码
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyCharacter.h"
#include "Components/BoxComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
// Sets default values
AMyCharacter::AMyCharacter()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
CollisionBox = CreateDefaultSubobject<UBoxComponent>(TEXT("CollisionBox"));
CollisionBox->SetupAttachment(GetRootComponent());
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(CollisionBox);
CameraBoom->TargetArmLength = 1500.f;
CameraBoom->bUsePawnControlRotation = false;
CameraBoom->bEnableCameraLag = true;//摄像机臂平滑
CameraBoom->bEnableCameraRotationLag = true;//启用相机旋转延迟
CameraBoom->bDoCollisionTest = false;//关闭摄像机臂碰撞
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
FollowCamera->SetupAttachment(CameraBoom);
FollowCamera->bUsePawnControlRotation = false;
}
// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
创建这个Pawn类的蓝图进行之前登录页面动画的视角旋转方向问题的解决
首先将蓝图生成对齐到视角
将Pawn类自动接收玩家0
然后删除PlayerStart
运行结果
移动增强输入系统
在项目建立.cs文件中添加这个模块
绑定增强输入系统操作
MyCharacter.h
cpp复制代码
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "../../../../UE_5.2.1/UE_5.2/Engine/Plugins/EnhancedInput/Source/EnhancedInput/Public/InputActionValue.h"
#include "MyCharacter.generated.h"
UCLASS()
class CITYTWIN_API AMyCharacter : public APawn
{
GENERATED_BODY()
public:
// Sets default values for this pawn's properties
AMyCharacter();
//box作为根组件
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Camera")
class UBoxComponent* CollisionBox;
//相机组件
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Camera")
class UCameraComponent* FollowCamera;
//相机臂组件
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Camera")
class USpringArmComponent* CameraBoom;
//绑定映射
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputMappingContext* MappingContext;
//移动绑定
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Input")
class UInputAction* LeftButtonAction;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
//鼠标按下操作事件
void LeftMouseDown(const FInputActionValue& value);
void LeftMouseUp(const FInputActionValue& value);
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
// Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
};
MyCharacter.cpp
cpp复制代码
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyCharacter.h"
#include "Components/BoxComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/SpringArmComponent.h"
#include "EnhancedInputSubsystems.h"
#include "EnhancedInputComponent.h"
// Sets default values
AMyCharacter::AMyCharacter()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
CollisionBox = CreateDefaultSubobject<UBoxComponent>(TEXT("CollisionBox"));
CollisionBox->SetupAttachment(GetRootComponent());
CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
CameraBoom->SetupAttachment(CollisionBox);
CameraBoom->TargetArmLength = 1500.f;
CameraBoom->bUsePawnControlRotation = false;
CameraBoom->bEnableCameraLag = true;//摄像机臂平滑
CameraBoom->bEnableCameraRotationLag = true;//启用相机旋转延迟
CameraBoom->bDoCollisionTest = false;//关闭摄像机臂碰撞
FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
FollowCamera->SetupAttachment(CameraBoom);
FollowCamera->bUsePawnControlRotation = false;
}
// Called when the game starts or when spawned
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
APlayerController* PlayerController = Cast<APlayerController>(Controller);
if (PlayerController)
{
UEnhancedInputLocalPlayerSubsystem* Subsystem =
ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer());
if (Subsystem)
{
Subsystem->AddMappingContext(MappingContext, 0);
}
}
}
void AMyCharacter::LeftMouseDown(const FInputActionValue& value)
{
}
void AMyCharacter::LeftMouseUp(const FInputActionValue& value)
{
}
// Called every frame
void AMyCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
UEnhancedInputComponent* EnhancedInputConponent = Cast<UEnhancedInputComponent>(PlayerInputComponent);
if (EnhancedInputConponent)
{
EnhancedInputConponent->BindAction(LeftButtonAction, ETriggerEvent::Started, this, &AMyCharacter::LeftMouseDown);
EnhancedInputConponent->BindAction(LeftButtonAction, ETriggerEvent::Completed, this, &AMyCharacter::LeftMouseUp);
}
}