Quick answer: Verify the parameter name exactly matches the MPC asset, confirm the material samples the MPC via a Collection Parameter node (not a local parameter with the same name), and call SetScalarParameterValue with the correct MPC asset reference. Typos silently write to nothing.
Here is how to fix Unreal Material Parameter Collection not updating. You use an MPC to drive a global wetness value across all outdoor materials. You call UKismetMaterialLibrary::SetScalarParameterValue(World, MPC_Weather, "Wetness", 1.0f). Nothing changes visually. All your shader graphs sample the Collection Parameter correctly in the editor preview. The MPC asset itself shows the value changing when you scrub it in the editor. But at runtime the materials ignore the update.
The Symptom
Setting MPC parameters at runtime via code or Blueprint has no visual effect. The MPC asset inspection shows the updated value. Materials that reference the MPC continue to render with the old value. Other material parameter changes (via SetScalarParameterValue on MID) work correctly — the problem is specifically with MPC-routed values.
What Causes This
Parameter name typo. MPC parameter names are case-sensitive strings. "wetness" and "Wetness" are different. UKismetMaterialLibrary does not error on unknown parameter names — it silently creates (or misses) based on exact match.
Wrong MPC asset passed. If your game has multiple MPCs (MPC_Weather, MPC_DayNight, MPC_PlayerStats), passing the wrong one to SetScalarParameterValue writes to a collection the target material does not reference.
Material uses local parameter of same name. If a material declares a local scalar parameter named “Wetness” and also samples an MPC with a parameter named “Wetness,” the local parameter shadows the MPC read. Updating the MPC does not affect the material because the material is reading its own parameter.
Collection Parameter node missing in material. If the shader graph reads the MPC value with a normal Scalar Parameter node instead of a Collection Parameter node, it does not actually sample the MPC. The node type matters.
Wrong world context. MPC values are per-World. If you pass a different world (common in multi-client split-screen or replicated games), you write to that world’s MPC instance, not the one the rendering world uses.
Value set in construction script. MPC writes during OnConstruction run at unpredictable times during editor work and startup. Gameplay MPC updates belong in BeginPlay or runtime events, not construction.
The Fix
Step 1: Verify parameter name exactness. Open the MPC asset. Note the scalar parameter name exactly (case included). In code:
// C++
#include "Kismet/KismetMaterialLibrary.h"
void ASkyActor::UpdateWeather(float Wetness)
{
UKismetMaterialLibrary::SetScalarParameterValue(
GetWorld(),
WeatherMPC, // UMaterialParameterCollection* UPROPERTY
FName("Wetness"), // must match MPC exactly
Wetness);
}
Exposing the MPC reference as a UPROPERTY rather than hardcoding a name means it is assignable in the Inspector — reduces string mismatch risk.
Step 2: Confirm material uses Collection Parameter node. Open your material. Search for any parameter named “Wetness.” It should be a Collection Parameter node (has a Collection dropdown and a Parameter dropdown). If it is a Scalar Parameter node, that is a local material parameter and your MPC updates do not reach it.
To convert: delete the Scalar Parameter node, add a Collection Parameter node, set Collection = MPC_Weather and Parameter = Wetness. Reconnect the output.
Step 3: Use MPC reference, not asset path. Do not look up MPCs by path string at runtime:
// Bad: string-based lookup is fragile
UMaterialParameterCollection* MPC = LoadObject<UMaterialParameterCollection>(
nullptr, TEXT("/Game/MPC_Weather.MPC_Weather"));
// Good: UPROPERTY reference, set in editor
UPROPERTY(EditAnywhere)
UMaterialParameterCollection* WeatherMPC;
Editor-assigned references follow renames and moves automatically. Path strings break silently when assets reorganize.
Step 4: Get and verify. Read back to confirm the write took effect:
float Current = UKismetMaterialLibrary::GetScalarParameterValue(
GetWorld(), WeatherMPC, FName("Wetness"));
UE_LOG(LogTemp, Log, TEXT("Wetness now %f"), Current);
If the log shows 0 after setting to 1, the parameter name is wrong. If it shows 1 but materials do not reflect it, the materials are reading from somewhere else.
Vector vs Scalar
MPC supports scalar and vector parameters. Mixing them up is another silent failure:
SetScalarParameterValue: writes to a named scalarSetVectorParameterValue: writes to a named vector (FLinearColor)
Calling SetScalar on a vector parameter does not error; it just does nothing. Match the call to the declared type.
When to Use MPC vs Material Instance
MPC is good for global values that affect many materials — time of day, weather, global color palette. Material Instance Dynamic (MID) is good for per-object values — this NPC’s team color, this door’s dent damage.
Do not use MPC for per-object values — it is a shared global. Setting one object’s weather affects everyone.
Performance Note
MPC writes are very cheap. The cost is not on the write; it is in the material evaluation, which samples the MPC value once per pixel. MPC values update on the GPU when any shader samples them — the write itself does not trigger a frame re-render until next frame.
“MPC is a global post office: set the value here, every material reads it. But only if every material subscribed with the right address.”
Related Issues
For Niagara parameter issues, see Unreal Niagara Not Spawning in Packaged Build. For subsystem init issues, GameInstance Subsystem Not Initializing covers related global-state patterns.
Collection Parameter node, not Scalar Parameter node. Get it right in the material graph.