ue4基础入门(一)actor和component

这篇具有很好参考价值的文章主要介绍了ue4基础入门(一)actor和component。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快速开始: https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/CPPProgrammingQuickStart/
角色和组件: https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/Components/
本文主要根据上面两个链接中的官方教程写一些代码注释和个人理解,感觉这两篇完全搞懂了就可以开始照猫画虎了。

一、快速开始

1、代码注释

FloatingActor.h

// 版权所有 1998-2019 Epic Games, Inc。保留所有权利。

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatingActor.generated.h"

UCLASS()
class QUICKSTART_API AFloatingActor : public AActor
{
    GENERATED_BODY()
public: 
    // 设置此Actor属性的默认值
    AFloatingActor();                          //构造函数

    UPROPERTY(VisibleAnywhere)                 //组件属性设置为可见
    UStaticMeshComponent* VisualMesh;          //静态网格组件

protected:
    // 游戏开始时或生成时调用
    virtual void BeginPlay() override;        //初始化函数

public: 
    // 逐帧调用
    virtual void Tick(float DeltaTime) override;    //滴答函数

};

FloatingActor.cpp

// 版权所有 1998-2019 Epic Games, Inc。保留所有权利。

#include "FloatingActor.h"

// 设置默认值
AFloatingActor::AFloatingActor()
{
    // 将此Actor设为逐帧调用Tick()。如无需此功能,可关闭以提高性能。
    PrimaryActorTick.bCanEverTick = true;    //开启滴答

    VisualMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));  //创建默认参数的子对象,是静态网格体组件
    VisualMesh->SetupAttachment(RootComponent); //将用于可视化的静态网格体组件放到根组件下

    static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cube.Shape_Cube"));//定义资产,例如材质、贴图等

    if (CubeVisualAsset.Succeeded())
    {
        VisualMesh->SetStaticMesh(CubeVisualAsset.Object);         //设置资产
        VisualMesh->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f)); //设置位置
    }
}

// 游戏开始时或生成时调用
void AFloatingActor::BeginPlay()
{
    Super::BeginPlay();

}

// 逐帧调用
void AFloatingActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
    //1、获得actor位置和角度
    FVector NewLocation = GetActorLocation();
    FRotator NewRotation = GetActorRotation();
    //2、计算角度和高度
    float RunningTime = GetGameTimeSinceCreation();
    float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
    NewLocation.Z += DeltaHeight * 20.0f;       //Scale our height by a factor of 20
    float DeltaRotation = DeltaTime * 20.0f;    //Rotate by 20 degrees per second
    NewRotation.Yaw += DeltaRotation;
    //3、设置位置和角度
    SetActorLocationAndRotation(NewLocation, NewRotation);
}

2、总结

(1)常见函数

CreateDefaultSubobject

资料:
https://blog.csdn.net/luofeixiongsix/article/details/81061764
https://blog.csdn.net/jfengsky/article/details/109274293
模板函数,用于创建组件或者子对象

SetupAttachment

资料:https://blog.csdn.net/jfengsky/article/details/109271706
用于将组件附加到指定组件下,每个actor都有一个根组件,每个组件都可以添加到别的组件或者actor下

(2)命名规则

资料:https://zhuanlan.zhihu.com/p/564438053

(3)常见宏

ue4中的宏往往被用于说明相关对象的性质,比如变量是否可以在面板修改、类是否可以被继承等

UPROPERTY()

官方文档:https://docs.unrealengine.com/4.26/zh-CN/ProgrammingAndScripting/GameplayArchitecture/Properties/
用于对变量进行设置,比如是否可以在画面中被观测、在面板中是否可以被修改。

GENERATED_BODY()

跟继承有关的宏,每个类都要有,没咋看懂就不瞎说了。

UCLASS()

资料:https://blog.csdn.net/ttm2d/article/details/106302474
UCLASS()让编译器识别其是uobject的衍生类,并设置相关参数

二、actor和component

1、代码分析

CollidingPawn.h

// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Pawn.h"
#include "CollidingPawn.generated.h"

UCLASS()
class HOWTO_COMPONENTS_API ACollidingPawn : public APawn
{
    GENERATED_BODY()

public:
    // 设置此Pawn属性的默认值
    ACollidingPawn();

protected:
    // 游戏开始或生成时调用
    virtual void BeginPlay() override;

public:
    // 逐帧调用
    virtual void Tick( float DeltaSeconds ) override;

