#c# #unity3d #co #routines
#c# #unity3d #co #подпрограммы
Вопрос:
У меня есть подпрограмма co, которая после выбора воспроизводится. Подпрограмма co масштабирует объект. Вторая выбранная программа уменьшает масштаб объекта.
Однако, если я снова выберу ее, ничего не произойдет. Однако это работает в первый раз.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class square : MonoBehaviour
{
public Transform Button;
float ElapsedTime = 0.0f;
float TotalTime = 0.4f;
private bool _isenlargingcanvas;
public void enlargecanvas()
{
if (_isenlargingcanvas)
return;
_isenlargingcanvas = true;
StartCoroutine(transitionscale());
_isenlargingcanvas = false;
}
IEnumerator transitionscale()
{
while (ElapsedTime < TotalTime)
{
ElapsedTime = Time.deltaTime;
Button.localScale = Vector3.Lerp(new Vector3(0, 0, 0), new
Vector3(9, 7, 7), (ElapsedTime / TotalTime));
yield return null;
}
}
private bool _isshrinkingcanvas;
public void shrinkcanvas()
{
if (_isshrinkingcanvas)
return;
_isshrinkingcanvas = true;
StartCoroutine(transitionscaledown());
_isshrinkingcanvas = false;
}
IEnumerator transitionscaledown()
{
while (ElapsedTime < TotalTime)
{
ElapsedTime = Time.deltaTime;
Button.localScale = Vector3.Lerp(new Vector3(9, 7, 7), new
Vector3(0, 0, 0), (ElapsedTime / TotalTime));
yield return null;
}
}
}
У меня есть подпрограмма co, которая после выбора воспроизводится. Подпрограмма co масштабирует объект. Вторая выбранная программа уменьшает масштаб объекта.
Однако, если я снова выберу ее, ничего не произойдет. Однако это работает в первый раз.
Комментарии:
1. Поэтому добавьте несколько отладочных инструкций — тот факт, что для вашего _isshrink снова установлено значение false, возможно, до того, как сопрограмма действительно запустится, не поможет.
Ответ №1:
Мне кажется, что вы не сбрасываете ElapsedTime
поле, поэтому, если вы повторно вводите transitionscale()
метод, условие в while
операторе уже false, поэтому метод завершается, ничего не делая.
Возможными решениями этого являются сброс переменной перед каждым вызовом метода … следующим образом
// Inside the elarge canvas method
ElapsedTime = 0.0f;
StartCoroutine(transitionscale());
Альтернативно, и с меньшими затратами, вы можете сбросить его внутри метода tranisition scale .
IEnumerator transitionscale()
{
ElapsedTime = 0.0f;
while (ElapsedTime < TotalTime)
{
ElapsedTime = Time.deltaTime;
Button.localScale = Vector3.Lerp(new Vector3(0, 0, 0), new
Vector3(9, 7, 7), (ElapsedTime / TotalTime));
yield return null;
}
}
Вам нужно будет сделать то же самое для trasitionscaledown()
метода. Рассмотрите одно из этих изменений и посмотрите, решит ли это вашу проблему.