Lerp 文本 alpha 基于 2 个对象之间的距离

Lerp Text alpha based on distance between 2 objects

对于一个项目,我需要根据播放器/查看器与其的距离修改 Unity 中 UI 文本的 alpha 值。如果他比 "visibleDistance" 近,它应该是完全可见的/alpha 值为 1。

距离从观察者行为中的 OnTriggerStay(Collider other) 传递到文本游戏对象上的此函数:

public void UpdateTransparency(float maxDistance, float distance){
    maxDistance -= visibleDistance;
    float tmp = maxDistance/distance;
    tmp = 1/tmp;
    text.color = Color.Lerp(text.color, Color.clear, tmp);
}

如果我打印出 tmp,它会给出 "correct looking" 值,但文本的颜色没有任何变化(在 Start 函数中正确分配了文本)。文本在 World Space canvas.

上呈现

如果有人能帮助我,那就太好了:)在此先感谢!


更新:使用以下修改后的解决方案修复了它:

public void UpdateTransparency (Vector3 viewerPos, float maxDistance){
    float distanceApart = Vector3.Distance(viewerPos, this.transform.position));
    float lerp = mapValue(distanceApart, maxDistance-3f, maxDistance, 0f, 1f);
    Color lerpColor = text.color;
    lerpColor.a = Mathf.Lerp(1, 0, lerp);
    text.color = lerpColor;
}


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

谢谢大家。

如果您想对 GameObject 的 alpha 进行插值,请对 alpha 进行插值,而不是对颜色进行插值。这意味着应该使用 Mathf.Lerp 而不是 Color.LerpMathf.Lerp 值应分配给 text.color.a 属性 并且您应该将 01 传递给它。

假设您的 tmp 变量是好的并且 returns 值介于 0 和 1 之间,下面的代码:

float tmp = maxDistance/distance;
tmp = 1/tmp;
text.color = Color.Lerp(text.color, Color.clear, tmp);

应该换成这样:

float tmp = maxDistance/distance;
tmp = 1/tmp;
Color lerpColor = text.color;
lerpColor.a = Mathf.Lerp(1, 0, tmp);
text.color = lerpColor;

如果您的代码仍然存在问题,那么这个 也有类似的问题,但它是针对 MeshRenderer 的。我修改了该代码以使用 Text 组件。见下文。

public GameObject obj1;
public GameObject obj2;

const float MAX_DISTANCE = 200;

Text text;

void Start()
{
    text = GameObject.Find("Text").GetComponent<Text>();
}


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);

    //Get old color
    Color lerpColor = text.color;

    //Lerp Alpha between 1 and 0
    lerpColor.a = Mathf.Lerp(1, 0, lerp);

    //Apply modified alpha
    text.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;
}