가변 속도
메뉴 경로: Spawn > Variable Rate
Variable Rate 블록은 Constant Rate 블록보다 더 발전된 접근 방식을 사용합니다. 이 블록이 적용하는 생성 속도는 Period에서 정의된 간격 내에 있는 두 속도 사이에서 선형적으로 보간됩니다.
블록 호환성
이 블록은 다음 컨텍스트와 호환됩니다.
블록 프로퍼티
입력 | 타입 | 설명 |
---|---|---|
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)
{
}
}