UE学习笔记(一)UC++基础类

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轴)

猜你喜欢

转载自blog.csdn.net/qq_44020428/article/details/126293163