Unity中UI按钮切换立方体透明度时颜色丢失问题求助
解决立方体透明度切换时颜色丢失的问题
我来帮你分析下问题根源,然后给出针对性的修复方案:
问题出在哪?
你的代码里有两个核心错误:
- 错误获取颜色模板:你在
OnOpacityButton里调用GetComponent<Renderer>().material.color,但空GameObject本身没有Renderer组件,所以这里拿到的是默认的白色(Color.white),第二次切换时自然就把所有立方体的材质改成了白色。 - 未保留原始RGB颜色:你直接用新的Color对象覆盖材质颜色,完全没保留每个立方体原本的红、绿、蓝通道值,导致颜色直接丢失。
修复后的完整脚本
我们需要提前保存每个立方体材质的初始颜色(包含RGB和原始Alpha),切换时只修改Alpha通道,同时用更清晰的布尔变量控制切换状态:
using UnityEngine; public class OpacityController : MonoBehaviour { // 定义两个透明度状态常量 private const float FullOpacity = 1f; private const float HalfOpacity = 0.5f; // 存储每个Renderer对应的初始颜色(保留原始RGB) private Color[] _initialColors; // 控制当前透明度状态的开关 private bool _isHalfOpacity = false; // 存储所有子物体的Renderer组件 private Renderer[] _renderers; void Start() { // 获取空对象下所有子物体的Renderer _renderers = GetComponentsInChildren<Renderer>(); // 初始化颜色数组,保存每个立方体的原始颜色 _initialColors = new Color[_renderers.Length]; for (int i = 0; i < _renderers.Length; i++) { _initialColors[i] = _renderers[i].material.color; } } public void OnOpacityButton() { // 切换透明度状态 _isHalfOpacity = !_isHalfOpacity; // 遍历所有立方体修改透明度 for (int i = 0; i < _renderers.Length; i++) { // 取出对应立方体的原始颜色,只修改Alpha通道 Color targetColor = _initialColors[i]; targetColor.a = _isHalfOpacity ? HalfOpacity : FullOpacity; // 应用到材质(用material而非sharedMaterial,避免修改原始材质资源) _renderers[i].material.color = targetColor; } } }
关键优化说明
- 保存初始颜色:在Start阶段就把每个立方体的原始颜色存起来,确保切换时不会丢失RGB信息。
- 仅修改Alpha通道:每次只改变Color的
a值,完全保留原始的r/g/b值,完美维持立方体原本的颜色。 - 布尔变量控状态:比用
i计数取模更直观,也避免了计数溢出的潜在问题。 - 正确使用material:用
material而不是sharedMaterial,只会修改当前物体的材质实例,不会影响项目里的原始材质资源(如果多个物体共用同一材质,可按需调整,但这里每个立方体有独立材质,用material更安全)。
额外注意
记得把你的三个透明材质(red_mat、blue_mat、green_mat)的Rendering Mode设置为Transparent或Fade,否则修改Alpha通道可能不会生效哦。
内容的提问来源于stack exchange,提问作者catcattt
相关产品推荐
相关产品推荐

