最简单的 UE 4 C++ 教程 —— C++ 中添加静态网格文件【三】

举报
ShaderJoy 发表于 2021/11/19 00:06:45 2021/11/19
【摘要】 【原教程是基于 UE 4.18,我是基于 UE 4.25】 英文源地址 接上一节的教程,让我们首先创建一个名为 AddMeshFromFile 的新 Actor 子类。 我们不需要在头文件中做任何事情。 下面是创建新类时生成的默认头文件。 AddMeshFromFile.h #pragma once #incl...

【原教程是基于 UE 4.18,我是基于 UE 4.25】

英文源地址

接上一节的教程,让我们首先创建一个名为 AddMeshFromFile 的新 Actor 子类。

我们不需要在头文件中做任何事情。

下面是创建新类时生成的默认头文件。

AddMeshFromFile.h


  
  1. #pragma once
  2. #include "CoreMinimal.h"
  3. #include "GameFramework/Actor.h"
  4. #include "AddMeshFromFile.generated.h"
  5. UCLASS()
  6. class UNREALCPP_API AAddMeshFromFile : public AActor
  7. {
  8. GENERATED_BODY()
  9. public:
  10. // Sets default values for this actor's properties
  11. AAddMeshFromFile();
  12. protected:
  13. // Called when the game starts or when spawned
  14. virtual void BeginPlay() override;
  15. public:
  16. // Called every frame
  17. virtual void Tick(float DeltaTime) override;
  18. };

为了以编程方式添加一个特定的网格,我们必须包含 ConstructorHelpers.h 文件【此处修订原英文教程的编译错误】。

代码如下,在 Actor 子类头文件后包含该头文件。


  
  1. #include "AddMeshFromFile.h"
  2. // add constructor header
  3. #include "UObject/ConstructorHelpers.h"

接下来,在 Actor 子类的构造函数中,我们将设置要添加到 actor 中的网格的默认值。创建一个UStaticMeshComponent 指针,并将其设置为 RootComponent


  
  1. AAddMeshFromFile::AAddMeshFromFile()
  2. {
  3. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  4. PrimaryActorTick.bCanEverTick = true;
  5. // add Cylinder to root
  6. UStaticMeshComponent* Cylinder = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation"));
  7. Cylinder->SetupAttachment(RootComponent);
  8. }

在我们的初始化设置之后,下一步是添加我们想要的网格到我们的角色。我们将使用ConstructorHelpers 中地方法 FObjectFinder 来定位我们的网格。在这个例子中,我构造并调用了变量 CylinderAsset,并传入了由初学者内容提供的圆柱体形状的路径。我们传入的路径是 /Game/StarterContent/Shapes/Shape_Cylinder.Shape_Cylinder


  
  1. AAddMeshFromFile::AAddMeshFromFile()
  2. {
  3. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  4. PrimaryActorTick.bCanEverTick = true;
  5. // add Cylinder to root
  6. UStaticMeshComponent* Cylinder = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation"));
  7. Cylinder->SetupAttachment(RootComponent);
  8. static ConstructorHelpers::FObjectFinder<UStaticMesh> CylinderAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cylinder.Shape_Cylinder"));
  9. }

接下来,让我们做一个错误检查,以确保我们成功地获得网格。

if (CylinderAsset.Succeeded()) {}
 

如果该检查语句通过的话,让我们接着在圆柱体组件上执行下面三句话

  • SetStaticMesh
  • SetRelativeLocation
  • SetWorldScale3D

  
  1. if (CylinderAsset.Succeeded())
  2. {
  3. Cylinder->SetStaticMesh(CylinderAsset.Object);
  4. Cylinder->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
  5. Cylinder->SetWorldScale3D(FVector(1.f));
  6. }

最后完整的 cpp 如下所示


  
  1. #include "AddMeshFromFile.h"
  2. // add constructor header
  3. #include "UObject/ConstructorHelpers.h"
  4. // Sets default values
  5. AAddMeshFromFile::AAddMeshFromFile()
  6. {
  7. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  8. PrimaryActorTick.bCanEverTick = true;
  9. // add Cylinder to root
  10. UStaticMeshComponent* Cylinder = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("VisualRepresentation"));
  11. Cylinder->SetupAttachment(RootComponent);
  12. static ConstructorHelpers::FObjectFinder<UStaticMesh> CylinderAsset(TEXT("/Game/StarterContent/Shapes/Shape_Cylinder.Shape_Cylinder"));
  13. if (CylinderAsset.Succeeded())
  14. {
  15. Cylinder->SetStaticMesh(CylinderAsset.Object);
  16. Cylinder->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
  17. Cylinder->SetWorldScale3D(FVector(1.f));
  18. }
  19. }
  20. // Called when the game starts or when spawned
  21. void AAddMeshFromFile::BeginPlay()
  22. {
  23. Super::BeginPlay();
  24. }
  25. // Called every frame
  26. void AAddMeshFromFile::Tick(float DeltaTime)
  27. {
  28. Super::Tick(DeltaTime);
  29. }

最后的结果如下

将新建的 actor 子类拖入场景中

文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/119094175

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。