docs.unity3d.com
    目次を表示する/隠す

    Variable Rate

    メニューパス : Spawn > Variable Rate

    Variable Rate ブロックは、Constant Rate ブロック よりも高度なアプローチを使います。ブロックが適用するスポーンレートは、期間によって定義される間隔内の 2 つのレート間で線形補間されます。

    ブロックの互換性

    このブロックは、以下のコンテキストと互換性があります。

    • Spawn 

    ブロックのプロパティ

    Input Type 説明
    Rate Vector2 ブロックがスポーンレートを計算する際に使う、2 つの値です。現在のレートは常に、この Vector2 の 2 次元間の値になります。
    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 — 商標と利用規約
    • 法律関連
    • プライバシーポリシー
    • クッキー
    • 私の個人情報を販売または共有しない
    • Your Privacy Choices (Cookie Settings)