Смена значения fillAmount

Как в скрипте сделать, чтобы после начала использования void StartSlow значение в fillAmount шло к 0, а после void StopSlow значение обратно шло к 1?

Вот сам скрипт

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SlowDown : MonoBehaviour
{
    public Image SlowValue;
    //private float TValue1 = -0.01f;
    //private float TValue2 = +0.01f;

    private void Start()
    {
        SlowValue = GetComponent<Image>();
    }

    // Активация функции Void
    private void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            StartSlow();
        }
        else if (Input.GetMouseButtonUp(1))
        {
            StopSlow();
        }

        if (SlowValue.fillAmount == 0.01f)
            StopSlow();

        
    }
    void StartSlow()
    {
        Time.timeScale = 0.4f;
        Time.fixedDeltaTime = Time.timeScale * 0.02f;

    }

    void StopSlow()
    {
        Time.timeScale = 1f;
        Time.fixedDeltaTime = Time.timeScale * 0.02f;

    }
}

Ответы (1 шт):

Автор решения: SdxSdySdz
using System;
using System.Collections;
using UnityEngine;


public class StackOverflow : MonoBehaviour
{
    private float _fillAmount;
    private float _changingSpeed = 1f;
    private float _accuracy = 0.01f;
    private Coroutine _changeFillAmountCoroutine;
    
    private void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            StartSlow();
        }
        else if (Input.GetMouseButtonUp(1))
        {
            StopSlow();
        }
    }

    private void StartSlow()
    {
        // если fillAmount уже меняется, приостанавливаем этот процесс
        if (_changeFillAmountCoroutine != null)
        {
            StopCoroutine(_changeFillAmountCoroutine);
        }
        
        // устремляем fillAmount к 0
        _changeFillAmountCoroutine = StartCoroutine(ChangeFillAmount(0));
    }

    private void StopSlow()
    {
        // если fillAmount уже меняется, приостанавливаем этот процесс
        if (_changeFillAmountCoroutine != null)
        {
            StopCoroutine(_changeFillAmountCoroutine);
        }
        
        // устремляем fillAmount к 1
        _changeFillAmountCoroutine = StartCoroutine(ChangeFillAmount(1));
    }
    
    private IEnumerator ChangeFillAmount(float target)
    {
        var waitForEndOfFrame = new WaitForEndOfFrame();

        while (Math.Abs(_fillAmount - target) >= _accuracy)
        {
            // меняем fillAmount. _changingSpeed отвечает за то,
            // как быстро вы хотите, чтобы fillAmount стремился к своему целевому значению
            _fillAmount = Mathf.MoveTowards(_fillAmount, target, Time.deltaTime * _changingSpeed);
            // ждём конца кадра. Когда кадр закончится, эта функция перейдёт к следующей итерации цикла
            yield return waitForEndOfFrame;
        }
    }
}
→ Ссылка