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.Lerp
。 Mathf.Lerp
值应分配给 text.color.a
属性 并且您应该将 0
和 1
传递给它。
假设您的 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;
}
对于一个项目,我需要根据播放器/查看器与其的距离修改 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.Lerp
。 Mathf.Lerp
值应分配给 text.color.a
属性 并且您应该将 0
和 1
传递给它。
假设您的 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;
}