我想知道如何根据 2 个对象之间的距离制作平滑的颜色插值。颜色应该从绿色到红色到绿色再到红色......远立方体 = 红色,近立方体 = 绿色。
我已经让一切正常,但唯一认为无效的是颜色不平滑。这就是它现在的样子。 https://i.gyazo.com/a85852e76d2418ab7d44c18e152647c0.mp4
我正在使用这个脚本来改变颜色:
FindClosestCube ();
float lerpProgress = 0f;
GameObject cubeChildTop = null;
GameObject closestCube = FindClosestCube ();
cubeChildTop = closestCube.transform.Find("Top").gameObject;
if (cubeDiffX >= 0.8f || cubeDiffX <= -0.8f)
{
lerpProgress = 0.5f;
}
if (cubeDiffX <= 0.8f || cubeDiffX <= -0.8f)
{
lerpProgress = 1f;
}
if (cubeDiffX >= 1.6f || cubeDiffX <= -1.6f)
{
lerpProgress = 0f;
}
if(closestCube != GameObject.Find("Cube (1)2"))
{
cubeChildTop.GetComponent<Renderer>().material.color = Color.Lerp(redColor, greenColor, lerpProgress);
}
那么...如何让它从红色平滑地渐变到绿色?
最佳答案
这真的很简单。
1。找出你认为这两个物体可以分开的最大距离。
您需要做的第一件事是确定这两个游戏对象之间的最大距离值。您需要从 #2 将该值传递到 mapValue
函数的 inValueMax
参数中。
您可以使用以下代码确定最大值:
public GameObject obj1;
public GameObject obj2;
void Update()
{
UnityEngine.Debug.Log(getSqrDistance(obj1.transform.position, obj2.transform.position));
}
public float getSqrDistance(Vector3 v1, Vector3 v2)
{
return (v1 - v2).sqrMagnitude;
}
运行它,手动移动每个对象/立方体,然后使用 Debug.Log
消息获取两个对象可以相互移动的最高值。
看着你发布的视频,我估计 200
的距离值就可以了,但如果你想要一个完美的结果,你仍然必须使用上面的脚本进行实验。
2。使用map
将 0
和 MAX_DISTANCE
距离范围转换为 0f
和 1f
范围
float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}
它将某个特定点与另一个特定点之间的值进行缩放。
例如,您需要使用 Lerp
函数来执行此操作,Lerp 函数采用 0
到 1
值。 mapValue
函数可以将任何数字缩放到 Lerp
函数所需的 0
和 1
之间。
对我来说,我会将 0
到 200
的范围值缩放到 0f
和 1f
范围,同时 mapValue
函数。
3。最后,使用 Color.Lerp(near, far, lerp);
在颜色之间进行插值。 lerp 值是 #2 的结果值。
在代码中:
找到 #1 后,将该值插入下面脚本中的 MAX_DISTANCE
变量应该可以工作:
public GameObject obj1;
public GameObject obj2;
Color near = Color.green;
Color far = Color.red;
const float MAX_DISTANCE = 200;
void Update()
{
//Get distance between those two Objects
float distanceApart = getSqrDistance(obj1.transform.position, obj2.transform.position);
UnityEngine.Debug.Log(getSqrDistance(obj1.transform.position, obj2.transform.position));
//Convert 0 and 200 distance range to 0f and 1f range
float lerp = mapValue(distanceApart, 0, MAX_DISTANCE, 0f, 1f);
//Lerp Color between near and far color
Color lerpColor = Color.Lerp(near, far, lerp);
obj1.GetComponent<Renderer>().material.color = lerpColor;
}
public float getSqrDistance(Vector3 v1, Vector3 v2)
{
return (v1 - v2).sqrMagnitude;
}
float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}
结果:
关于c# - Lerp 颜色基于 2 个对象之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43419915/