Единство - я не могу передать цвет моего GameObject - PullRequest
0 голосов
/ 25 июня 2018

Я просто пытаюсь настроить программу-шаблон наблюдателя, чтобы один объект случайно менял цвет и заставлял группу других объектов менять тот же цвет, но я хотел, чтобы они постепенно менялись в течение 5 секунд. Я пытаюсь lerp, но он мгновенно меняет цвета. Я думаю, что это может иметь какое-то отношение к начальному цвету lerp, потому что основной объект - постоянно меняющиеся цвета, а новые цвета становятся старыми. Поэтому мне нужно подумать о том, как выбрать начальный цвет для lerp. Я не уверен, имеет ли это отношение к моему lerp, не работает, но это то, что я рассматриваю. Если у кого-то есть какие-либо предложения, я был бы признателен. Спасибо.

public class Subject : MonoBehaviour {

public float timer = 0.0f;
public GameObject[] observers;
float t = 0;


Color oldColor;

void Update () {
    t += Time.deltaTime / 5.0f;
  timer += Time.deltaTime;

  if (timer >= 10f) {
    Color newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
    GetComponent<Renderer>().material.color = newColor;

    for (int i = 0; i < observers.Length; i++) {
      observers[i].GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
    }
    newColor=oldColor
    timer = 0;
    }
  }
}

1 Ответ

0 голосов
/ 25 июня 2018

Что Color.Lerp(Color a, Color b, float t) делает

Линейная интерполяция между цветами a и b по t

Например, Color.Lerp(Color.blue, Color.red, 0.5f) возвращает половинную интерполяцию между синим икрасный.Когда вы говорите Color.Lerp(oldColor, newColor, 5), он возвращает newColor, потому что

t ограничен между 0 и 1. Когда t равен 0, возвращает a.Когда t равно 1, возвращается b.

Итак, 5 - это то же самое, что и вставка 1.

Так что вам нужно будет хранить переменную t где-нибудь, начиная с 0 ис шагом до 1 вы вводите Lerp.

Например:

float t = 0;
private void Update()
{
    t += Time.deltaTime / 5.0f; // Divided by 5 to make it 5 seconds.

    this.GetComponent<Renderer>().color = Color.Lerp(oldColor, newColor, t);
}

https://docs.unity3d.com/ScriptReference/Color.Lerp.html

РЕДАКТИРОВАТЬ

Также, что происходит в вашем коде, при условии, что вы сбрасываете t, когда таймер нажимает

  1. Таймер> = 10.0f
  2. Лерп один раз
  3. Сброс таймера до 0

.Вместо этого вы могли бы сделать что-то вроде этого (я взял наблюдателей и все такое, чтобы было легче видеть)

float t, timer;
bool lerping = false;
Color newColor;
void Update()
{
    t += Time.deltaTime / 5.0f;
    timer += Time.deltaTime;

    if (timer >= 10f)
    {
        lerping = true;
        t = 0;
        newColor = new Color(Random.value, Random.value, Random.value, 1.0f);
        Debug.Log("Lerping!");
        timer = 0;
    }

    if (lerping)
    {
        GetComponent<Renderer>().material.color = Color.Lerp(oldColor, newColor, t);
        if (t >= 1.0f)
        {
            lerping = false;
            Debug.Log("Stopped lerping");
        }

    }
}
...