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

对于一个项目,我需要根据播放器/查看器与它的距离来修改 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,它会给出“正确的外观”值,但文本的颜色没有发生任何变化(文本在 Start 函数中正确分配)。文本呈现在世界空间画布上。

如果有人可以帮助我,那就太好了 :) 提前致谢!


更新:用下面的修改解决方案修复它:

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

谢谢大家。

【问题讨论】:

  • 你认为“正确的”价值观是什么? 'tmp' 应该在 0 - 1 的范围内。
  • 距离比 visibleDistance 近的时候大于 1,应该没问题吧?如果您介于 maxDistance 和可见距离之间,则值介于 0 和 1 之间,但颜色不会改变。

标签: c# user-interface unity3d colors alpha


【解决方案1】:

如果您想调整游戏对象的 alpha,请调整 alpha,而不是颜色。这意味着应该使用Mathf.Lerp 而不是Color.LerpMathf.Lerp 值应分配给 text.color.a 属性,您应该将 01 传递给它。

假设您的 tmp 变量是好的并且返回 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;

如果您的代码仍然存在问题,则此here 存在类似问题,但它适用于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;
}

【讨论】:

  • 您好,感谢您的详细回答。我现在将查看者的位置提供给包含您的代码的 UpdateTransparency 函数。当我打印出 lerp 时,我没有得到介于 0 和 1 之间的值,而是得到更高的值。我通过使用 Vector3.Distance(...) 修复了它,并将最小距离修改为我的值,因此它不会在最后一分钟出现。感谢您的帮助!
  • 好。你的 lerp 值应该在 0 到 1 之间,否则你会得到意想不到的结果。很高兴你成功了
猜你喜欢
  • 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
相关资源
最近更新 更多