Class等级制度
Object unreal所有物体的基类
Actor 可以被放置或者被生成在关卡中的物体
Pawn 可以被玩家或者AI控制
Character
第一个类PlayerCharacter
//PlayerCharacter.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"//include和对象类型的最小合集
#include "GameFramework/Character.h"//因为这个类是从ACharacter类中派生出来的,所以也需要引用他
#include "PlayerCharacter.generated.h"//只需要包含它的存在
UCLASS()
class ACTIONROUGELIKE_API APlayerCharacter : public ACharacter
{
GENERATED_BODY()//关于这个类定制的一些东西,比如说汽车的运动和飞机不同,玩家的操控和AI不同之类的
public:
// Sets default values for this character's properties
APlayerCharacter();
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;
};
//PlayerCharacter.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "PlayerCharacter.h"
#include "ActionRougelike/Public/PlayerCharacter.h"
// Sets default values
APlayerCharacter::APlayerCharacter()
{
// 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;
}
// Called when the game starts or when spawned
void APlayerCharacter::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void APlayerCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
// Called to bind functionality to input
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
然后在ue编辑器中创建对应的蓝图
然后在左上角的组件中
Capsule Component -- 处理碰撞和被用于运动
Arrow Component -- 指明方向
Character Component -- 复杂的运动系统
我们需要把这个角色作为我们的起点
选择拖入到关卡里面的角色后将它设置为player0
这并不是正确且常用的方法,但是作为项目的开始和调试可以尝试这么使用
UE前缀
U - 从UObject派生出来的基类
A - 从Actor派生出来的基类
F - Structs
E - Enums
I - Interfaces
添加组件
需要添加摄像机组件(Camera Component)和机械臂组件(Spring Arm Component)(第三人称角色需要用到机械臂)
//PlayerCharacter.h
protected:
UPROPERTY(VisibleAnywhere)
USpringArmComponent* SpringArmComp;
UPROPERTY(VisibleAnywhere)
UCameraComponent* CameraComp;
//PlayerCharecter.cpp
APlayerCharacter::APlayerCharacter()
{
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>("SpringArmComp");
SpringArmComp->SetupAttachment(RootComponent);
CameraComp = CreateDefaultSubobject<UCameraComponent>("CameraComp");
CameraComp->SetupAttachment(SpringArmComp);
}
然后编译可以看到新建的组件连接到了角色身上
并且在组件中也做好了连接
UNREAL PROPERTY SYSTEM
以U开头
UPROPERTYM,USTRUCTION,UCALSS,USTRUCT,UENUM
为了让你在c++声明的对象可以让ue编辑器和蓝图访问,还有网络(指定它运行在服务器还是客户端上)和方便内存管理
设置输入
在character中的setupinputcomponent函数中设置,绑定键值。要么用bindaxis绑定轴或者bindaction绑定动作。比如向前为该轴的值为从零到一,向后时为从零到负一。按了w为一,按了s为负一。
//PlayerCharacter.h
protected:
void MoveForward(float value);
//PlayerCharacter.cpp
void APlayerCharacter::MoveForward(float value)
{
AddMovementInput(GetActorForwardVector(),value);
//第一个参数为方向,第二个参数为值。朝着方向运动,速度由值决定
}
void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis("MoveForward",this,&APlayerCharacter::MoveForward);
//第一个值为指定一个绑定的名称,第二个为使用这个值的角色,第三个值为触发的函数
}
然后编译打开ue编辑器中绑定值
当按下w的时候,将值1作为参数传入到刚刚编写的函数MoveForward,在函数中的addmovementcomponent就会执行以value为1.
如果想设置鼠标的旋转其实已经有现成的函数
PlayerInputComponent->BindAxis("Axis",this,&APawn::AddControllerYawInput);
在ue中yaw代表着水平旋转(绕z轴),pitch代表着垂直旋转(绕y轴),yaw代表着滚动(绕x轴)