最简单的 UE 4 C++ 教程 ——触发改变网格的材质【三十】

举报
ShaderJoy 发表于 2021/11/19 01:25:10 2021/11/19
【摘要】 原教程是基于 UE 4.18,我是基于 UE 4.25】 英文原地址 在本教程中,当发生重叠事件时,我们将改变静态网格的材质。首先,创建一个新的 Actor 子类,在本教程中我叫它 ChangeMaterialMesh。 首先,在 .h 文件中,我们将创建一个 UStaticMeshComponent 、两个 UMa...

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

英文原地址

在本教程中,当发生重叠事件时,我们将改变静态网格的材质。首先,创建一个新的 Actor 子类,在本教程中我叫它 ChangeMaterialMesh

首先,在 .h 文件中,我们将创建一个 UStaticMeshComponent 、两个 UMaterial 类和一个UBoxComponent。将元素添加到头文件的公共部分。


  
  1. ...
  2. UPROPERTY(VisibleAnywhere)
  3. class UStaticMeshComponent* MyMesh;
  4. UPROPERTY(EditAnywhere)
  5. class UMaterial* OnMaterial;
  6. UPROPERTY(EditAnywhere)
  7. class UMaterial* OffMaterial;
  8. UPROPERTY()
  9. class UBoxComponent* MyBoxComponent;
  10. UFUNCTION()
  11. void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

现在我们进入 .cpp 文件。首先,在顶部包含 DrawDebugHelpers.h  Components/BoxComponent.h 文件,这样我们就可以可视化和使用我们的碰撞框。


  
  1. // include draw debug helpers header file
  2. #include "DrawDebugHelpers.h"
  3. #include "Components/BoxComponent.h"

接下来,我们将设置构造函数并设置默认值。使用 CreateDefaultSubobject<UStaticMeshComponent> 创建静态网格,并将其设置为 RootComponent 。然后,通过 CreateDefaultSubobject<UBoxComponent> 创建盒子组件,我们将通过使用 InitBoxExtent 将它的大小范围设置为 FVector(100,100,100) 。盒子组件将初始化为一个名为 Trigger 的碰撞配置文件,并将被附加到 RootComponent 上。接下来,创建两个材质的网格之间切换,建立 bool 的默认值,最后连接重叠函数。

下面是构造函数代码。


  
  1. AChangeMaterialMesh::AChangeMaterialMesh()
  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. MyMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyMesh"));
  6. RootComponent = MyMesh;
  7. MyBoxComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBoxComponent"));
  8. MyBoxComponent->InitBoxExtent(FVector(100,100,100));
  9. MyBoxComponent->SetCollisionProfileName("Trigger");
  10. MyBoxComponent->SetupAttachment(RootComponent);
  11. OnMaterial = CreateDefaultSubobject<UMaterial>(TEXT("OnMaterial"));
  12. OffMaterial = CreateDefaultSubobject<UMaterial>(TEXT("OffMaterial"));
  13. MyBoxComponent->OnComponentBeginOverlap.AddDynamic(this, &AChangeMaterialMesh::OnOverlapBegin);
  14. }

接下来,在 BeginPlay() 方法中,我们将使用 DrawDebugBox 绘制调试框,并使用 SetMaterial 设置网格的第一个材质。下面是 BeginPlay() 代码。


  
  1. void AChangeMaterialMesh::BeginPlay()
  2. {
  3. Super::BeginPlay();
  4. DrawDebugBox(GetWorld(), GetActorLocation(), FVector(100,100,100), FColor::White, true, -1, 0, 10);
  5. MyMesh->SetMaterial(0, OffMaterial);
  6. }

现在,我们将创建一个重叠函数来改变网格的材质。我们将检查 OtherActor 是否不为空,OtherActor 是否不是同一个 actor,以及 OtherComp 是否不为空。如果一切都通过了,我们将调用 SetMaterial 并传入新的材质,并将其设置为网格的第一个材质。

下面是重叠函数。


  
  1. void AChangeMaterialMesh::OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
  2. {
  3. if ( (OtherActor != nullptr ) && (OtherActor != this) && ( OtherComp != nullptr ) )
  4. {
  5. MyMesh->SetMaterial(0, OnMaterial);
  6. }
  7. }

编译代码。将 actor 拖放到游戏世界中。在细节面板中添加一个网格,并向 actor 添加两个材质(这些材质是在父组件 (实例) 的细节面板中设置的)。现在当你按下播放时,网格将在发生重叠时改变材质。

 效果图如下

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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