我有一个脚本,在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();
}
}
}
答案 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 下拉选项。将其从缩放更改为非标定:
对于您的特定问题,请将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