如何从动画剪辑中淡出场景中的对象?

How do you fade out an object in a scene from an animation clip?

我在 Unity 中有一个场景,带有动画资产。动画资产是一种自定义预制效果,其中嵌套了多个动画对象。资产循环运行,所有对象都使用 shadergraph 分配一个 PBR 着色器。一些资产最终会淡出,而另一些则会消失。我可以通过禁用对象来控制对象何时在时间轴上消失。但其他人需要逐渐消失。我怀疑我可以通过在动画剪辑的特定时间点更改 PBR 着色器图 material 的 alpha 来淡出这些对象。谁能建议有关如何淡出对象的过程或教程链接,从动画剪辑中的特定时间点开始,以及设置对象完全不可见时所需的持续时间?

要实现您想要的效果,您需要在 Animaton 中添加一个 AnimationEvent

您可以使用在动画 Window 属性中找到的 Rectangle Symbol 来做到这一点。

您现在可以使用那个 AnimationEvent 在脚本中调用一个函数来淡出对象。

还要确保将要将对象作为 float 淡化的时间量和当前 GameObject 作为 Object 淡化到函数中。

动画事件函数:

public void FadeOutEvent(float waitTime, object go) {
    // Get the GameObject fromt the recieved Object.
    GameObject parent = go as GameObject;

    // Get all ChildGameObjects and try to get their PBR Shader
    List<RPBShader> shaders = parent
        .GetComponentsInChildren(typeof(RPBShader)).ToList();

    // Call our FadeOut Coroutine for each Component found.
    foreach (var shader in shaders) {
        // If the shader is null skip that element of the List.
        if (shader == null) {
            continue;
        }
        StartCoroutine(FadeOut(waitTime, shader));
    }
}

RPBShader 是您要获取的组件类型。


要随着时间淡出对象,我们需要使用 IEnumerator

淡出协程:

private IEnumerator FadeOut(float waitTime, RPBShader shader) {
    // Decrease 1 at a time, 
    // with a delay equal to the time, 
    // until the Animation finished / 100.
    float delay = waitTime / 100;
  
    while (shader.alpha > 0) {
        shader.alpha--;
        yield return new WaitForSeconds(delay);
    }
}

shader.alpha 将是您要降低的当前对象 PBR 着色器 Alpha 值。