如何从动画剪辑中淡出场景中的对象?
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 值。
我在 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 值。