对于一个项目,我需要根据播放器/查看器与它的距离来修改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;
}
谢谢大家。
答案 0 :(得分:1)
如果要获取GameObject的alpha值,请缩小alpha,而不是Color。这意味着应该使用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;
如果您的代码仍然存在问题,那么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;
}