c# - Lerp 颜色基于 2 个对象之间的距离

标签 c# unity3d

我想知道如何根据 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。使用map0MAX_DISTANCE 距离范围转换为 0f1f 范围

float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
{
    return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
}

它将某个特定点与另一个特定点之间的值进行缩放。

例如,您需要使用 Lerp 函数来执行此操作,Lerp 函数采用 01 值。 mapValue 函数可以将任何数字缩放到 Lerp 函数所需的 01 之间。

对我来说,我会将 0200 的范围值缩放到 0f1f 范围,同时 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/

相关文章:

c# - string.Join Linq 查询合并数组中的两个字符串并输出为单个逗号分隔字符串

c# - 按名称 (ID) C# for ASP.NET 查找文本框

android - 下载、破解并将 APK 文件重新上传到 Google Play。可能吗?

c# - Unity/C# Trigger 让别的东西消失

c# - MVVMLight ViewModelLocator 创建新的 ViewModel

c# - 如何在一个Form上同时为两个不同的Control设置两种不同的Culture?

c# - Entity Framework Code First 与同一类的双重关系

C# Unity > 静态实例成员不会导致构造函数被调用

ios - 在 Unity 中为 Iphone X 设计人像游戏

c# - Unity Error building Player 因为脚本有编译器错误