简单的计时器复位方法,帮助lerp在一个材料的alpha值1 - 0之间

本文关键字:alpha 材料 一个 之间 方法 复位 计时器 帮助 lerp 简单 | 更新日期: 2023-09-27 17:50:47

我正在制作一个"盾牌"脚本(科幻,不是RPG,想象一艘宇宙飞船),只有在发生碰撞时才会激活。我试图通过将材料的alpha值设置为0f来实现这一点-然后一旦"命中"直接上升到1f,然后回落到0f。冲洗,重复。然而,我有一个问题,即将与lerp的计时器元素。我所看到的计时器往往涉及更新方法,或者不允许我在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部分可能是不必要的,一旦我有一个计时器,然而,这部分我发现在另一个问题,原来是一个乒乓球,允许阿尔法值来回:我试图让它只做一次,然后,显然,重置定时器。

提前感谢您的任何建议!

解决方案

我最终想出了这个重置和触发再次每次命中,并在1秒内将盾牌的alpha值从1 - 0。如果有人认为这个代码,我已经可以改进,请让我知道,我会非常感兴趣!

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);
    }
}
}

简单的计时器复位方法,帮助lerp在一个材料的alpha值1 - 0之间

一个可能的解决方案是这样做:

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是一个变量,你可以用它来改变速度。