using System.Collections; using System.Collections.Generic; using UnityEngine; public class FuTiLightingCtrl : MonoBehaviour { // 原始材质(在Inspector中赋值) public Material originalMaterial; //所有render public Renderer[] AllRenders; //所有实例化的材质 private Material[] _instanceMaterials; // 实例化的材质副本 [Range(0, 20)] public float targetIntensity = 5f; // 目标强度 private float _currentIntensity; void Start() { _instanceMaterials = new Material[AllRenders.Length]; for (int i = 0; i < AllRenders.Length; i++) { // 实例化材质副本(关键步骤) _instanceMaterials[i] = new Material(originalMaterial); // 将副本赋值给物体,替代原始材质 AllRenders[i].material = _instanceMaterials[i]; } StartCoroutine(WaitTimeToLetLighting()); } // 修改实例化材质的自发光强度 public void ChangeInstanceColor(int num) { _instanceMaterials[num].SetFloat("_EmissionIntensity", targetIntensity); } // 清理:销毁实例化的材质(避免内存泄漏) void OnDestroy() { for (int i = 0;i < AllRenders.Length;i++) { if (_instanceMaterials[i] != null) { Destroy(_instanceMaterials[i]); } } } IEnumerator WaitTimeToLetLighting() { int num = 0; while (true) { yield return new WaitForSeconds(0.5f); if (num < AllRenders.Length) { _instanceMaterials[num].SetFloat("_EmissionIntensity", targetIntensity); num++; } else { foreach (var mat in _instanceMaterials) { mat.SetFloat("_EmissionIntensity", 0); } num = 0; } } } }