我正在制作一个'盾'脚本(科幻,而不是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);
}
}
}
答案 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
是一个可以改变它的速度的变量。