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

时间:2017-11-20 17:22:09

标签: c# user-interface unity3d colors alpha

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

距离从观察者行为中的OnTriggerStay(Collider other)传递到Text的游戏对象上的此功能:

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,它会给出正确的外观"值,但文本的颜色没有任何变化(文本在“开始”功能中正确分配)。文本在World Space画布上呈现。

如果有人可以帮助我,那会很棒:)提前谢谢!

更新:使用以下修改后的解决方案修复此问题:

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

谢谢大家。

1 个答案:

答案 0 :(得分:1)

如果要获取GameObject的alpha值,请缩小alpha,而不是Color。这意味着应该使用Mathf.Lerp代替Color.Lerp。应将Mathf.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;
}