基于2个物体之间的距离的Lerp alpha

时间:2017-11-06 15:12:59

标签: c# unity3d

所以我试图根据物体越来越接近玩家的事实来增加图像alpha通道。我正在使用Vector3.Distance() 从玩家到物体的距离,但我不知道如何转换距离,以便随着距离越来越小,color.a的值越来越大。 请指出我正确的方向;

如何根据另一个数字越来越小的事实使数字更大?

3 个答案:

答案 0 :(得分:1)

请参阅this帖子,其中介绍了如何根据两个游戏对象之间的距离来渲染颜色。唯一的区别是你想要翻译alpha,所以写在帖子上的所有内容都应该与此相关。只需进行少量修改即可。

您只需使用Mathf.Lerp代替Color.Lerp即可。此外,您需要在材质上启用淡入淡出模式。您可以从编辑器或脚本中执行此操作。下面的代码是来自链接答案的修改代码,该代码应该完成您正在执行的操作。它还可以通过Start函数中的代码启用淡入淡出模式。

public GameObject obj1;
public GameObject obj2;

const float MAX_DISTANCE = 200;

Renderer mRenderer;

void Start()
{
    mRenderer = GetComponent<Renderer>();

    //ENABLE FADE Mode on the material if not done already
    mRenderer.material.SetFloat("_Mode", 2);
    mRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
    mRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
    mRenderer.material.SetInt("_ZWrite", 0);
    mRenderer.material.DisableKeyword("_ALPHATEST_ON");
    mRenderer.material.EnableKeyword("_ALPHABLEND_ON");
    mRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
    mRenderer.material.renderQueue = 3000;
}


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 Alpha between near and far color
    Color lerpColor = mRenderer.material.color;
    lerpColor.a = Mathf.Lerp(1, 0, lerp);

    mRenderer.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;
}

答案 1 :(得分:0)

我不知道你希望效果如何,但它基本上是一个数学问题。

类似的东西:

distance

应该让你入门。基本上,1 color.a越远(增加),越接近0 distance得到(减少)。如果color.a减少(distance然后增加),则情况正好相反。

您必须处理color.a低于1(如果适用)的值,因为它不再增加color.a

您还必须处理1.0最大可能值:是1.0还是255(或其他)?用此最大值替换公式中的distance。您可能需要将{{1}}乘以任意值,因此效果不会太快或太慢。

答案 2 :(得分:0)

听起来你想要一个函数(在数学意义上)f(x),它将域[0,infinity]中的输入(距离)值映射到输出(alpha)范围[1,0]。一个简单的此类函数是1/(1+x)(单击链接以查看交互式图表)。

您可以使用交互式图表和在线数学资源来使用等式来找到对您来说很好的一个。一旦弄明白,在代码中实现它应该很容易!