被玩家弹丸击中时更改演员材质 UE4

问题描述 投票:0回答:1

我正在尝试制作一个立方体,该立方体可以根据虚幻编辑器中制作的预设材质改变颜色。

// 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();
    }
c++ unreal-engine4 unreal
1个回答
0
投票

那么,首先,您要实现的目标是什么?由于您有两种材质

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 获得额外帮助,我非常乐意提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.