我正在制作一个游戏对象'脉冲'它的颜色,UNITY 3d。
我希望颜色能够在两种颜色之间转换,
以下是我的代码,它不起作用(我在更新功能中这样做):
renderer.material.color = Color.Lerp(renderer.material.color, TargetColor,fadeSpeed*Time.deltaTime);
if(renderer.material.color == TargetColor)
{
if(renderer.material.color == Color.gray)
{
TargetColor = Color.white;
}
else if (renderer.material.color == Color.white)
{
TargetColor = Color.gray;
}
}
我对此很陌生。我做错了什么?
答案 0 :(得分:3)
如果您为fadeSpeed选择适当的值,则代码正常工作。(并且不要忘记初始化TargetColor,如void Start() {TargetColor = Color.gray;}
)
你正在以错误的方式使用Lerp。这导致颜色在长镜头中达到目标值。将此调试日志添加到Update中的某个位置,您可以看到问题:
Debug.Log(“当前颜色:”+ renderer.material.color);
如果我需要自己编码,我会做这样的事情:
public class ColorBlinker : MonoBehaviour
{
public float FadeDuration = 1f;
public Color Color1 = Color.gray;
public Color Color2 = Color.white;
private Color startColor;
private Color endColor;
private float lastColorChangeTime;
private Material material;
void Start()
{
material = GetComponent<Renderer>().material;
startColor = Color1;
endColor = Color2;
}
void Update()
{
var ratio = (Time.time - lastColorChangeTime) / FadeDuration;
ratio = Mathf.Clamp01(ratio);
material.color = Color.Lerp(startColor, endColor, ratio);
//material.color = Color.Lerp(startColor, endColor, Mathf.Sqrt(ratio)); // A cool effect
//material.color = Color.Lerp(startColor, endColor, ratio * ratio); // Another cool effect
if (ratio == 1f)
{
lastColorChangeTime = Time.time;
// Switch colors
var temp = startColor;
startColor = endColor;
endColor = temp;
}
}
}
此外,请查看补间库。他们非常有帮助。
答案 1 :(得分:0)
以 Can 的回答为基础,我使用了 Sin 函数来稍微收紧一些事情。 Math.Sin(Time.time) 会给你一个在 -1 和 1 之间反弹的值,然后 Math.Abs 会将它限制为 0-1。 (这使脉冲具有 easeOut、easeIn 类型的脉冲效果)您可以乘以 Time.time 值来调整速度。 *0.5f = 半速,*2.0f = 双速等
只需调用 setHighlight(true/false) 即可将其关闭和打开。
public class prop_highlight : MonoBehaviour {
public Color highlight_color;
private bool is_highlighted = false;
private Material material;
void Start() {
material = GetComponent<Renderer>().material;
}
public void setHighlight(bool set_highlight) {
is_highlighted = set_highlight;
if(!set_highlight) material.color = Color.white;
}
void Update() {
if(is_highlighted) {
var ratio = Mathf.Abs(Mathf.Sin(Time.time*4f));
material.color = Color.Lerp(Color.white, highlight_color, ratio);
}
}
}