单击按钮时添加粒子

时间:2017-06-08 10:08:26

标签: unity3d particle-system unity-components

我是Unity 3d的新手,我必须在退出项目时做一些改进。如果用户选择了正确的选项,那么我必须在运行时在按钮周围显示一些粒子。 我添加粒子的代码如下:不工作:

ParticleSystem ps = GetComponent<ParticleSystem>();
ps.Play ();

我还从统一编辑器添加了粒子组件..

提前致谢

编辑:

正如@kardux建议的那样:

声明:

[SerializeField] private ParticleSystem ps;

方法:

ps.Play()

检查员的屏幕截图:

enter image description here

错误:

I/Unity   (23313): NullReferenceException
I/Unity   (23313):   at UnityEngine.ParticleSystem.<Play>m__0 (UnityEngine.ParticleSystem ps) [0x00001] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3666 
I/Unity   (23313):   at UnityEngine.ParticleSystem.IterateParticleSystems (Boolean recurse, UnityEngine.IteratorDelegate func) [0x00003] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3780 
I/Unity   (23313):   at UnityEngine.ParticleSystem.Play (Boolean withChildren) [0x00020] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3666 
I/Unity   (23313):   at UnityEngine.ParticleSystem.Play () [0x00005] in /Users/builduser/buildslave/unity/build/artifacts/generated/common/modules/ParticleSystem/ParticleSystemBindings.gen.cs:3661 

3 个答案:

答案 0 :(得分:2)

首先,如果您在Unity UI中使用粒子,我强烈建议您查看来自UIParticleSystem.cs存储库的Unity UI Extension脚本:这是许多有用的UI工具的社区聚会:)
(只是不要忘记添加您可以找到的{strong> UI /粒子/隐藏着色器here

您可以在此处更改要使用的精灵: UIParticleSystem component settings

使用此脚本时请记住,您必须根据屏幕缩放粒子(粒子初始化为1,因为在Unity 3D世界中这是1米:但现在您可能会在画布空间中这将是像1920x1080px,所以1px将是非常小的)。您可以在下面找到一些基本设置: ParticleSystem component settings

现在来到你的脚本我怀疑你只需要在Stop()之前调用Play()(注意我在粒子系统设置中使用了爆发发射类型):

ParticleSystem ps = GetComponent<ParticleSystem>();
ps.Stop ();
ps.Play ();

P.-S。请注意,如果您使用 UIParticleSystem 脚本,则必须将粒子系统视为UI项目(将在基于层次结构顺序的其他项目的顶部)

希望这有帮助,

修改
您有两种设置 GameObjects 的方法:

  • 您拥有相同 GameObject ParticleSystem UIParticleSystem YOUR_SCRIPT )的所有组件:通过这种方式,您可以通过在脚本中调用GetComponent<ParticleSystem>()来获取 ParticleSystem 引用

  • 你有一个粒子 GameObject ParticleSystem UIParticleSystem ), YOUR_SCRIPT 在另一个 GameObject :您无法在脚本中调用GetComponent<ParticleSystem>(),因为它将搜索此 GameObject 的组件,因此您声明了ParticleSystem ps;变量(通过将粒子 GameObject 拖到其中,通过Inspector分配的public[SerializeField] private)。

请注意,GetComponent<ParticleSystem>()等于this.gameObject.GetComponent<ParticleSystem>():这就是它将从当前 GameObject 中搜索组件的原因。

编辑2:
不确定为什么你的脚本会抛出这个 NullReference 异常:我只是尝试了一个非常简短的脚本,它运行得很好......

public class TestScript: MonoBehaviour
{
    [SerializeField]
    private ParticleSystem ps;

    void Start()
    {
        // This one is not even needed
        ps.Stop();
    }

    public void PlayParticles()
    {
        ps.Stop();
        ps.Play();
    }
}

答案 1 :(得分:0)

如果你在与调用它的脚本相同的gameObject上有一个粒子系统,它应该没问题。

您使用的是UI按钮吗?如果是这样,看看这里.. http://answers.unity3d.com/questions/852397/particle-system-in-46-ui.html

虽然陈旧但仍然相关。

答案 2 :(得分:0)

您使用的是新的Unity UI系统还是GUI,是UI世界空间吗?

  1. 创建一个空的游戏对象 - 将粒子附加到该游戏对象。
  2. 每当您想要发射粒子时,请致电Gameobject.SetActive(true);
  3. 确保在粒子系统中选中Play on Awake选项。
  4. 根据您的UI设置粒子的位置。