You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity3D中如何用C#脚本实现含Cube和Capsule的预制体淡入淡出

Unity C#实现带时长控制的预制体淡入淡出效果

嘿,我来帮你搞定这个需求!针对包含Cube和Capsule的预制体,我们可以通过控制它们Renderer组件的材质透明度来实现淡入淡出,同时加上时长控制让效果更可控。下面是完整的实现方案:

实现思路

  • 预制体里的Cube和Capsule都是3D物体,核心是修改它们Renderer组件材质颜色的Alpha通道来实现透明效果
  • 用Unity的协程(Coroutine)来平滑过渡Alpha值,这样能精准控制淡入/淡出的时长
  • 封装独立的方法,方便你随时调用淡入、淡出,或者设置自动触发逻辑

完整脚本实现

using UnityEngine;
using System.Collections;

public class FadeController : MonoBehaviour
{
    // 淡入/淡出的总时长,可在Inspector面板调整(单位:秒)
    [SerializeField] private float fadeDuration = 1f;
    // 缓存预制体中所有3D物体的Renderer组件
    private Renderer[] _renderers;

    private void Awake()
    {
        // 获取当前物体及其子物体的所有Renderer组件,自动适配Cube和Capsule
        _renderers = GetComponentsInChildren<Renderer>();
    }

    /// <summary>
    /// 触发淡入效果:从完全透明(Alpha=0)过渡到完全不透明(Alpha=1)
    /// </summary>
    public void FadeIn()
    {
        // 先停止当前可能运行的协程,避免动画冲突
        StopAllCoroutines();
        StartCoroutine(FadeCoroutine(0f, 1f));
    }

    /// <summary>
    /// 触发淡出效果:从完全不透明(Alpha=1)过渡到完全透明(Alpha=0)
    /// </summary>
    public void FadeOut()
    {
        StopAllCoroutines();
        StartCoroutine(FadeCoroutine(1f, 0f));
    }

    /// <summary>
    /// 核心协程:控制Alpha值从起始值平滑过渡到目标值
    /// </summary>
    private IEnumerator FadeCoroutine(float startAlpha, float targetAlpha)
    {
        float elapsedTime = 0f;
        // 先记录每个Renderer的原始颜色(保留RGB,只修改Alpha)
        Color[] originalColors = new Color[_renderers.Length];
        
        for (int i = 0; i < _renderers.Length; i++)
        {
            originalColors[i] = _renderers[i].material.color;
            originalColors[i].a = startAlpha;
            _renderers[i].material.color = originalColors[i];
        }

        // 平滑过渡循环
        while (elapsedTime < fadeDuration)
        {
            elapsedTime += Time.deltaTime;
            // 用线性插值计算当前Alpha值,也可以换成Mathf.SmoothStep实现更自然的缓动效果
            float currentAlpha = Mathf.Lerp(startAlpha, targetAlpha, elapsedTime / fadeDuration);

            // 更新所有物体的透明度
            for (int i = 0; i < _renderers.Length; i++)
            {
                Color updatedColor = originalColors[i];
                updatedColor.a = currentAlpha;
                _renderers[i].material.color = updatedColor;
            }

            yield return null;
        }

        // 最后强制设置到目标Alpha,避免帧率波动导致的精度问题
        for (int i = 0; i < _renderers.Length; i++)
        {
            Color finalColor = originalColors[i];
            finalColor.a = targetAlpha;
            _renderers[i].material.color = finalColor;
        }
    }

    // 可选:预制体激活时自动触发淡入
    private void OnEnable()
    {
        FadeIn();
    }

    // 可选:预制体禁用时自动触发淡出
    private void OnDisable()
    {
        FadeOut();
    }
}

使用步骤

  • 将这个脚本挂载到你的预制体根节点上
  • 在Unity Inspector面板中,调整fadeDuration参数设置淡入/淡出的时长(比如设置为2秒,效果就会更平缓)
  • 通过代码调用方法触发效果:
    // 假设你实例化了预制体,获取组件后调用
    GameObject prefabInstance = Instantiate(yourPrefab);
    FadeController fadeCtrl = prefabInstance.GetComponent<FadeController>();
    // 触发淡出
    fadeCtrl.FadeOut();
    

关键注意事项

  • 确保Cube和Capsule的材质支持透明:在Material面板的Rendering Mode中选择Transparent或Fade,否则修改Alpha值不会生效
  • 如果预制体后续添加了更多3D物体,脚本会自动识别,无需额外修改
  • 若想让动画更自然,可以把Mathf.Lerp替换成Mathf.SmoothStep,实现先慢后快或先快后慢的缓动效果

内容的提问来源于stack exchange,提问作者Ashok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:18:50