繁体   English   中英

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

[英]Don't pause/affect particles with Time.timescale

我有一个脚本,其中在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();
        }
    }
}

过去,Update函数中使用了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;

如果您不想通过代码而是通过编辑器进行更改,则可以使用“ 增量时间”下拉选项。 更改它扩展未调整

在此处输入图片说明


对于您的特定问题,请将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();
    }
}

您的标题有点混乱。 您说“ Time.timeScale = 0不要暂停粒子”,那么您的问题是,当您设置timeScale = 0时您不想暂停粒子...所以我假设您要播放粒子即使已将timeScale设置为0,也要使粒子系统忽略timeScale,请使用

particleSystem.Simulate(Time.unscaledDeltaTime, true, false);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM