Unity3d 统一粒子系统问题
我正在做一个赛车游戏,希望在你越野时轮胎上会有岩石飞出。 我遇到的问题是粒子系统没有在它应该点火的时候点火。 我用它在地面上触发枪炮,枪炮开火很好Unity3d 统一粒子系统问题,unity3d,particle-system,Unity3d,Particle System,我正在做一个赛车游戏,希望在你越野时轮胎上会有岩石飞出。 我遇到的问题是粒子系统没有在它应该点火的时候点火。 我用它在地面上触发枪炮,枪炮开火很好 using System.Collections; using System.Collections.Generic; using UnityEngine; public class GroundEffect : MonoBehaviour { public void OnTriggerEnter(Collider other) { i
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GroundEffect : MonoBehaviour
{
public void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Player"))
{
other.transform.root.GetComponentInChildren<KartController>().isOnGround = true;
}
}
public void OnTriggerExit(Collider other)
{
if (other.gameObject.CompareTag("Player"))
{
other.transform.root.GetComponentInChildren<KartController>().isOnGround = false;
}
}
}
Unity的粒子系统有时会有点不稳定,我相信你现在已经发现了。我过去使用的一个解决方案是将麻烦的粒子系统设置为“唤醒时播放”。然后,不要在粒子上使用
Play
和Stop
,而是使用粒子的游戏对象,并分别使用SetActive
true和false。你的助推带粒子在经过助推时是否在玩?或者没有粒子系统工作?这是奇怪的部分,我的其他粒子系统都工作得很好,我有它们在轮子和排气管上,它们使用相同的“foreach”工作得很好。所以在这个例子中,我试着播放排气粒子,而不是地面粒子,它们以同样的奇怪行为运行。下面有人建议我看看unity是否认为粒子系统正在进行调试,我就是这么做的。它显示它正在播放,但它不是。我把它录了下来,这样你就能看到奇怪的行为。它认为它正在播放,但没有播放,然后当我撞到一个物体时,它就会开始播放。youtube.com/watch?v=8m7ehxw006aa在视频的开头,你可以看到我的漂移粒子系统发射的很好。如果你不想看整件事,岩石会在20秒开始工作。明白了。我在视频中注意到的一点是,不仅仅是当你撞到障碍物时,而且当你撞到障碍物时,你似乎得到了一些空气。当你在地面上驾驶时,正在工作
调试打印每一帧吗?您的地面是否贴有标签和/或分层,与您进行地面检查的方式是否相符?你的粒子系统工作起来似乎很好,这是一些逻辑,引导到粒子的开始
。首先,谢谢你的帮助!空气的事情也是如此,所以我把代码改为只检查“if(isOnGround)”,现在如果我去掉这个,粒子系统将不停地播放,但不会出错。我将对上面的内容进行编辑,以显示我当前的代码和一个新的视频,该视频将显示正在发生的事情。我还做了一个默认的部分sys,它仍然有相同的bug。我不能升级,因为我没有15个或更多的声誉,但你帮了我很多。谢谢别担心。我回答问题的主要原因是为了防止其他人也有同样的问题。只要它被检查为答案,就足以让某人理解它是解决方案。
void Update()
{
//Follow Collider
transform.position = sphere.transform.position - new Vector3(0, 0.4f, 0);
if (!isOnBoostStrip)
{
//Accelerate
if (Input.GetButton("Fire1"))
{
speed = curAccel;
}
//Reverse
if (Input.GetButton("Fire2"))
{
speed = -curAccel / 3;
}
if (!isOnGround)
{
curAccel = zAcceleration;
}
if (isOnGround)
{
curAccel = zAcceleration / 2;
}
}
else if (isOnBoostStrip)
{
speed = zAcceleration * boostStripSpeed;
foreach (ParticleSystem p in exhaustParticles)
{
if (!isDrifting)
{
c = turboColors[0];
}
var pmain = p.main;
pmain.startColor = c;
p.Play();
}
}
//Rocks
if (isOnGround)
{
foreach (ParticleSystem p in groundParticles)
{
Debug.Log(isOnGround);
p.Play();
}
}
}