-5

Как в скрипте сделать, чтобы после начала использования 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;

}

}

sokilo
  • 31
  • Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете. – Дух сообщества Nov 01 '21 at 08:32
  • Поверь, товарищ, с момента твоего прошлого вопроса: https://ru.stackoverflow.com/q/1344144/191482 ничего не поменялось. Советы всё те же. – Алексей Шиманский Nov 01 '21 at 08:34
  • @АлексейШиманский В книге "Unity в действии" в какой главе мой вопрос? – sokilo Nov 01 '21 at 08:36
  • Ты ожидаешь, что в программировании не нужно думать головой, а только копипастить код из книг и интернета? Ошибаешься. – Алексей Шиманский Nov 01 '21 at 08:41
  • @АлексейШиманский Ты гений, правда. Может я хочу посмотреть как это работает и как с этим работать? С чего ты взял, что я тупо скопирую из книги код и забью? – sokilo Nov 01 '21 at 08:43
  • Чтобы посмотреть как это работает, люди обычно думают логически и приходят у умозаключениям. На основе них пишут код на языке, который предварительно изучили. Три вопроса: 1) Ты изучил ЯП? 2) Ты логически рассуждал над данной задачей? 3) К чему пришёл в ходе рассуждений? – Алексей Шиманский Nov 01 '21 at 09:01
  • Возможный дубликат вопроса: Книги и учебные ресурсы по Unity3D – Andrew Nov 14 '21 at 07:47

1 Answers1

-1
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;
        }
    }
}
  • Спасибо огромное, я чу-чуть отредактировал скрипт и всё работает! У меня еще маленький вопрос, как сделать так, чтобы восстановление срабатывало не сразу, а через пару секунд? – sokilo Nov 02 '21 at 08:51
  • @sokilo, рад помочь. для этого достаточно в самом начале метода ChangeFillAmount дописать yield return new WaitForSecondsRealtime(секунды); Однако в таком случае и уменьшение и увеличение будут сопровождаться этой задержкой. Если нужно чтобы задержка была только когда стремимся к единице, тогда следует сделать ещё два метода ChangeFillAmountToOne { yield return new WaitForSecondsRealtime(секунды); yield return ChangeFillAmount(1)} и ChangeFillAmountToZero {yield return ChangeFillAmount(0)}. Не забудьте в StartSlow и StopSlow поменять ChangeFillAmount на соответствующие методы. – SdxSdySdz Nov 02 '21 at 09:13