不要使用Time.timescale暂停/影响粒子

时间:2017-11-19 18:55:43

标签: c# unity3d

我有一个脚本,在CollisionEnter2D上,粒子从一个物体发出,游戏暂停。粒子也停止了。但我不想暂停粒子。即使游戏暂停,我希望他们玩。我怎么能这样做?

这是一个脚本:

using UnityEngine;

public class MovingPlayer : MonoBehaviour
{

    public float playerSpeed;
    public float maxPos = 2.7f;

    Vector3 position;
    public uiManager ui;

    Rigidbody2D rb;

    public GameObject particleSystemPrefab;

    void Awake ()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    // Use this for initialization
    void Start ()
    {
        position = transform.position;
    }

    ......

    void OnCollisionEnter2D (Collision2D col)
    {
        if (col.gameObject.tag == "CubeObstacle") {
            foreach(ContactPoint2D contact in col.contacts)
            {
                Instantiate(particleSystemPrefab, contact.point, Quaternion.identity);
            }
            Time.timeScale = 0;
            ui.gameOverActivated();
            am.playerSound.Stop();
            PlayerPrefs.SetInt("score", score);
            PlayerPrefs.Save();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

在过去,ParticleSystem.Simulate用于更新功能,但这很昂贵。它减慢了许多游戏的速度。

Unity 2017.1 开始,添加了一个新属性ParticleSystem.MainModule.useUnscaledTime来解决此问题,以便将Time.timescale设置为0不会影响粒子,如果这是你喜欢的行为。

简单示例:

ParticleSystem m_System = GetComponent<ParticleSystem>();
ParticleSystem.MainModule main = m_System.main;

//Use Unscaled Time
main.useUnscaledTime = true;

如果您不想通过代码而是通过编辑器更改它,那么它是 Delta Time 下拉选项。将其从缩放更改为非标定

enter image description here

对于您的特定问题,请将OnCollisionEnter2D功能更改为以下内容:

void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.tag == "CubeObstacle")
    {
        foreach (ContactPoint2D contact in col.contacts)
        {

            GameObject obj = Instantiate(particleSystemPrefab, contact.point, Quaternion.identity);
            ParticleSystem m_System = obj.GetComponent<ParticleSystem>();
            ParticleSystem.MainModule main = m_System.main;
            //Use Unscaled Time
            main.useUnscaledTime = true;

        }
        Time.timeScale = 0;
        ui.gameOverActivated();
        am.playerSound.Stop();
        PlayerPrefs.SetInt("score", score);
        PlayerPrefs.Save();
    }
}

答案 1 :(得分:0)

你的头衔有点令人困惑。你说“Time.timeScale = 0不暂停粒子”然后你的问题说你不想在设置timeScale = 0时暂停粒子......所以我假设你想要播放粒子即使你设置了timeScale = 0。 要让粒子系统忽略timeScale,请使用

separate

播放或启用粒子系统后立即播放。 https://docs.unity3d.com/ScriptReference/ParticleSystem.Simulate.html