简单的计时器复位方法,帮助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);
}
}
}
一个可能的解决方案是这样做:
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
是一个变量,你可以用它来改变速度。