C# 基于两个对象之间距离的Lerp文本alpha

C# 基于两个对象之间距离的Lerp文本alpha,c#,user-interface,unity3d,colors,alpha,C#,User Interface,Unity3d,Colors,Alpha,对于一个项目,我需要修改统一的UI文本的alpha值,这取决于播放器/查看器与它的距离。如果其距离小于“可视距离”,则应完全可见/alpha值为1 从查看器行为中的OnTiggerStay(Collider other)到文本游戏对象上的此函数的距离: public void UpdateTransparency(float maxDistance, float distance){ maxDistance -= visibleDistance; float tmp = maxD

对于一个项目,我需要修改统一的UI文本的alpha值,这取决于播放器/查看器与它的距离。如果其距离小于“可视距离”,则应完全可见/alpha值为1

从查看器行为中的OnTiggerStay(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;
}

谢谢大家

如果你想删除游戏对象的alpha,请删除alpha,而不是颜色。这意味着应该使用
Mathf.Lerp
而不是
Color.Lerp
Mathf.Lerp
值应分配给
text.color.a
属性,您应向其传递
0
1

假设
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;
如果您的代码仍然存在问题,那么对此也会有类似的问题,但它适用于
mesh渲染器
。我修改了该代码以使用
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;
}
公共游戏对象obj1;
公共游戏对象obj2;
常量浮动最大距离=200;
文本;
void Start()
{
text=GameObject.Find(“text”).GetComponent();
}
无效更新()
{
//获取这两个对象之间的距离
浮点距离分离=getSqrDistance(obj1.transform.position,obj2.transform.position);
UnityEngine.Debug.Log(getSqrDistance(obj1.transform.position,obj2.transform.position));
//将0和200距离范围转换为0f和1f范围
float lerp=映射值(距离间隔,0,最大距离,0f,1f);
//变老
Color lerpColor=text.Color;
//Lerp Alpha介于1和0之间
lerpColor.a=Mathf.Lerp(1,0,Lerp);
//应用修改的alpha
text.color=lerpColor;
}
公共浮点GetSqrInstance(Vector3 v1,Vector3 v2)
{
返回(v1-v2).sqrMagnitude;
}
浮点映射值(浮点main值、浮点inValueMin、浮点inValueMax、浮点outValueMin、浮点outValueMax)
{
返回值(mainValue-inValueMin)*(outValueMax-outValueMin)/(inValueMax-inValueMin)+outValueMin;
}

您认为“外观正确”的值是什么tmp'应该在0-1的范围内。当你距离visibleDistance较近时,它大于1,这应该不是问题,对吧?如果介于maxDistance和visible Distance之间,则值介于0和1之间,但颜色不变。您好,感谢您提供详细答案。我现在将查看器的位置指定给UpdateTransparency函数,其中包含您的代码。当我打印出lerp时,我得到的值不是0到1之间的值,而是更高的值。我使用Vector3.Distance(…)修复了它,并将最小距离修改为我的值,这样它就不会在最后一分钟出现。谢谢你的帮助!好。您的lerp值应介于0和1之间,否则将得到意外结果。很高兴你成功了