我正在尝试制作一个立方体,该立方体可以根据虚幻编辑器中制作的预设材质改变颜色。
// Fill out your copyright notice in the Description page of Project Settings.
//added constructor helpers, engine, and Kismet
#include "ColorChangingCube.h"
#include "UObject/ConstructorHelpers.h"
#include "Engine.h"
#include "Kismet/KismetMathLibrary.h"
#include "Kismet/KismetRenderingLibrary.h"
// Sets default values
AColorChangingCube::AColorChangingCube()
{
// 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;
//initializing mesh comp and setting it as Root comp
CubeMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("CubeMesh"));
RootComponent = CubeMesh;
//making construction helper using this model
static ConstructorHelpers::FObjectFinder<UStaticMesh>asset(TEXT("StaticMesh'/Game/Geometry/Meshes/1M_Cube.1M_Cube'"));
//setting mesh to constructions helper
CubeMesh->SetStaticMesh(asset.Object);
}
// Called when the game starts or when spawned
void AColorChangingCube::BeginPlay()
{
Super::BeginPlay();
}
// Called every frame
void AColorChangingCube::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void AColorChangingCube::ChangeColor()
{
//calling green material and naming it GreenMat
static ConstructorHelpers::FObjectFinder<UMaterial>GreenMat(TEXT("Material'/Game/FirstPerson/Material/Green.Green'"));
//calling red material and naming it RedMat
static ConstructorHelpers::FObjectFinder<UMaterial>RedMat(TEXT("Material'/Game/FirstPerson/Material/Red.Red'"));
//applying GreenMat as default material on actor
CubeMesh = GreenMat;
//if statements verifying green and red dynamic material instance
if (GreenMat.Object != NULL)
{
mInterface = (UMaterial*)GreenMat.Object;
}
if (RedMat.Object != NULL)
{
mInterface = (UMaterial*)RedMat.Object;
}
//if dynamic material is created, this creates it
if (mInterface)
{
MatInstance = UMaterialInstanceDynamic::Create(mInterface, this);
}
//checks to see if MatInstance is set
if (MatInstance)
{
CubeMesh->SetMaterial(0, MatInstance);
}
}
我一开始在拍摄演员时引擎严重崩溃。我尝试在第 54 行的 actor 上应用“默认”材质 GreenMat,但这不是编译错误。已经编辑了我的射弹类以成功调用 ColorChange。下面的代码。任何帮助将不胜感激。
void APaintballMichaelMProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit)
{
//variable for ColorChangingCube and if statement
AColorChangingCube* ColorActor = Cast<AColorChangingCube>(OtherActor);
if (ColorActor)
{
ColorActor->ChangeColor();
}
// Only add impulse and destroy projectile if we hit a physics
if ((OtherActor != nullptr) && (OtherActor != this) && (OtherComp != nullptr) && OtherComp->IsSimulatingPhysics())
{
OtherComp->AddImpulseAtLocation(GetVelocity() * 100.0f, GetActorLocation());
//commented out to prevent destruction
//Destroy();
}
那么,首先,您要实现的目标是什么?由于您有两种材质
GreenMat
和 RedMat
,您是在每次击中 AColorChangingCube
时尝试在这两种颜色之间交换,还是尝试在每次击中时设置随机材质?
无论哪种方式,我看到的第一个问题都在你的内部 您尝试使用
AColorChangingCube::ChangeColor()
类的 ConstructorHelpers
函数,这不能在函数内完成,顾名思义,ConstructorHelpers
只能在您的 AColorChangingCube
构造函数中使用(在 cpp 顶部定义)文件AColorChangingCube::AColorChangingCube()
。
只需移动以下行:
//calling green material and naming it GreenMat
static ConstructorHelpers::FObjectFinder<UMaterial>GreenMat(TEXT("Material'/Game/FirstPerson/Material/Green.Green'"));
//calling red material and naming it RedMat
static ConstructorHelpers::FObjectFinder<UMaterial>RedMat(TEXT("Material'/Game/FirstPerson/Material/Red.Red'"));
在构造函数中的这一行
CubeMesh->SetStaticMesh(asset.Object);
下。
完成后,您只需修复
AColorChangingCube::ChangeColor()
函数中的逻辑,如果您可以发布/链接到整个 ColorChangingCube.h
和 ColorChangingCube.cpp
文件,并更好地解释您想要的确切行为,我可以提供更好的答案。
如果您想通过 Discord 获得额外帮助,我非常乐意提供帮助。