简单的重置计时器方法,以帮助材料alpha值1 - 0之间的lerp

时间:2015-05-26 23:24:52

标签: c# unity3d timer linear-interpolation

我正在制作一个'盾'脚本(科幻,而不是RPG,想象一艘宇宙飞船),只有在碰撞发生后才会变得活跃。我试图通过将材料的alpha值设置为0f来实现这一点 - 然后一旦'命中'直接上升到1f然后再下降到0f。冲洗,重复。但是,我遇到了lerp的timer元素的问题。我看过的计时器往往涉及更新方法或不允许我在lerp中使用它。到目前为止,这是我的代码:

using UnityEngine;
using System.Collections;

public class Shield : MonoBehaviour {

public int shieldHealth;
private SpriteRenderer sRend;
private float alpha = 0f;

void Start () {
    shieldHealth = 10;
    sRend = GetComponentInChildren<SpriteRenderer>();
}

void OnCollisionEnter2D (Collision2D other) {
    shieldHealth --;
    LerpAlphaOfShield ();

    if(shieldHealth <= 0) {
        Destroy(this.gameObject);
    }
}

void LerpAlphaOfShield () {
    float lerp = Mathf.SmoothStep(1.0f, 0.0f, /*missing timer*/);

    alpha = Mathf.Lerp(0.0f, 1.0f, lerp);
    sRend.material.color = new Color(1, 1, 1, alpha);
}
}

现在我认为一旦我有一个计时器,SmoothStep部分可能是不必要的,但是我在另一个问题中找到了这个部分,这个问题最初是一个允许alpha值来回反转的PingPong:我试图得到它只做一次,显然,用计时器重置。

提前感谢任何建议!

我终于想出了这个重置并再次触发每次击中并将盾牌的alpha值从1 - 0转换为1秒。如果有人认为我的代码可以改进,请告诉我,我会非常感兴趣!

using UnityEngine;
using System.Collections;

public class Shield : MonoBehaviour {

public int shieldHealth;
private SpriteRenderer sRend;
private float alpha = 0f;
private bool hasCollided = false;
private float timer = 1f;

void Start () {
    shieldHealth = 10;
    sRend = GetComponentInChildren<SpriteRenderer>();
}

void Update () {

    timer -= Time.deltaTime;

    if(timer >= 0.001) {
        alpha = Mathf.Lerp(0.0f, 1.0f, timer);
        sRend.material.color = new Color(1, 1, 1, alpha);
    }

    if (timer <= 0) {
        hasCollided = false;
    }
}

void OnCollisionEnter2D (Collision2D other) {
    shieldHealth --;
    hasCollided = true;
    timer = 1f;

    if(shieldHealth <= 0) {
        Destroy(this.gameObject);
    }
}
}

1 个答案:

答案 0 :(得分:1)

可能的解决方案是:

public float lerpSpeed = 5f; 
float currAlpha;
float goal = 0f;

void Update()
{
    currAlpha = Mathf.Lerp(currAlpha, goal, lerpSpeed * Time.deltaTime;
    sRend.material.color = new Color(1f, 1f, 1f, alpha);
    if(1f - currAlpha > .001f)
    {
         goal = 0f;
    }
}

然后在OnCollisionEnter2D函数集goal = 1f;

lerpSpeed是一个可以改变它的速度的变量。