1 .Create project

项目设置

image-20250701171016760

image-20250701171047721

image-20250701172653793

2.类

AuraCharacter.cpp
TObjectptr:UE5新增的指针,相比原先的UObject* 实现GC,序列化
c++ 类
AuraCharacterBase 锁有Character的基类,创建了一个Wepon的骨骼网格组件,同时声明了Weapon 挂接点

AuraCharacter Class 主角类
AuraEnemy class 敌人类的父类,继承与AuraCharacter

蓝图

BP_Aura_Character
ABP_Aura_Character

ABP_Enemy 敌人动画蓝图模板基类,不需要指定骨骼。不同敌人复用里面的动画播放速度计算逻辑
ABP_Goblin_SlingShot 设置指定敌人持有SlingShot的动画
ABP_Goblin_Spear 设置敌人持有Spear的动画

3.增强输入

https://dev.epicgames.com/documentation/zh-cn/unreal-engine/configure-character-movement-with-cplusplus-in-unreal-engine?application_version=5.6

1.Aura.Build.cs 中添加EnhancedInput模块

2.创建IA 和IMC

​ 1. input Action IA_Move :设置输入的值类型,是float bool vector2,3 ?

​ 2. input map context :IMC_ 设置IA_Move 中的按键,AWSD,和对应的按键的modifiy

Swizzle input Axis Values:

1.AuraPlayerController class

EnhanceInput system : 增强输入系统,用来管理IA 和IMC

获取EnhanceInput system 将创建号IMC 添加到Enhance Input系统中

输入函数:
SetupInputComponent()
为了实现输入和WSAD后,游戏有相应,需要一个IA_Move触发后的响应函数 Move
通过增强输入组件,来控制IA_Move 和Move 响应函数的绑定

EnhancedInputComponent->BindAction(MoveAction,ETriggerEvent::Triggered,this,&AAuraPlayerController::Move);

响应函数:

Move()
将输入的IA_Move 输入,转为角色移动的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

## 3.绑定IA_Move 到Move 响应函数

```c++
void AAuraPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();

// 1.获取EnhanceInput system
UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());
// 2.获取IA_Move
UInputMappingContext* IA_Move = LoadObject<UInputMappingContext>(nullptr,TEXT("InputMappingContext'/Game/Input/IMC_Move.IMC_Move'"));
// 3.将IA_Move 添加到EnhanceInput system 中
if (Subsystem && IA_Move)
{
Subsystem->AddMappingContext(IA_Move,0);
}
// 4.绑定IA_Move 到Move 响应函数
UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(InputComponent);
if (EnhancedInputComponent && MoveAction)
{
EnhancedInputComponent->BindAction(MoveAction,ETriggerEvent::Triggered,this,&AAuraPlayerController::Move);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void AAuraPlayerController::Move(const FInputActionValue& InputActionValue)
{
const FVector2D InputAxisVector = InputActionValue.Get<FVector2D>();//获取MoveAction 输入xY 两个方向的值

const FRotator Rotation = GetControlRotation();//控制器的选装矩阵
const FRotator YawRotation(0.f,Rotation.Yaw,0.f);// 将控制器,俯仰角pitch,旋转角Roll,保存为0,保留偏航角Yaw。

const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);// 根据偏航角,获取相机当前热forward 方向
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); // right 方向

if (APawn* ControlledPawn = GetPawn<APawn>())
{
ControlledPawn->AddMovementInput(ForwardDirection,InputAxisVector.Y);
ControlledPawn->AddMovementInput(RightDirection,InputAxisVector.X);
}
}

Game Mode

GameModeBase Class C++ AuraGameModeBase 蓝图:BP_Aura_GameMode 设置 默认Pawn 和controller

WordSetting 中设置 GameMode

BP_AuraCharacter 中设置弹簧臂相机

AuraCharacter Class 中设置角色的朝向为移动方向

ABP_Aura 动画状态机,状态切换,根据速度判断是idle 还是run

Enemy Interfacce

1
2
3
4
5
6
7
graph LR
A[AuraPlayerController] -->|Hover Over| B[BP_Goblin_Spear]
A -->|Hover Over| C[BP_Goblin_Slingshot]
B --> D[Actor]
C --> D
D --> E[IEenemyInterface]
E --> F[Highlight]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
classDiagram
%% Character的基类
class AAuraCharacterBase {
+Weapon
+AAuraCharacterBase() 创建了一个Wepon的骨骼网格组件,同时声明了Weapon 挂接点
}
AAuraCharacterBase <|-- AAuraCharacter
AAuraCharacterBase <|-- AAuraEnemy
AAuraEnemy <|-- BP_Enemy
class AAuraCharacter {
-AAuraCharacter()
}
AAuraCharacter <|-- BP_AuraCharacter
class AAuraEnemy {
+bool is_wild
+HighlightActor()
+UnHighlightActor()
}
class EnemyInterface {
<<interface>> EnemyInterface
+HighlightActor()
+UnHighlightActor()
}
EnemyInterface <|-- AAuraEnemy
class AAuraPlayerController {
+AAuraPlayerController()
-PlayerTick()
-BeginPlay() 初始化增强输入
-SetupInputComponent() 设置输入
#CursorTrace()
#Move() 控制角色移动
#MoveAction
#AuraContext
#LastActor
#ThisActor
}
class BP_Enemy