Time.time сделать мой Color Lerp не "lerp"

Я делаю дневной/ночной цикл, и у меня есть лерп на Time.time, потому что, если я использую Time.deltaTime, он превращает night.day в 12:00. Однако я отвлекся. Проблема, с которой я столкнулся сейчас, заключается в том, что с любой настройкой времени это сделает лерп мгновенным, а не… ну… «лерп». Любая идея по исправлению этого? Я новичок в С#

У меня это работает как временной скрипт:

using UnityEngine;
using System.Collections;

public class timeFlow : MonoBehaviour 
{

public float Hours = 00;
public float Minutes = 00;

void Update()
{
if(Hours <= 23){

    if(Minutes >= 60)
    {
        Minutes = 0;
        if(Minutes <= 59)
        {
            Hours++;
        }
        else
        {
            Minutes = 0;
            Hours = 0;
            guiText.text = Hours.ToString("f0") + ":0" +    Minutes.ToString("f0");
        }
    }
    else
    {
        Minutes += UnityEngine.Time.deltaTime * 100;
    }

    if(Mathf.Round(Minutes) <= 9)
    {
        guiText.text = Hours.ToString("f0") + ":0" +    Minutes.ToString("f0");
    }
    else
    {
        guiText.text = Hours.ToString("f0") + ":" + Minutes.ToString("f0");
    }
}

else {
    Hours = 0;
    }
}
}

А это скрипт lerp:

using UnityEngine;
using System.Collections;

public class cycleFlow : MonoBehaviour {

public Color32 night = new Color32(30, 30, 30, 255);
public Color32 day = new Color32(255, 255, 255, 255);

public GameObject Timer;
private timeFlow TimeFlow;

void Awake () {

    TimeFlow = Timer.GetComponent<timeFlow> ();

}

void Update () {
    DayNightCycle ();
}

void DayNightCycle()
{

    foreach (SpriteRenderer child in    transform.GetComponentsInChildren<SpriteRenderer>()) {
        if (TimeFlow.Hours == 18){
            child.color = Color.Lerp(day, night, Time.time);
        }

        if (TimeFlow.Hours == 6) {
            child.color = Color.Lerp(night, day, Time.time);
        }
    }
}
}

person RSoMKC    schedule 17.04.2014    source источник


Ответы (2)


Вы можете написать что-то вроде этого, Lerp принимает фактическое значение (от), конечное значение (до) и дробное значение. (здесь Time.deltaTime) Теперь, когда ваш таймер достигнет 18 часов, ваш цвет изменится на цвет ночи через несколько вызовов функции обновления (вы можете контролировать время изменения, умножая Time.deltaTime) :)

foreach ( SpriteRenderer child in transform.GetComponentsInChildren<SpriteRenderer>() ) {
    if ( TimeFlow.Hours == 18 ) {
        child.color = Color.Lerp(child.color, night, Time.deltaTime);
        // here two times faster
        // child.color = Color.Lerp(child.color, night, Time.deltaTime * 2.0f);
    }

    if ( TimeFlow.Hours == 6 ) {
        child.color = Color.Lerp(child.color, day, Time.deltaTime);
        // here half slower :)
        // child.color = Color.Lerp(child.color, night, Time.deltaTime * 0.5f);
    }
}
person trebor    schedule 17.04.2014
comment
Спасибо за решение моей проблемы! В настоящее время у меня есть другая проблема, которая заключается в том, что если я оставлю if '( TimeFlow.Hours = 18 )', он не завершит лерп и будет отключен, когда он больше не будет равен 18 (или 6 для другого 'если'). И сделать это '( TimeFlow.Hours = ›= 18 )' & '( TimeFlow.Hours = ›= 6 )' не получится, потому что это будет означать, что '( TimeFlow.Hours = ›= 6 )' станет фанковым с '( TimeFlow.Hours = ›= 18 )' - person RSoMKC; 17.04.2014
comment
Нет проблем :) Думаю, if(TimeFlow.Hours ›= 6 && TimeFlow.Hours ‹ 18) { Lerp(..., день, ...); } else { Lerp(..., night, ...) } должно работать :) Если нет, пишите сюда еще раз, постараемся найти решение. - person trebor; 18.04.2014

Мне было трудно понять lerp, когда он используется вместе со временем. Может быть, этот пример поможет кому-то:

// lerp values between 0 and 10 in a duration of 3 seconds:
private float minValue = 0.0f;
private float maxValue = 10.0f;

private float totalDuration = 3.0f; 
private float timePassed = 0.0f;

private float currentValue;

void Update()
{
    timePassed += Time.deltaTime;

    // Lerp expects a value between 0 and 1 as the third parameter,
    // so we need to divide by the duration:
    currentValue = Mathf.Lerp(minValue, maxValue, timePassed/totalDuration);
}

Примечание: вам нужно добавить некоторую логику для:

  • обработка, когда начинать/останавливать лерпинг
  • когда сбрасывать timePassed
person Janxgeist    schedule 16.04.2015