Смена значения 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;
}
}
}