    // 调用以将功能与输入绑定
    virtual void SetupPlayerInputComponent(class UInputComponent* InInputComponent) override;  //这个函数实现类似于中断初始化的操作,只在初始化时候运行。在设置完成后,会在特定事件发生后触发回调函数。

    UPROPERTY()
    class UParticleSystemComponent* OurParticleSystem;  //粒子系统组件

    UPROPERTY()
    class UCollidingPawnMovementComponent* OurMovementComponent;  //自定义移动组件

    virtual UPawnMovementComponent* GetMovementComponent() const override;  

    void MoveForward(float AxisValue);
    void MoveRight(float AxisValue);
    void Turn(float AxisValue);
    void ParticleToggle();
};

CollidingPawn.cpp

// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.

#include "CollidingPawn.h"
#include "CollidingPawnMovementComponent.h"       //自定义移动组件
#include "UObject/ConstructorHelpers.h"           
#include "Particles/ParticleSystemComponent.h"    //粒子组件
#include "Components/SphereComponent.h"           //圆形组件
#include "Camera/CameraComponent.h"               //摄像机组件
#include "GameFramework/SpringArmComponent.h"     //弹簧臂组件

// 设置默认值
ACollidingPawn::ACollidingPawn()
{
    // 设置该Pawn以逐帧调用Tick()。如无需此功能,可关闭以提高性能。
    PrimaryActorTick.bCanEverTick = true;

    // 根组件将成为对物理反应的球体
    USphereComponent* SphereComponent = CreateDefaultSubobject<USphereComponent>(TEXT("RootComponent"));
    RootComponent = SphereComponent;                         //将根组件改为圆组件
    SphereComponent->InitSphereRadius(40.0f);                //半径
    SphereComponent->SetCollisionProfileName(TEXT("Pawn"));  //设置碰撞

    // 创建并放置网格体组件,以便查看球体位置
    UStaticMeshComponent* SphereVisual = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation"));
    SphereVisual->SetupAttachment(RootComponent);
    static ConstructorHelpers::FObjectFinder<UStaticMesh> SphereVisualAsset(TEXT("/Game/StarterContent/Shapes/Shape_Sphere.Shape_Sphere"));
    if (SphereVisualAsset.Succeeded())
    {
        SphereVisual->SetStaticMesh(SphereVisualAsset.Object);
        SphereVisual->SetRelativeLocation(FVector(0.0f, 0.0f, -40.0f));
        SphereVisual->SetWorldScale3D(FVector(0.8f));
    }

    // 创建可激活或停止的粒子系统
    OurParticleSystem = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("MovementParticles"));
    OurParticleSystem->SetupAttachment(SphereVisual);
    OurParticleSystem->bAutoActivate = false;
    OurParticleSystem->SetRelativeLocation(FVector(-20.0f, 0.0f, 20.0f));
    static ConstructorHelpers::FObjectFinder<UParticleSystem> ParticleAsset(TEXT("/Game/StarterContent/Particles/P_Fire.P_Fire"));
    if (ParticleAsset.Succeeded())
    {
        OurParticleSystem->SetTemplate(ParticleAsset.Object);
    }

    // 使用弹簧臂给予摄像机平滑自然的运动感。
    USpringArmComponent* SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraAttachmentArm"));
    SpringArm->SetupAttachment(RootComponent);
    SpringArm->SetRelativeRotation(FRotator(-45.f, 0.f, 0.f));
    SpringArm->TargetArmLength = 400.0f;
    SpringArm->bEnableCameraLag = true;
    SpringArm->CameraLagSpeed = 3.0f;

    // 创建摄像机并附加到弹簧臂
    UCameraComponent* Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("ActualCamera"));
    Camera->SetupAttachment(SpringArm, USpringArmComponent::SocketName);

    // 控制默认玩家
    AutoPossessPlayer = EAutoReceiveInput::Player0;

    // 创建移动组件的实例,并要求其更新根组件。
    OurMovementComponent = CreateDefaultSubobject<UCollidingPawnMovementComponent>(TEXT("CustomMovementComponent"));
    OurMovementComponent->UpdatedComponent = RootComponent;//设置移动时需要更新的组件
}

// 游戏开始或生成时调用
void ACollidingPawn::BeginPlay()
{
    Super::BeginPlay();

}

