Please make it so that material instances can be casted onto their parent material. Right now the materials look like this:
Example1<scoped {/gameexpf@fortnite.com/ExampleProject}> := class<scoped {/gameexpf@fortnite.com/ExampleProject}>(material):
@editable
var Val1<public>:float = external {}
Example1Instance<scoped {/gameexpf@fortnite.com/ExampleProject}> := class<scoped {/gameexpf@fortnite.com/ExampleProject}>(material):
@editable
var Val1<public>:float = external {}
And to change parameters for Example1Instance, even though they are the same, we need to cast to it directly:
var PlayersMats : [agent]material = map{}
OnBegin<override>()<suspends>:void=
for (Agent : GetPlayspace().GetPlayers()):
if:
GetRandomInt(0, 1) = 0
set PlayersMats[Agent] = Mats.Example1{}
else:
set PlayersMats[Agent] = Mats.Example1Instance{}
UpdateMaterial(Agent:agent):void=
if (AgentMat := Mats.Example1[PlayersMats[Agent]]):
set AgentMat.Val1 = 1.0
else if (AgentMat := Mats.Example1Instance[PlayersMats[Agent]]):
set AgentMat.Val1 = 1.0
My best idea to implement this today is to create UMG widgets with verse fields for each parent material, and manipulate which instance and parameters to use using these fields:
var PlayersMats : [agent]Blueprints.UI.WB_Material = map{}
OnBegin<override>()<suspends>:void=
for (Agent : GetPlayspace().GetPlayers()):
if:
GetRandomInt(0, 1) = 0
AgentMat := Mats.Example1{}
set PlayersMats[Agent] = Blueprints.UI.WB_Example1Material:
Material := AgentMat
Val1 := AgentMat.Val1
else:
AgentMat := Mats.Example1Instance{}
set PlayersMats[Agent] = Blueprints.UI.WB_Example1Material:
Material := AgentMat
Val1 := AgentMat.Val1
UpdateMaterial(Agent:agent):void=
if (AgentMatWB := PlayersMats[Agent]):
set AgentMatWB.Val1 = 1.0
It would be much better if the instances were subclasses of the parent material:
Example1<scoped {/gameexpf@fortnite.com/ExampleProject}> := class<scoped {/gameexpf@fortnite.com/ExampleProject}>(material):
@editable
var Val1<public>:float = external {}
Example1Instance<scoped {/gameexpf@fortnite.com/ExampleProject}> := class<scoped {/gameexpf@fortnite.com/ExampleProject}>(Example1):
var PlayersMats : [agent]Mats.Example1 = map{}
OnBegin<override>()<suspends>:void=
for (Agent : GetPlayspace().GetPlayers()):
if:
GetRandomInt(0, 1) = 0
set PlayersMats[Agent] = Mats.Example1{}
else:
set PlayersMats[Agent] = Mats.Example1Instance{}
UpdateMaterial(Agent:agent):void=
if (AgentMat := PlayersMats[Agent]):
set AgentMat.Val1 = 1.0
*All of the code here was written from blank, and it might contain small mistakes.