【问题标题】:Slowly fade in the opacity of a particle system慢慢淡入粒子系统的不透明度
【发布时间】:2016-04-20 21:17:27
【问题描述】:

我正在尝试编写一些代码,当玩家到达某个位置时,慢慢会淡化粒子的不透明度。

当玩家到达该位置时,粒子的 alpha 值会发生变化,但不会慢慢消失,只是突然变化。

我是编程新手,所以我想知道我是否遗漏了任何明显的东西。谢谢!

public class IncreaseFog : MonoBehaviour {

    Renderer rend;
    GameObject character; 
    float valToBeLerpedFrom = 9f;
    float tParam = 0f;
    float speed = 0.01f; 
    float characterPosition;
    Color c;    

    void Start () {
        rend = GetComponent<Renderer>();
        character = GameObject.Find("CHARACTER");
    }

    void Update() {
        characterPosition = character.transform.position.x;
        if(characterPosition >= 190f) {
            StartCoroutine(increaseFog());
        }
    }

    IEnumerator increaseFog()
    {
        tParam = 0f;
        while (tParam < 1)
        {
            tParam +=  Time.deltaTime;  
            valToBeLerpedFrom = Mathf.Lerp(0f, 0.9f, tParam);
             c = rend.material.GetColor("_TintColor");
            c.a = (valToBeLerpedFrom);
            rend.material.SetColor("_TintColor", c);
        }
        rend.material.SetColor("_TintColor", c);
        yield return valToBeLerpedFrom;
    }
}

【问题讨论】:

  • 我注意到的一件事是 StartCoroutine 可能会被多次调用,因为玩家将保持超过 190 作为位置。我认为更好的方法是在场景中使用新的 GameObject,添加 BoxCollider 组件,然后在该组件上检查 Trigger。请注意,如果您的游戏是 2D,则需要 BoxCollider2D;如果您的游戏是 3D,则需要 BoxCollider。将以下脚本添加到此触发器void OnTriggerEnter(Collider other) { // start fade fog. } 这将确保您的代码仅触发一次并且更易于维护,因为您不会对位置进行硬编码。
  • 很简单 不要调用 StartCoroutine();从更新。从开始调用它。享受

标签: c# unity3d


【解决方案1】:

这是因为你有一个while循环......你只需要每帧执行一次。就目前而言,您的代码在 alpha 为 0.9 之前不会完成,因此您永远看不到转换。

【讨论】:

  • 但是我如何让它在一定时间内淡出而不让它进入循环?
  • @Night.owl 在 Unity 文档中搜索 coroutine。 Unity 添加了一项特殊功能,允许您的代码等待下一帧并继续。这允许您创建一个 while 循环,等待循环中的一帧并继续(使用 yield return null
【解决方案2】:

我通过使用一个盒子碰撞器作为调用协程的触发器来解决这个问题。

(感谢您的帮助)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2013-11-14
    • 2012-09-02
    相关资源
    最近更新 更多