Trouble editing Dynamic Material param at Runtime

Hi all,

I am struggling with an issue editing a parameter of a Material at runtime via C++. The premise is thus: I am implementing Chess and trying to set up an OnClick Highlight effect (using a simple Fresnel) so the player knows what piece they’ve selected. The material on the pieces looks as follows:

I modify the Tint successfully on creation of the piece in the world (I’m spawning the board and pieces programmatically), with the following code

//Initialize Piece
void APiece::InitializePiece(bool bPlayer)
{
	TArray<UStaticMeshComponent*> Components;

	if (bPlayer)
	{
		PieceColor = FLinearColor::Black;
	}
	else
	{
		PieceColor = FLinearColor::White;
	}

	GetComponents<UStaticMeshComponent>(Components);

	//Get the Static Mesh Component
	DynamicMaterial = UMaterialInstanceDynamic::Create(Components[0]->GetMaterial(0), this);

	//Set the tint parameter to Black or White
	DynamicMaterial->SetVectorParameterValue("Tint", PieceColor);
	Components[0]->SetMaterial(0, DynamicMaterial);

	bIsHighlighted = false;
}

This all works fine, it changes the base color of the pieces and sets them to white/black correctly. I have an OnClick event that calls the following function, which is where it seems to be going wrong:

void APiece::ChangeHighlight()
{
	TArray<UStaticMeshComponent*> Components;

	GetComponents<UStaticMeshComponent>(Components);

	DynamicMaterial = UMaterialInstanceDynamic::Create(Components[0]->GetMaterial(0), this);

	//If piece is not highlighted, highlight it, else remove highlight
	if (!bIsHighlighted)
	{
		DynamicMaterial->SetScalarParameterValue("Intensity", 1.0f);
		bIsHighlighted = true;
		UE_LOG(LogTemp, Warning, TEXT("Setting Highlight"));
	}
	else
	{
		DynamicMaterial->SetScalarParameterValue("Intensity", 0.0f);
		bIsHighlighted = false;
		UE_LOG(LogTemp, Warning, TEXT("Removing Highlight"));
	}

	Components[0]->SetMaterial(0, DynamicMaterial);

}

When I click the actor, it turns the entire actor dark gray permanently. I’m not sure what I’m doing wrong here, but I’m pretty sure it’s in the ChangeHighlight function, as I have traced through all the other code to make sure it’s firing. Help figuring this out would be greatly appreciated!

Thats Probably because you already Converted it to a Dynamic Material (Init Function) and trying to Convert it again to a Dynamic Material (Highlight Function). That will Probaly Fail :stuck_out_tongue_winking_eye:

Since you already have a Dynamic Material use it right away without creating a new one. Cast to UMaterialInstanceDynamic if necessary. You also dont need to reassign the Material to the Mesh at the end.

That was exactly it. Thank you so much, I’d been struggling with this for a while. =)