Files
2026-02-23 22:24:46 +07:00

67 lines
1.8 KiB
C#

using System.Collections;
using UnityEngine;
namespace AllIn13DShader
{
[ExecuteInEditMode]
public class MaterialPrewarmer : MonoBehaviour
{
[SerializeField] private Material[] materialsToPrewarm;
[SerializeField] private GameObject[] objectsToPrewarm;
[SerializeField] private Transform spawnPosT;
[SerializeField] private GameObject overlayUI;
private void Start()
{
StartRuntime();
}
private IEnumerator PrewarmMaterials()
{
overlayUI.SetActive(true);
// Graphics.DrawMesh uses Matrix4x4 instead of spawn position
Matrix4x4 matrix = Matrix4x4.TRS(spawnPosT.position, Quaternion.identity, Vector3.one * 0.01f);
Mesh quadMesh = CreateQuadMesh();
for(int i = 0; i < materialsToPrewarm.Length; i++) Graphics.DrawMesh(quadMesh, matrix, materialsToPrewarm[i], 0);
DestroyImmediate(quadMesh);
// Only use spawn position for complex prefabs that still need instantiation
for(int i = 0; i < objectsToPrewarm.Length; i++)
{
GameObject temp = Instantiate(objectsToPrewarm[i], spawnPosT.position, Quaternion.identity);
temp.transform.localScale = Vector3.one * 0.01f;
DestroyImmediate(temp);
}
yield return null;
overlayUI.SetActive(false);
Destroy(gameObject);
}
private void StartRuntime()
{
if(!Application.isPlaying) return;
StartCoroutine(PrewarmMaterials());
}
private Mesh CreateQuadMesh()
{
Mesh mesh = new Mesh
{
vertices = new Vector3[] {
new Vector3(-0.5f, -0.5f, 0),
new Vector3(0.5f, -0.5f, 0),
new Vector3(0.5f, 0.5f, 0),
new Vector3(-0.5f, 0.5f, 0)
},
triangles = new int[] { 0, 1, 2, 0, 2, 3 },
uv = new Vector2[] {
new Vector2(0, 0), new Vector2(1, 0),
new Vector2(1, 1), new Vector2(0, 1)
}
};
return mesh;
}
}
}