协程无法正常工作:只有一个对象淡入
Coroutine Not working correctly: only one object is fading in
我刚刚更新了代码。 wholeRenderer.materials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeOutColors, lerpFactor); 似乎有问题。出错了,我正在努力解决这个问题。可能是什么?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class InteractionGO: MonoBehaviour
{
Renderer cutawayRenderer;
Renderer wholeRenderer;
Color fadedInColor;
Color fadedOutColor;
private const float MIN_FADE = 0.0f;
private const float MAX_FADE = 1.0f;
private void Awake()
{
fadedInColor = new Color(1f, 1f, 1f, 100f);
fadedOutColor = new Color(1f, 1f, 1f, 0f);
wholeRenderer = wholeRenderer.GetComponent<Renderer>();
cutawayRenderer = cutawayRenderer.GetComponent<Renderer>();
}
public void fade()
{
StartCoroutine(colorlerpin());
}
public IEnumerator colorlerpin()
{
// I recommend to setup everything before the loop once to improve perfromance
// -> collect all full faded-in and faded-out color information
List<Color> wholeFadeInColors = new List<Color>();
List<Color> wholeFadeOutColors = new List<Color>();
foreach (var mat in wholeRenderer.materials)
{
// add fadedin color
wholeFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
wholeFadeOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
List<Color> cutawayFadeInColors = new List<Color>();
List<Color> cutawayFadeOutColors = new List<Color>();
foreach (var mat in wholeRenderer.materials)
{
// add fadedin color
cutawayFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
cutawayFadeOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
float ElapsedTime2 = 0.0f;
float TotalTime2 = 1f;
while (ElapsedTime2 < TotalTime2)
{
var lerpFactor = ElapsedTime2 / TotalTime2;
// Now apply before stored materials like
for (int i = 0; i < wholeRenderer.materials.Length; i++)
{
wholeRenderer.materials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeOutColors, lerpFactor);
}
for (int i = 0; i < wholeRenderer.materials.Length; i++)
{
cutawayRenderer.materials[i].color = Color.Lerp(cutawayFadeOutColors, cutawayFadeInColors, lerpFactor);
}
ElapsedTime2 += Time.deltaTime;
yield return null;
}
}
}
我建议所有昂贵的东西只做一次
Renderer cutawayRenderer;
Renderer wholeRenderer;
Color fadedInColor;
Color fadedOutColor;
private void Awake()
{
fadedInColor = new Color(1f, 1f, 1f, 100f);
fadedOutColor = new Color(1f, 1f, 1f, 0f);
wholeRenderer = whole.GetComponent<Renderer>();
cutawayRenderer = cutaway.GetComponent<Renderer>();
}
并重复使用它。另外,为什么要将 ElpasedTime2 增加两次?您的例程产生两次,因此在一帧中只有第一个对象褪色,一帧淡化另一个对象......您可能想要的是同时淡化两个对象
public IEnumerator colorlerpin()
{
float ElapsedTime2 = 0.0f;
float TotalTime2 = 1f;
while (ElapsedTime2 < TotalTime2)
{
// you can store the current colors in order to apply them to multiple
// materials or renderers as well
// fading out color
var fadeOutColor = Color.Lerp(fadedInColor, fadedOutColor, (ElapsedTime2 / TotalTime2));
// fading in color
var fadeInColor = Color.Lerp(fadedOutColor, fadedInColor, (ElapsedTime2 / TotalTime2));
// Now apply those two colors wherever you want
// fades out main object
wholeRenderer.material.color = fadeOutColor;
// fades in new oblect
cutawayRenderer.material.color = fadeInColor;
ElapsedTime2 += Time.deltaTime;
yield return null;
}
}
但是我不明白为什么您的一个对象应该是 "ignored" 因为一旦您这样做 material.color = xy
就应该创建一个 material 的实例。因此,除非有任何其他脚本或者 Animator
也可以更改此 material,否则应该没问题。
更新
因为你说你想将它应用到多个 materials 我宁愿预先设置所有 Color
数据然后只在循环内做必要的 lerping 而不是使用 new Color
一直
private const float MIN_FADE = 0.0f;
private const float MAX_FADE = 1.0f;
public IEnumerator colorlerpin()
{
// I recommend to setup everything before the loop once to improve perfromance
// -> collect all full faded-in and faded-out color information
List<Color> wholeFadeInColors = new List<Color>();
List<Color> wholeFadeIOutColors = new List<Color>();
foreach(var mat in wholeRenderer.materials)
{
// add fadedin color
wholeFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
wholeFadeOUTColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
List<Color> cutawayFadeInColors = new List<Color>();
List<Color> cutawayFadeIOutColors = new List<Color>();
foreach(var mat in wholeRenderer.materials)
{
// add fadedin color
cutawayFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
cutawayFadeIOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
float ElapsedTime2 = 0.0f;
float TotalTime2 = 1f;
while (ElapsedTime2 < TotalTime2)
{
var lerpFactor = ElapsedTime2 / TotalTime2;
// Now apply before stored materials like
var wholeMaterials = wholeRenderer.materials;
for(int i = 0; i < wholeMaterials.Length; i++)
{
wholeMaterials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeIOutColors, lerpFactor);
}
wholeRenderer.materials = wholeMaterials;
var cutawayMaterials = cutawayRenderer.materials;
for(int i = 0; i < cutawayMaterials .Length; i++)
{
cutawayMaterials[i].color = Color.Lerp(cutawayFadeIOutColors, cutawayFadeInColors, lerpFactor );
}
cutawayRenderer.materials = cutawayMaterials;
ElapsedTime2 += Time.deltaTime;
yield return null;
}
}
如果你只想使用 1,1,1,1
和 1,1,1,0
而不是当然你可以完全忘记之前收集颜色,只需在这两种颜色之间进行 lerp。
我刚刚更新了代码。 wholeRenderer.materials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeOutColors, lerpFactor); 似乎有问题。出错了,我正在努力解决这个问题。可能是什么?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class InteractionGO: MonoBehaviour
{
Renderer cutawayRenderer;
Renderer wholeRenderer;
Color fadedInColor;
Color fadedOutColor;
private const float MIN_FADE = 0.0f;
private const float MAX_FADE = 1.0f;
private void Awake()
{
fadedInColor = new Color(1f, 1f, 1f, 100f);
fadedOutColor = new Color(1f, 1f, 1f, 0f);
wholeRenderer = wholeRenderer.GetComponent<Renderer>();
cutawayRenderer = cutawayRenderer.GetComponent<Renderer>();
}
public void fade()
{
StartCoroutine(colorlerpin());
}
public IEnumerator colorlerpin()
{
// I recommend to setup everything before the loop once to improve perfromance
// -> collect all full faded-in and faded-out color information
List<Color> wholeFadeInColors = new List<Color>();
List<Color> wholeFadeOutColors = new List<Color>();
foreach (var mat in wholeRenderer.materials)
{
// add fadedin color
wholeFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
wholeFadeOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
List<Color> cutawayFadeInColors = new List<Color>();
List<Color> cutawayFadeOutColors = new List<Color>();
foreach (var mat in wholeRenderer.materials)
{
// add fadedin color
cutawayFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
cutawayFadeOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
float ElapsedTime2 = 0.0f;
float TotalTime2 = 1f;
while (ElapsedTime2 < TotalTime2)
{
var lerpFactor = ElapsedTime2 / TotalTime2;
// Now apply before stored materials like
for (int i = 0; i < wholeRenderer.materials.Length; i++)
{
wholeRenderer.materials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeOutColors, lerpFactor);
}
for (int i = 0; i < wholeRenderer.materials.Length; i++)
{
cutawayRenderer.materials[i].color = Color.Lerp(cutawayFadeOutColors, cutawayFadeInColors, lerpFactor);
}
ElapsedTime2 += Time.deltaTime;
yield return null;
}
}
}
我建议所有昂贵的东西只做一次
Renderer cutawayRenderer;
Renderer wholeRenderer;
Color fadedInColor;
Color fadedOutColor;
private void Awake()
{
fadedInColor = new Color(1f, 1f, 1f, 100f);
fadedOutColor = new Color(1f, 1f, 1f, 0f);
wholeRenderer = whole.GetComponent<Renderer>();
cutawayRenderer = cutaway.GetComponent<Renderer>();
}
并重复使用它。另外,为什么要将 ElpasedTime2 增加两次?您的例程产生两次,因此在一帧中只有第一个对象褪色,一帧淡化另一个对象......您可能想要的是同时淡化两个对象
public IEnumerator colorlerpin()
{
float ElapsedTime2 = 0.0f;
float TotalTime2 = 1f;
while (ElapsedTime2 < TotalTime2)
{
// you can store the current colors in order to apply them to multiple
// materials or renderers as well
// fading out color
var fadeOutColor = Color.Lerp(fadedInColor, fadedOutColor, (ElapsedTime2 / TotalTime2));
// fading in color
var fadeInColor = Color.Lerp(fadedOutColor, fadedInColor, (ElapsedTime2 / TotalTime2));
// Now apply those two colors wherever you want
// fades out main object
wholeRenderer.material.color = fadeOutColor;
// fades in new oblect
cutawayRenderer.material.color = fadeInColor;
ElapsedTime2 += Time.deltaTime;
yield return null;
}
}
但是我不明白为什么您的一个对象应该是 "ignored" 因为一旦您这样做 material.color = xy
就应该创建一个 material 的实例。因此,除非有任何其他脚本或者 Animator
也可以更改此 material,否则应该没问题。
更新
因为你说你想将它应用到多个 materials 我宁愿预先设置所有 Color
数据然后只在循环内做必要的 lerping 而不是使用 new Color
一直
private const float MIN_FADE = 0.0f;
private const float MAX_FADE = 1.0f;
public IEnumerator colorlerpin()
{
// I recommend to setup everything before the loop once to improve perfromance
// -> collect all full faded-in and faded-out color information
List<Color> wholeFadeInColors = new List<Color>();
List<Color> wholeFadeIOutColors = new List<Color>();
foreach(var mat in wholeRenderer.materials)
{
// add fadedin color
wholeFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
wholeFadeOUTColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
List<Color> cutawayFadeInColors = new List<Color>();
List<Color> cutawayFadeIOutColors = new List<Color>();
foreach(var mat in wholeRenderer.materials)
{
// add fadedin color
cutawayFadeInColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MAX_FADE));
// add faded out color
cutawayFadeIOutColors.Add(new Color(mat.color.r, mat.color.g, mat.color.b, MIN_FADE));
}
float ElapsedTime2 = 0.0f;
float TotalTime2 = 1f;
while (ElapsedTime2 < TotalTime2)
{
var lerpFactor = ElapsedTime2 / TotalTime2;
// Now apply before stored materials like
var wholeMaterials = wholeRenderer.materials;
for(int i = 0; i < wholeMaterials.Length; i++)
{
wholeMaterials[i].color = Color.Lerp(wholeFadeInColors, wholeFadeIOutColors, lerpFactor);
}
wholeRenderer.materials = wholeMaterials;
var cutawayMaterials = cutawayRenderer.materials;
for(int i = 0; i < cutawayMaterials .Length; i++)
{
cutawayMaterials[i].color = Color.Lerp(cutawayFadeIOutColors, cutawayFadeInColors, lerpFactor );
}
cutawayRenderer.materials = cutawayMaterials;
ElapsedTime2 += Time.deltaTime;
yield return null;
}
}
如果你只想使用 1,1,1,1
和 1,1,1,0
而不是当然你可以完全忘记之前收集颜色,只需在这两种颜色之间进行 lerp。