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
在这里插入图片描述
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/

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: b'ue4 actor component'是Unreal Engine 4中的一个组件,可以附加到Actor上,并添加自定义功能,例如碰撞检测、动画控制和游戏逻辑。这样,多个Actor可以共享同一个组件,从而简化代码和提高效率。 ### 回答2: UE4 Actor Component是一个非常重要的功能模块,它可以让我们为UE4引擎中的游戏角色添加自定义的行为和功能,而不需要修改原有的游戏代码。使用Actor Component,我们可以将游戏角色所拥有的行为和功能拆分成一个个独立的模块,并可以独立开发、测试、优化和修改,从而提高游戏的可维护性和开发效率。以下是Actor Component的主要特性: 1. 重用性:可以将Actor Component应用到不同的游戏角色中,从而将相同的行为和功能重用。 2. 灵活性:可以根据需要添加或移除Actor Component,从而增强游戏角色的行为和功能。 3. 可拆分性:可以将复杂的游戏角色拆分成更小、更简单的组件,从而降低代码复杂度和维护成本。 4. 可扩展性:通过继承Actor Component类,我们可以创建自己的定制组件,从而增强游戏的定制化程度。 使用Actor Component开发游戏可以大大简化代码开发过程,加快开发时间,减少错误和bug,提高代码的可读性和可维护性。Actor ComponentUE4引擎的一个重要特性,也是开发高质量游戏的不可或缺的工具之一。 ### 回答3: UE4(Unreal Engine 4)是一款功能强大的游戏开发引擎,其中的ActorComponent模块是构建游戏对象的重要组成部分之一。Actor是在游戏场景中的一个物体,而ComponentActor对象的一部分,经常用于添加特定功能和属性。UE4Actor Component能够帮助游戏开发人员在游戏中实现更多的交互和动态效果。 UE4 Actor Component的设计思路是将不同的组件将Actor划分为不同的模块,使其更加简单易用和灵活。通过UE4 Actor Component,开发人员可以根据自己的需求将多个组件组合在一个Actor中,从而实现更复杂的游戏特效等功能。 UE4 Actor Component提供了很多常见的组件,如动画组件、碰撞器组件、模型组件、声音组件等,以及多种自定义组件。其中,动画组件是游戏开发中最常用的组件之一,可以使游戏中的角色动作更加真实,使动画更加流畅。碰撞器组件则可以增加游戏中的碰撞检测效果,模型组件可以快速地在场景中添加物体,声音组件则可以为游戏增加更多音效。 UE4 Actor Component的另一个优势是可以通过连接多个组件来创建更为复杂的组件。通过将一个组件附加到另一个组件上,可以将两个组件的功能融合在一起,从而实现更多不同的游戏特效。例如,一个具有紫外线视觉效果的球体可以通过将光线源附加到它的子组件上来实现,这样就可以使球体在场景中发出紫外线光线。 总之,UE4中的Actor Component是游戏开发中非常重要的一部分,它能够提供丰富多彩的特效和功能,游戏开发人员可以通过组合不同的组件来实现自己的游戏开发需求。因此,学习UE4 Actor Component对于游戏开发人员来说是非常有必要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值