1 .Create project 项目设置
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
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>(); const FRotator Rotation = GetControlRotation (); const FRotator YawRotation (0.f ,Rotation.Yaw,0.f ) ; const FVector ForwardDirection = FRotationMatrix (YawRotation).GetUnitAxis (EAxis::X); const FVector RightDirection = FRotationMatrix (YawRotation).GetUnitAxis (EAxis::Y); 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