78 lines
1.8 KiB
C#
78 lines
1.8 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class SignalView : MonoBehaviour, ISettingView
|
|
{
|
|
public static event Action<string> SignalEmmited;
|
|
|
|
[Header("Layout ссылки")]
|
|
[SerializeField] private Image TimerImage;
|
|
[SerializeField] private Image ButtonImage;
|
|
|
|
[Header("Настройки анимации")]
|
|
[SerializeField] private AnimationCurve TimerCurve;
|
|
[SerializeField] private Color ButtonColorPressed;
|
|
[SerializeField] private Color ButtonColorNormal;
|
|
|
|
|
|
[Header("Звуки")]
|
|
[SerializeField] private AudioSource Audio;
|
|
[SerializeField] private AudioClip AcceptedClip;
|
|
[SerializeField] private float minPitch;
|
|
[SerializeField] private float maxPitch;
|
|
|
|
[SerializeField] private float TimeToEmmit = 2;
|
|
|
|
private string signal;
|
|
private float timer;
|
|
private bool pressed;
|
|
|
|
|
|
public void Initialize(SettingDTO setting)
|
|
{
|
|
signal = setting.SignalValue;
|
|
}
|
|
|
|
public void TakeInput(int direction)
|
|
{
|
|
pressed = direction != 0;
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
timer += Time.deltaTime * (pressed ? 1 : -1);
|
|
timer = Mathf.Clamp(timer, 0, TimeToEmmit);
|
|
Display();
|
|
|
|
if (timer == TimeToEmmit)
|
|
EmmitSignal();
|
|
|
|
|
|
|
|
pressed = false;
|
|
}
|
|
|
|
private void Display()
|
|
{
|
|
|
|
ButtonImage.color = pressed ? ButtonColorPressed : ButtonColorNormal;
|
|
|
|
float percent = TimerCurve.Evaluate(timer / TimeToEmmit);
|
|
|
|
TimerImage.fillAmount = percent;
|
|
var pitch = Mathf.Lerp(minPitch, maxPitch, percent);
|
|
var volume = percent;
|
|
|
|
Audio.volume = volume;
|
|
Audio.pitch = pitch;
|
|
}
|
|
|
|
private void EmmitSignal()
|
|
{
|
|
timer = 0;
|
|
SoundManager.PlayUi(AcceptedClip);
|
|
SignalEmmited?.Invoke(signal);
|
|
}
|
|
}
|