[UE4] APlayerController和AIController
参考
《InsideUE4》GamePlay架构(六)PlayerController和AIController
Unreal Engine 4:学习笔记(八)PlayerController
APlayerController
作用:
APlayerController 实现了从玩家获取输入数据并将其转换为动作的功能,例如移动、使用物品、发射武器等。
APlayerController 会在整个游戏中一直存在,而 Pawn 只是暂时的。例如,在游戏中死亡后重生,将产生一个新的 Pawn,但 PlayerController 将是相同的。
APlayerController不仅能控制本地的Pawn,而且还能“控制”远程的Pawn(实际上是通过Server上的APlayerController控制Server上的Pawn,然后再复制到远程机器上的Pawn实现的)。
继承链
- UObjectBase
- UObjectBaseUtility
- UObject
- AActor
- AController
- APlayerController
- AController
- AActor
- UObject
- UObjectBaseUtility
简单图示
图片来自---------------《InsideUE4》GamePlay架构(六)PlayerController和AIController
头文件
#include "GameFramework/PlayerController.h"
APlayerController 中大致包含如下几块:
- Camera的管理,PlayerCameraManager
- Input系统
- UPlayer关联
- HUD显示(这是从UE3迁移过来的组件,现在用UMG的比较多)
- Level的切换
- Voice控制
MVC的模式,View:Pawn的表现;Mode:数据,可以放到PlayerState;Controller:PlayerController一边控制Pawn,一边调用PlayerState的接口去更新数据
在APlayerController中绑定输入事件:
因为用于绑定输入事件的InputComponent本身就是放在AActor类中,所以在Pawn和Character里都带有SetupPlayerInputComponent方法,也可以在其中绑定输入事件,如
实现角色移动函数
Unreal Engine 4:学习笔记(八)PlayerController
但是最好是将这些内容写在PlayerController中去,如 ue4 玩家控制器APlayerController
在Character中绑定输入事件的示例
FPSCharacter.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "FPSProjectile.h"
#include "FPSCharacter.generated.h"
UCLASS()
class FPSPROJECT_API AFPSCharacter : public ACharacter
{
GENERATED_BODY()
public:
// 为此角色的属性设置默认值
AFPSCharacter();
protected:
// 当游戏开始或重生(Spawn)时被调用
virtual void BeginPlay() override;
//EditDefaultsOnly 意味ProjectileClass属性只能在蓝图中修改,UE中Archetype(原型) == Blueprint asset(蓝图)== Prefab (预制体Unity3D).
UPROPERTY(EditDefaultsOnly, Category = Projectile)
TSubclassOf<class AFPSProjectile> ProjectileClass;
public:
// 每一帧都被调用
virtual void Tick(float DeltaTime) override;
// 被调用,将功能与输入绑定
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
//处理用于前后移动的输入
// UFUNCTION 宏将UFunction对蓝图公开,以便开发者从蓝图中调用或扩展UFunction,而无需更改C++代码。
UFUNCTION()
void MoveForward(float Value);
//处理用于左右移动的输入
UFUNCTION()
void MoveRight(float Value);
// 按下键时,设置跳跃标记。
UFUNCTION()
void StartJump();
// 释放键时,清除跳跃标记。
UFUNCTION()
void StopJump();
//处理发射物射击的函数
UFUNCTION()
void Fire();
//EditAnywhere 让你可以在蓝图编辑器的Defaults模式下或在任何角色实例的Detail选项卡中编辑
//BlueprintReadWrite 选项值让你可以在蓝图中读写该值
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
FVector MuzzleOffset;
};
FPSCharacter.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "FPSCharacter.h"
// Sets default values
AFPSCharacter::AFPSCharacter()
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// 当游戏开始或重生(Spawn)时被调用
void AFPSCharacter::BeginPlay()
{
Super::BeginPlay();
check(GEngine != nullptr);
// 显示调试消息五秒。
// -1"键"值参数可以防止更新或刷新消息。
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter."));
}
// 每一帧都被调用
void AFPSCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// 被调用,将功能与输入绑定
void AFPSCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
//设置"移动"绑定
//InputComponent 是定义如何处理输入数据的组件。可以将 InputComponent 附加到想要接收输入的actor
PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
// 设置"观看"绑定。
PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);
// 设置"操作"绑定。
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump);
//设置"发射"绑定
PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AFPSCharacter::Fire);
}
void AFPSCharacter::MoveForward(float Value)
{
// 找出"前进"方向,并记录玩家想向该方向移动。
FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
AddMovementInput(Direction, Value);
}
void AFPSCharacter::MoveRight(float Value)
{
// 找出"右侧"方向,并记录玩家想向该方向移动。
FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
AddMovementInput(Direction, Value);
}
void AFPSCharacter::StartJump()
{
bPressedJump = true;
}
void AFPSCharacter::StopJump()
{
bPressedJump = false;
}
void AFPSCharacter::Fire() {
// 试图发射发射物。
if (ProjectileClass)
{
// 获取摄像机变换。
FVector CameraLocation;
FRotator CameraRotation;
GetActorEyesViewPoint(CameraLocation, CameraRotation);
// 设置MuzzleOffset,在略靠近摄像机前生成发射物。
MuzzleOffset.Set(100.0f, 0.0f, 0.0f);
// 将MuzzleOffset从摄像机空间变换到世界空间。
FVector MuzzleLocation = CameraLocation + FTransform(CameraRotation).TransformVector(MuzzleOffset);
// 使目标方向略向上倾斜。
FRotator MuzzleRotation = CameraRotation;
MuzzleRotation.Pitch += 10.0f;
UWorld* World = GetWorld();
if (World)
{
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;
SpawnParams.Instigator = GetInstigator();
// 在枪口位置生成发射物。
AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
if (Projectile)
{
// 设置发射物的初始轨迹。
FVector LaunchDirection = MuzzleRotation.Vector();
Projectile->FireInDirection(LaunchDirection);
}
}
}
}
AAIController
作用
AAIController 用于控制AI,同PlayerController对比,少了Camera、Input、UPlayer关联,HUD显示,Voice、Level切换接口,但也增加了一些AI需要的组件:导航组件(寻路),AI组件(行为树等),Task系统等。
AIController也只存在于Server上(单机游戏也可看作是Server)
利用UE提供的行为树黑板等组件和AIController来实现NPC的寻路,攻击等AI行为。
行为树快速入门指南
继承链
- UObjectBase
- UObjectBaseUtility
- UObject
- AActor
- AController
- AAIController
- AController
- AActor
- UObject
- UObjectBaseUtility
简单图示
图片来自---------------《InsideUE4》GamePlay架构(六)PlayerController和AIController
头文件
#include "AIController.h"
最后放一张图
图片来自---------------《InsideUE4》GamePlay架构(六)PlayerController和AIController