【问题标题】:Unity Particle System Issue统一粒子系统问题
【发布时间】:2021-07-12 13:39:46
【问题描述】:

我正在制作一款赛车游戏,并希望在您越野时有岩石从轮胎上飞出。 我遇到的问题是粒子系统没有在应该触发的时候触发。 我用它作为地面来触发一个 bool 并且 bool 触发良好。

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;
    }
 }
}

奇怪的是,调试日志会触发,但粒子系统不会。我试过把它全部放在地面脚本下,我把它放在“!isOnBoostStrip”下的“isOnGround”下,即使加速交换工作粒子我也没有试过没有“p.Stop( );"只是让它不循环,仍然没有运气,虽然当我这样做时它做了一件奇怪的事情,它会开火,但只有当我碰到障碍物时。

非常感谢任何帮助,我不确定我哪里出错了。

编辑:在这个视频中,我展示了平面设置以及我当前的岩石系统和默认粒子系统的错误。它还只检查“IsOnGround”是否为真,这似乎工作得很好。 这是视频 - https://www.youtube.com/watch?v=P6TfacNZZxE 这是我在视频中使用的代码。

    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();
        }
    }

}

【问题讨论】:

  • 你的助推条粒子在超过助推器时是否在播放?还是没有粒子系统在工作?
  • 这很奇怪,我的其他粒子系统都运行良好,我将它们安装在轮子和排气装置上,并且使用相同的“foreach”它们运行良好。所以我试着在这个例子中播放排气粒子而不是地面粒子,它们以同样奇怪的行为运行。下面有人建议我看看统一是否认为粒子系统正在玩我所做的调试。它表明它正在播放,但它不是。我做了一个视频,所以你可以看到奇怪的行为。它认为它正在播放,但当我撞到一个物体时它不会开始。 youtube.com/watch?v=8M7eHxW006A
  • 在视频的开头,你可以看到我的漂移粒子系统开火了。如果您不想观看整个过程,那么岩石会在 20 秒时开始工作。
  • 明白了。我在视频中注意到的一点是,不仅是当你撞到障碍物时,而且当你撞到障碍物时,你似乎得到了一些空气。而当你在地面上行驶时,isWorking 调试是否每帧都打印?您的地面标记和/或分层是否与您进行地面检查的方式相符?您的粒子系统在工作时看起来很好,这是一些逻辑导致并循环通过粒子的Start
  • 首先,感谢您帮助我!对于空气来说确实如此,所以我将代码切换为只检查“if (isOnGround)”,现在如果我删除它,粒子系统将不停地播放但不会出错。我将在上面进行编辑以显示我当前的代码和一个将显示正在发生的事情的新视频。我还做了一个默认的部分系统,它仍然有同样的错误。

标签: unity3d particle-system


【解决方案1】:

Unity 的粒子系统有时可能有点不稳定,我相信您现在已经发现了。我过去使用的一个解决方案是将麻烦的粒子系统设置为Play on Awake。然后不要在粒子上使用PlayStop,而是使用粒子的GameObject,分别使用SetActivetrue和false。

【讨论】:

  • 我不能投票,因为我没有 15 或更多的声望,但你帮了我很多。谢谢!
  • 不用担心。我回答问题的主要原因是以防其他人在未来遇到同样的问题。只要将其作为答案进行检查,就足以让某人理解它是解决方案。
猜你喜欢
  • 1970-01-01
  • 2022-08-07
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多