- Home /
What is a light weight option for changing the color of a LWRP material at runtime?
I'm busy writing a mobile game at the moment, so it requires the game to be as light weight as possible.
I've got an issue where I have 126 cubes on screen at a time all of which are randomly changing color every second.
If I'm not mistaken, Unity technically creates a new material every time a material color changes. Which is causing my game to become dead slow on some devices.
The game is using the LWRP using the lit shader.
Do anyone here know of a lightweight solution for this problem?
Here's the script that handles the color change (it's attached to each of the 126 cubes):
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
class PlayerMaterialShift : MonoBehaviour
{
#region Prefab Components
[SerializeField]
private List<Transform> playerBodies;
private Material material;
[SerializeField]
private Renderer renderer;
#endregion
#region Private Values
[SerializeField]
private List<Color> colors;
[SerializeField]
private BaseColors baseColor = BaseColors.Green;
[SerializeField]
private float materialTimeMax = 5f;
private float materialTimer;
#endregion
#region Read Only Values
private readonly string colorVariable = "_BaseColor";
#endregion
void Start()
{
material = renderer.material;
if (colors.Count == 0)
{
colors.Add(Color.red);
colors.Add(Color.blue);
}
}
void Update()
{
materialTimer += Time.deltaTime;
if (materialTimer >= materialTimeMax)
{
materialTimer = 0;
material.SetColor(colorVariable, colors[Random.Range(0, colors.Count)]);
}
transform.rotation = Quaternion.identity;
}
}
Answer by ph_ · Aug 12, 2019 at 04:51 AM
A fast solution is to use MaterialPropertyBlock and [PerRendererData]. I think you will find exactly what you're looking for in this blog post
Even thought it's 3 years old, it should work almost the same way the author did. One difference will be that in LWRP you can't use Surface shaders.
Another very fast solution (the fastest that I know of) would be to use GPU instancing in addition. I believe this page this page would be a good explanation and starting point. But know that on some low-end devices, GPU instancing isn't supported. Mainly all devices with GPU that don't support Opengles 3.0 (for android) or Metal (for iOS).
Thanks, this was a good read. Will help a lot in my case.
Your answer
Follow this Question
Related Questions
how to change object material with mouse click ? 2 Answers
Shared materials over muliple players 2 Answers
Glowing Particle 3 Answers
How to change a specific material of an object ? 0 Answers
Problem with material color change. 2 Answers