Показать сообщение отдельно
Старый 28.09.2020, 10:30   #35
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вызов гуя, есть проблемы.

Сообщение от Crystal Посмотреть сообщение
Не стоит пакс, я с массивами работаю где мне это удобно,
массив не является для меня чем-то новым и непонятным )
Тем не менее я уже сделал. В аттаче видео результата и проект (Unity 2019.4.10). Собственно код получился вот такой:

using UnityEngine;

public class 
HealthBarAnimated MonoBehaviour
{
    public 
int health;
    public 
int maxHealth;

    public 
Color32 normalColor;
    public 
Color32 dangerColor;

    [
System.Serializable]
    public class 
AnimatedElement
    
{
        public 
SpriteRenderer sprite// анимируемый спрайт
        
public Vector3 startPosition// начальная позиция анимации
        
public Vector3 endPosition;   // конечная позиция анимации
        
public float positionAnimationSpeed 1;  // скорость анимации позиции
        
public bool animatePositionAsHealthPercent false// анимировать позицию на основе процента жизней
        
private float positionAnimationTime// текущее время анимации позиции

        
public bool animateColor true// анимировать цвет
        
public AnimationCurve alphaAnimationCurve// кривая анимации альфы (можно конечно было использовать Mathf.SmoothStep, но решил показать еще один способ анимации)
        
public float alphaAnimationSpeed 1// скорость анимации альфы
        
private float alphaAnimationTime// время анимации альфы

        
public bool animateHealthPercentScale false// анимировать скейл на основе процента жизней
        
public AnimationCurve healthPercentScaleAnimationCurve// кривая интерполяции анимации масштаба
        
public Vector3 healthPercentStartScale// начальный масштаб
        
public Vector3 healthPercentEndScale// конечный масштаб

        
public float healthColorTransitionStart// начало зоны перехода из нормального цвета в цвет опасности
        
public float healthColorTransitionEnd// конец зоны перехода из нормального цвета в цвет опасности



        
public void Init()
        {
            
// рандомизация начальных позиций анимаций
            
positionAnimationTime Random.value;
            
alphaAnimationTime Random.value;
        }

        
// обновление состояния спрайта
        
public void Update(float healthPercentColor32 normalColorColor32 dangerColorfloat deltaTime)
        {
            if (
animatePositionAsHealthPercent)
            {
                
sprite.transform.localPosition Vector3.Lerp(startPositionendPositionhealthPercent);
            }
            else
            {
                
positionAnimationTime += deltaTime positionAnimationSpeed;
                
sprite.transform.localPosition Vector3.Lerp(startPositionendPositionMathf.PingPong(positionAnimationTime1));
            }

            if (
animateHealthPercentScale)
            {
                
sprite.transform.localScale Vector3.Lerp(healthPercentStartScalehealthPercentEndScalehealthPercent);
            }


            if (
animateColor)
            {
                var 
healthPercentClamped Mathf.Clamp(healthPercenthealthColorTransitionStarthealthColorTransitionEnd);
                var 
healthColorT = (healthPercentClamped healthColorTransitionStart) / (healthColorTransitionEnd healthColorTransitionStart);
                var 
color Color.Lerp(dangerColornormalColorhealthColorT);
                
alphaAnimationTime += deltaTime alphaAnimationSpeed;
                
color.alphaAnimationCurve.Evaluate(Mathf.PingPong(alphaAnimationTime1));
                
sprite.color color;
            }
        }
    }

    
// массив анимируемых объектов
    
public AnimatedElement[] animatedElements;

    
void Start()
    {
        
// инициализация элементов
        
for (int i 0animatedElements.Lengthi++)
        {
            
animatedElements[i].Init();
        }
    }

    
void Update()
    {
        if (
health 0health 0;
        if (
health maxHealthhealth maxHealth;

        var 
healthPercent health / (float)maxHealth;


        
// обновление анимации элементов
        
for (int i 0animatedElements.Lengthi++)
        {
            
animatedElements[i].Update(healthPercentnormalColordangerColorTime.deltaTime);
        }
    }

По времени заняло пол часа кода, пол часа настройки.
Вложения
Тип файла: mp4 bandicam 2020-09-28 09-24-46-998.mp4 (14.03 Мб, 525 просмотров)
Тип файла: zip Tests1.zip (47.8 Кб, 508 просмотров)
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
ant0N (28.09.2020), Arton (28.09.2020), Crystal (28.09.2020)