Unity中按下A键实现Image图片渐隐效果代码不生效问题咨询
代码存在的核心问题
- 按键检测逻辑放在
Start()生命周期中:Start()仅会在脚本挂载的对象被激活时执行1次,几乎不可能刚好捕捉到你按下A键的操作,必须将按键检测移至每帧执行的Update()中。 - 效果逻辑与需求相反:需求是渐隐效果,你写的协程里
targetAlpha设为1.0,是从当前透明度向完全不透明过渡的渐显逻辑,渐隐应该将targetAlpha设为0。 - 冗余的材质实例化操作:UI Image组件的透明度直接修改自身
color属性即可生效,无需额外实例化材质,多余操作反而可能引发渲染层级、材质泄漏等问题。 - 缺少协程重复触发防护:如果未加判断,多次按下A键会启动多个协程同时修改透明度,导致效果异常、性能浪费。
- 没有默认的渐变速率赋值:如果Inspector面板未给
FadeRate赋值,默认值为0会导致渐变完全不生效。
修正后的完整代码
using UnityEngine; using UnityEngine.UI; using System.Collections; public class ImageFade : MonoBehaviour { // 给渐变速率设置默认值2,可在Inspector面板自行调整 public float FadeRate = 2f; private Image image; // 标记是否正在执行渐变,避免重复触发协程 private bool isFading = false; void Start() { // 初始化时就获取Image组件,不用等到按键时再拿 image = GetComponent<Image>(); } void Update() { // 每帧检测A键按下,且当前没有在执行渐变才触发 if (Input.GetKeyDown(KeyCode.A) && !isFading) { StartCoroutine(FadeOut()); } } IEnumerator FadeOut() { isFading = true; // 渐隐目标透明度为0 float targetAlpha = 0f; Color curColor = image.color; while (Mathf.Abs(curColor.a - targetAlpha) > 0.0001f) { curColor.a = Mathf.Lerp(curColor.a, targetAlpha, FadeRate * Time.deltaTime); image.color = curColor; yield return null; } // 最后把透明度直接设为目标值,避免剩余极小差值的问题 curColor.a = targetAlpha; image.color = curColor; isFading = false; } }
使用注意事项
- 该脚本需挂载在带有Image组件的UI对象上。
- 如果需要实现按下A键时如果已经透明就渐显、不透明就渐隐的切换效果,只需要在触发协程前判断当前
image.color.a的值,动态设置targetAlpha即可。
内容的提问来源于stack exchange,提问作者Leho
相关产品推荐
相关产品推荐