// 逐帧调用
void ACollidingPawn::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

}

// 调用以将功能与输入绑定
void ACollidingPawn::SetupPlayerInputComponent(class UInputComponent* InInputComponent)
{
    Super::SetupPlayerInputComponent(InInputComponent);

    InInputComponent->BindAction("ParticleToggle", IE_Pressed, this, &ACollidingPawn::ParticleToggle);//设置事件发生时的回调函数

    InInputComponent->BindAxis("MoveForward", this, &ACollidingPawn::MoveForward);
    InInputComponent->BindAxis("MoveRight", this, &ACollidingPawn::MoveRight);
    InInputComponent->BindAxis("Turn", this, &ACollidingPawn::Turn);
}

UPawnMovementComponent* ACollidingPawn::GetMovementComponent() const
{
    return OurMovementComponent;
}

void ACollidingPawn::MoveForward(float AxisValue)
{
    if (OurMovementComponent && (OurMovementComponent->UpdatedComponent == RootComponent))
    {
        OurMovementComponent->AddInputVector(GetActorForwardVector() * AxisValue);
    }
}

void ACollidingPawn::MoveRight(float AxisValue)
{
    if (OurMovementComponent && (OurMovementComponent->UpdatedComponent == RootComponent))
    {
        OurMovementComponent->AddInputVector(GetActorRightVector() * AxisValue);
    }
}

void ACollidingPawn::Turn(float AxisValue)
{
    FRotator NewRotation = GetActorRotation();
    NewRotation.Yaw += AxisValue;
    SetActorRotation(NewRotation);
}

void ACollidingPawn::ParticleToggle()
{
    if (OurParticleSystem && OurParticleSystem->Template)
    {
        OurParticleSystem->ToggleActive();
    }
}

2、总结

(1)难理解代码汇总

资料:
https://zhuanlan.zhihu.com/p/568444863
https://blog.csdn.net/jfengsky/article/details/109271706
https://blog.csdn.net/WAN_EXE/article/details/78604821

1、OurMovementComponent->UpdatedComponent = RootComponent;
在移动组件接收到要移动的数据后,需要知道对哪一个组件的位置进行修改,这行代码就是用来指出那个被控制组件的。

2、RootComponent = SphereComponent;   
RootComponent是从actor基类那里继承来的,直接设置可以修改根组件。

3、InInputComponent->BindAction
用于绑定事件和回调函数

(2)常见类的继承关系

资料:https://blog.csdn.net/YoYuanZhizheng/article/details/123707769
ue4基础入门(一)actor和component
Uobject类、Actor类、Pawn类(继承自actor,增加移动功能)、Character类(继承自Pawn)、Controller类

(3)组件

资料:https://docs.unrealengine.com/4.26/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/Components/
组件附着于actor或者其他组件之下,用于实现某一个特定功能,比如移动、粒子、发射等。
Actor组件(类 UActorComponent)最适用于抽象行为,例如移动、物品栏或属性管理,以及其他非物理概念。Actor组件没有变换,即它们在场景中不存在任何物理位置或旋转。
场景组件(类 USceneComponent、UActorComponent 的子项)支持基于位置的行为,这类行为不需要几何表示。这包括弹簧臂、摄像机、物理力和约束(但不包括物理对象),甚至音频。
Primitive组件(类 UPrimitiveComponent、USceneComponent 的子项)是拥有几何表示的场景组件,通常用于渲染视觉元素或与物理对象发生碰撞或重叠。这包括静态或骨架网格体、Sprite或公告板、粒子系统以及盒体、胶囊体和球体碰撞体积。

(4)典型的actor运行方式

ue4中都是以actor为单位的,在actor中以不同的方式运行组件,进而实现各种效果。目前看到的actor能以构造函数、初始化函数、滴答函数、中断回调这四种形式进行操作,很像单片机中的运行方式。

3、扩展

其他常见组件:https://docs.unrealengine.com/4.27/zh-CN/Basics/Components/
其他基础教程:https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/文章来源地址https://www.toymoban.com/news/detail-488094.html

