Unity:如何实现GameObject下所有SkinnedMeshRenderer材质的淡入效果
解决多SkinnedMeshRenderer组件的敌人生成淡入问题
嘿,我完全懂你的困扰——你的敌人预制体有两个SkinnedMeshRenderer组件,但当前代码只抓取到了第一个,所以只有第一个材质会呈现淡入效果。要搞定这个,核心是要获取所有的SkinnedMeshRenderer组件,再逐个修改它们的材质透明度。
修改后的完整代码
// 存储敌人身上所有的SkinnedMeshRenderer组件 public SkinnedMeshRenderer[] enemyRenderers; public float fadeProgress; void Start () { // 用复数形式的GetComponents获取当前GameObject下所有该类型组件 enemyRenderers = GetComponents<SkinnedMeshRenderer>(); } void Update () { // 计算淡入进度,用Clamp限制Alpha值在0-1之间,避免超过上限 fadeProgress = Mathf.Clamp(Time.time / 2, 0f, 1f); FadeIn(fadeProgress); } void FadeIn(float progress) { // 遍历所有渲染器,逐个修改材质透明度 foreach (var renderer in enemyRenderers) { Color updatedColor = renderer.material.color; // 保持RGB颜色不变,只修改Alpha通道 updatedColor.a = progress; renderer.material.color = updatedColor; } }
关键改动说明
- 把单个
Material变量换成SkinnedMeshRenderer[]数组,用来存下所有找到的渲染器组件。 - 用
GetComponents<SkinnedMeshRenderer>()(复数形式)替代原来的GetComponent,这样能一次性拿到GameObject下所有的该组件,不管有几个。 - 在
FadeIn方法里通过foreach循环遍历数组,确保每个渲染器的材质都被修改到。 - 新增
Mathf.Clamp来限制透明度范围在0到1之间,避免时间累积后Alpha值超过1(这会导致淡入效果提前终止,甚至出现异常)。
额外小提示
如果你担心频繁调用.material会创建过多材质实例(增加内存开销),可以改用.sharedMaterial。但要注意:修改sharedMaterial会影响所有使用该材质的对象——如果每个敌人需要独立的淡入节奏,就继续用.material;如果是全局统一的淡入效果,sharedMaterial会更高效。
内容的提问来源于stack exchange,提问作者Ved Sarkar
相关产品推荐
相关产品推荐

