Как плавно изменять значения с плавающей запятой с помощью сопрограммы?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как плавно изменять значения с плавающей запятой с помощью сопрограммы?

Сообщение Anonymous »

внутри OnValidate

Код: Выделить всё

private void OnValidate()
{
// Handle changes to changeBothRadius
if (changeBothRadius != previousBothRadius)
{
SyncRadii(); // Sync radii when changeBothRadius changes
previousBothRadius = changeBothRadius;
}
else if (xradius != previousXradius || yradius != previousYradius)
{
// Allow independent changes to xradius and yradius
Debug.Log($"Updating radii: X = {xradius}, Y = {yradius}");
previousXradius = xradius;
previousYradius = yradius;
}

// Update LineRenderer and object positions
if (line != null && draw)
{
ConfigureLineRenderer();
CreatePoints();
AdjustPositions(numOfObjects, transform.position, xradius, yradius); // Pass both radii
}
}
когда я вызываю этот метод SyncRadii, он одновременно меняет значения xradius и yradius, как будто «перепрыгивает» значения, чтобы они были одинаковыми со значением ChangeBothRadius.
например, если я xradius 3, а yradius равен 7 и я меняю значение ChangeBothRadius на 10, то и xradius, и yradius «перепрыгивают» на значение 10.
вместо этого я хочу, чтобы они плавно меняли значения.

Код: Выделить всё

void SyncRadii()
{
xradius = changeBothRadius;
yradius = changeBothRadius;

previousXradius = xradius;
previousYradius = yradius;
}
что я пытался сделать в этом методе:

Код: Выделить всё

void SyncRadii()
{
// Start the coroutine to smooth the radius change
StopAllCoroutines(); // Stop any ongoing radius adjustments
StartCoroutine(SmoothSyncRadii(changeBothRadius, 0.5f)); // Adjust over 0.5 seconds

previousXradius = xradius;
previousYradius = yradius;
}
и добавил эту сопрограмму:

Код: Выделить всё

private IEnumerator SmoothSyncRadii(float targetRadius, float duration)
{
float elapsedTime = 0f;

float startXRadius = xradius;
float startYRadius = yradius;

while (elapsedTime < duration)
{
elapsedTime += Time.deltaTime;
float t = elapsedTime / duration;

// Smoothly interpolate the radii
xradius = Mathf.Lerp(startXRadius, targetRadius, t);
yradius = Mathf.Lerp(startYRadius, targetRadius, t);

yield return null; // Wait until the next frame
}

// Ensure the final value is set
xradius = targetRadius;
yradius = targetRadius;
}
но все же, когда я меняю значение ChangeBothRadius, xradius и yradius «перепрыгивают» на значение ChangeBothRadius и больше не плавно меняются до этого значения.>

Подробнее здесь: https://stackoverflow.com/questions/792 ... -coroutine
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»