Variable Rate
メニューパス : Spawn > Variable Rate
Variable Rate ブロックは、Constant Rate ブロック よりも高度なアプローチを使います。ブロックが適用するスポーンレートは、期間によって定義される間隔内の 2 つのレート間で線形補間されます。
ブロックの互換性
このブロックは、以下のコンテキストと互換性があります。
ブロックのプロパティ
| 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)
{
}
}