У меня есть подпрограмма co, которая после выбора воспроизводится. Однако, если я снова выберу ее, ничего не произойдет. Однако это работает в первый раз

#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() метода. Рассмотрите одно из этих изменений и посмотрите, решит ли это вашу проблему.