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

Posted panda1234lee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最简单的 UE 4 C++ 教程 ——触发改变网格的材质三十相关的知识,希望对你有一定的参考价值。

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

英文原地址

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

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

...
UPROPERTY(VisibleAnywhere)
class UStaticMeshComponent* MyMesh;

UPROPERTY(EditAnywhere)
class UMaterial* OnMaterial;

UPROPERTY(EditAnywhere)
class UMaterial* OffMaterial;

UPROPERTY()
class UBoxComponent* MyBoxComponent;

UFUNCTION()
void OnOverlapBegin(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);

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

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

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

下面是构造函数代码。

AChangeMaterialMesh::AChangeMaterialMesh()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	MyMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MyMesh"));
	RootComponent = MyMesh;

	MyBoxComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("MyBoxComponent"));
	MyBoxComponent->InitBoxExtent(FVector(100,100,100));
	MyBoxComponent->SetCollisionProfileName("Trigger");
	MyBoxComponent->SetupAttachment(RootComponent);

	OnMaterial = CreateDefaultSubobject<UMaterial>(TEXT("OnMaterial"));
	OffMaterial = CreateDefaultSubobject<UMaterial>(TEXT("OffMaterial"));

	MyBoxComponent->OnComponentBeginOverlap.AddDynamic(this, &AChangeMaterialMesh::OnOverlapBegin);

}

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

void AChangeMaterialMesh::BeginPlay()
{
	Super::BeginPlay();

	DrawDebugBox(GetWorld(), GetActorLocation(), FVector(100,100,100), FColor::White, true, -1, 0, 10);

	MyMesh->SetMaterial(0, OffMaterial);
	
}

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

下面是重叠函数。

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

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

 效果图如下

 

以上是关于最简单的 UE 4 C++ 教程 ——触发改变网格的材质三十的主要内容,如果未能解决你的问题,请参考以下文章

最简单的 UE 4 C++ 教程 —— 寻找玩家的当前位置

最简单的 UE 4 C++ 教程 —— 漂浮的 Actor二十七

最简单的 UE 4 C++ 教程 —— 给 Actor 添加径向推力十八

最简单的 UE 4 C++ 教程 —— 为 Charactor 添加重叠事件十九

最简单的 UE 4 C++ 教程 ——两个相机视图的切换二十八

最简单的 UE 4 C++ 教程 ——带碰撞和粒子特效的角色操控二十九