Make material instances in assets.digest.verse children of the parent materials

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.

I’ve been hitting this too especially with ui and sg

This will simplify the code for my custom UI. :+1:

1 Like