【问题标题】:Lerp alpha based on distance between 2 objectsLerp alpha 基于 2 个对象之间的距离
【发布时间】:2017-11-07 03:07:23
【问题描述】:

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

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

【问题讨论】:

  • 你要求很多——基本上你需要确定最大范围是多少,获取当前距离,如果小于最大范围,相应地更改color.a。仅供参考,StackOverFlow 旨在解决您已经尝试编写代码之后的特定问题 - 为什么不尝试根据我的评论将一些东西放在一起。如果这不起作用,那么您可以使用您尝试使用的更具体的代码更新您的问题 - 您可能会得到一些好的答案。

标签: c# unity3d


【解决方案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;
}

【讨论】:

    【解决方案2】:

    我不知道您希望效果如何,但这基本上是一道数学题。

    类似:

    color.a = 1.0 / distance
    

    应该让你开始。基本上,距离 1 distance 越远(增加),越接近 0 color.a 获得(减少)。如果distance 减少(color.a 然后增加),则相反。

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

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

    【讨论】:

      【解决方案3】:

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

      您可以使用交互式图表和在线数学资源来玩弄方程式,以找到适合您的方程式。一旦你弄清楚了,在代码中实现它应该很容易!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多