首页 > 解决方案 > 如何在两条动画曲线之间切换,以便播放数组中的第一条动画曲线,当它结束时,它开始播放第二条?

问题描述

在这种情况下,数组中有两条动画曲线。一个用于淡入,一个用于淡出。目前我在数组中使用索引 1,但我想在索引 0 和索引 1 之间进行平滑处理,以便它会不断平滑地淡入和淡出。

我想在索引 1 处开始播放第二条动画曲线时在索引 0 处播放动画曲线。

我之前尝试过使用 for 循环,如下所示:

for (int i = 0; i < fadeIn.Length; i++)
{
    _renderer.material.SetFloat(shaderProperty, fadeIn[i].Evaluate(Mathf.InverseLerp(0, spawnEffectTime, timer)));
}

但它在动画曲线之间没有变化。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnEffect : MonoBehaviour {
    public float spawnEffectTime = 2;
    public float pause = 1;
    public AnimationCurve[] fadeIn;
    public bool fadeOut = false;

    ParticleSystem ps;
    float timer = 0;
    Renderer _renderer;

    int shaderProperty;

    void Start ()
    {
        shaderProperty = Shader.PropertyToID("_cutoff");
        _renderer = GetComponent<Renderer>();
        ps = GetComponentInChildren <ParticleSystem>();

        var main = ps.main;
        main.duration = spawnEffectTime;

        ps.Play();
    }

    void Update()
    {
        FadeIn();
    }

    private void FadeOut()
    {
        
    }

    private void FadeIn()
    {
        if (timer < spawnEffectTime + pause)
        {
            timer += Time.deltaTime;
        }
        else
        {
            ps.Play();
            timer = 0;
        }
        _renderer.material.SetFloat(shaderProperty, fadeIn[1].Evaluate(Mathf.InverseLerp(0, spawnEffectTime, timer)));
    }
}

标签: c#unity3d

解决方案


这就是我一直在寻找的。工作很棒。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnEffect : MonoBehaviour
{

    public float spawnEffectTime = 2;
    public float pause = 1;
    public AnimationCurve[] fadeIn;
    public bool fadeOut = false;

    ParticleSystem ps;
    float timer = 0;
    Renderer _renderer;

    int fadeIndex = 0;

    int shaderProperty;

    void Start()
    {
        shaderProperty = Shader.PropertyToID("_cutoff");
        _renderer = GetComponent<Renderer>();
        ps = GetComponentInChildren<ParticleSystem>();

        var main = ps.main;
        main.duration = spawnEffectTime;

        ps.Play();

    }

    void Update()
    {
        FadeIn();
    }

    private void FadeOut()
    {

    }

    private void FadeIn()
    {
        if (timer < spawnEffectTime + pause)
        {
            timer += Time.deltaTime;
        }
        else
        {
            ps.Play();
            timer = 0;

            if (fadeIndex == 0)
            {
                fadeIndex = 1;
            }
            else
            {
                fadeIndex = 0;
            }
        }

        _renderer.material.SetFloat(shaderProperty, fadeIn[fadeIndex].Evaluate(Mathf.InverseLerp(0, spawnEffectTime, timer)));
    }
}

推荐阅读