docs.unity3d.com
    显示 / 隐藏目录

    Variable Rate

    菜单路径:Spawn > Variable Rate

    Variable Rate 代码块使用比 Constant Rate 代码块 更高级的方法。此代码块应用的生成速率是在周期所定义间隔内两个速率之间的线性插值。

    代码块兼容性

    此代码块兼容于以下上下文:

    • Spawn

    代码块属性

    Input 类型 描述
    Rate Vector2 此代码块用于计算生成率的两个值。当前速率始终是此 Vector2 的两个维度之间的值。
    Period Vector2 此代码块计算新的生成率之前的最小和最大时间段。周期越长,产生的速率变化越平滑;周期越短,产生的速率变化频率越高。

    备注

    您可以使用以下等效的自定义生成器回调实现来模拟此代码块:

    class VariableRateEquivalent : VFXSpawnerCallbacks
    {
        public class InputProperties
        {
            public Vector2 Rate;
            public Vector2 Period;
        }
    
        static private readonly int rateID = Shader.PropertyToID("Rate");
        static private readonly int periodID = Shader.PropertyToID("Period");
    
        public sealed override void OnPlay(VFXSpawnerState state, VFXExpressionValues vfxValues, VisualEffect vfxComponent)
        {
        }
    
        float m_PrevRate;
        float m_NextRate;
        float m_PrevTime;
        float m_NextTime;
    
        void AdvanceRate(float totalTime, Vector2 rate, Vector2 period)
        {
            m_PrevRate = m_NextRate;
            m_PrevTime = totalTime;
    
            m_NextRate = Random.Range(rate.x, rate.y);
            m_NextTime = totalTime + Random.Range(period.x, period.y);
        }
    
        public sealed override void OnUpdate(VFXSpawnerState state, VFXExpressionValues vfxValues, VisualEffect vfxComponent)
        {
            if (state.newLoop)
                AdvanceRate(state.totalTime, vfxValues.GetVector2(rateID), vfxValues.GetVector2(periodID));
    
            if (state.playing)
            {
                float range = m_NextTime - m_PrevTime;
                float ratio = 1.0f;
                if (range > 0.0f)
                    ratio = Mathf.Clamp01((state.totalTime - m_PrevTime) / range);
    
                float rate = Mathf.Lerp(m_PrevRate, m_NextRate, ratio);
                if (ratio == 1.0f)
                    AdvanceRate(state.totalTime, vfxValues.GetVector2(rateID), vfxValues.GetVector2(periodID));
    
                state.spawnCount += rate * state.deltaTime;
            }
        }
    
        public sealed override void OnStop(VFXSpawnerState state, VFXExpressionValues vfxValues, VisualEffect vfxComponent)
        {
        }
    }
    
    返回到顶部
    Copyright © 2023 Unity Technologies — 商标和使用条款
    • 法律条款
    • 隐私政策
    • Cookie
    • 不要出售或分享我的个人信息
    • Your Privacy Choices (Cookie Settings)