75 lines
1.8 KiB
C#
75 lines
1.8 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|
||
}
|