到了这里,关于ue4基础入门(一)actor和component的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ue4 合并静态网格体(合并Actor)

    ue4 合并静态网格体(合并Actor)。 1.选择actor 2 合并

    2024年02月13日
    浏览(44)
  • UE4 Physics Constraint Actor 实现钟摆效果

    放入场景,然后将一个球体放入场景 选择小球 将小球改为Movable 选择模拟物理,并将小球移除平衡点 就实现了

    2024年02月09日
    浏览(49)
  • UE4点击UI在场景中生成actor

    1.创建一个spawnMesh(actor),添加一个static组件,写入一个设置staticMesh的函数,暴露出new mesh。 2.创建结构体Create2   3.创建wid1和wid2(widget)。 wid1:  写一个set style事件,用变量icon来设置image_icon,变量name设置text block。这两个变量需要暴露出去。  创建wid之前完成set style事件  写

    2024年02月11日
    浏览(40)
  • 【UE5/UE4】【UE C++】制作一个蓝图宏库用以在构造器中Spawn Actor

    实际上该功能可以通过纯蓝图写出,以下展示蓝图中如何操作构造器 仅需在创建\\\"自定义事件\\\"的时候勾选\\\"编辑器中调用\\\"属性,然后就可以直接在蓝图中生成 但同时,我们发现\\\"从类生成Actor\\\"该蓝图节点具有生成局限性 无法在当前关卡外生成 以及无法生成某些在蓝图中公开却不在

    2024年02月14日
    浏览(62)
  • 【虚幻引擎】UE4初学者系列教程基础篇-全中文新手入门教程

    一、 创建工程文件 (1)虚拟项目浏览器 (2)虚拟文件夹的结构 (3) 初学者内容包 二、虚幻引擎编辑界面介绍 (1)菜单栏 (2)关卡编辑器:工具栏  (3)“模式”面板  (4)“内容浏览器”面板 (5)视口面板 (6) 世界大纲视图 (7)细节面板 三、视口导航 四、

    2024年02月04日
    浏览(88)
  • 【虚幻4】UE4初学者系列教程基础篇-全中文新手入门教程

    一、 创建工程文件 (1)虚拟项目浏览器 (2)虚拟文件夹的结构 (3) 初学者内容包 二、虚幻引擎编辑界面介绍 (1)菜单栏 (2)关卡编辑器:工具栏  (3)“模式”面板  (4)“内容浏览器”面板 (5)视口面板 (6) 世界大纲视图 (7)细节面板 三、视口导航 四、

    2024年02月13日
    浏览(58)
  • ue4/5蓝图与c++混用基础入门的基础操作(适合有蓝图基础和c++基础的新手,创建自己的蓝图)

            首先是最开始的创建项目,用c++模式进行创建。         ue4:         ue5:  创建之后,两个都会自动为你打开vs,不过ue4.26要的是vs2019,ue5要的是vs2022,有时候打不开是缺少一些东西,这些东西在csdn里面可以查到,作者就不细讲了。 在ue5(4是一样的)中,我们可

    2023年04月12日
    浏览(52)
  • ue4 unreal Instanced Static Mesh Component 实例化静态网格体组件 的用法及意义

    注意这是个组件  ​​  这个组件的意义 本来在建模软件里面就有这个功能 用来应对大量,同样网格,同样材质,不同几何信息(位置 旋转 缩放)的网格 比如场景里面的垃圾桶 电线杆 路灯等几百上千的东西  我试过一两万挺轻松的... 比较骚的操作是可以更新几何信息,

    2024年02月09日
    浏览(65)
  • UE4/5动画系列(3.通过后期处理动画蓝图的头部朝向Actor,两种方法:1.通过动画层接口的look at方法。2.通过control rig的方法)

    目录 蓝图 点积dot Yaw判断  后期处理动画蓝图  动画层接口 ControlRig: 首先我们创建一个actor类,这个actor类是我们要看的东西,actor在哪,我们的动物就要看到哪里(同样,这个我们也是做一个父类,因为它会和我们的蓝图类模板一起使用)。 这样子做,将模型作为根(也可

    2024年02月11日
    浏览(65)
  • UE4/5AI制作基础AI(适合新手入门,运用黑板,行为树,ai控制器,角色类,任务)

    目录 制作流程 第一步:创建资产 然后创建一个AIController 之后创建一个黑板和行为树:  第二步:制作 黑板 行为树 任务 运行行为树  结果 第一步直接复制你的人物蓝图,做一个npc: 然后创建一个AIController 之后创建一个 黑板和行为树 :   首先打开你的BP_NPC的pawn类,然后

    2024年02月16日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包