【问题标题】:Add particles on button click in unity在按钮上添加粒子统一单击
【发布时间】:2017-06-08 10:08:25
【问题描述】:

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

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

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

提前致谢

编辑:

正如@kardux 建议的那样:

声明:

[SerializeField] private ParticleSystem ps;

关于方法:

ps.Play()

检查员截图:

错误:

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 

【问题讨论】:

  • 要让粒子系统开始发射粒子,您必须将所需的粒子数设置为emit。换句话说,您可以在调用Play 函数之前执行ps.Emit(10);
  • 我尝试将其用于 ps.Emit( (int) (75 * Time.deltaTime) );但它不起作用......
  • @Hristo 你不需要在代码中设置发射。你应该在编辑器中设计它。

标签: unity3d particle-system unity-components


【解决方案1】:

首先,如果您在 Unity UI 中使用粒子,我强烈建议您从 Unity UI Extension 存储库中寻找 UIParticleSystem.cs 脚本:这是许多有用的 UI 工具的社区集合 :)
(只是不要忘记添加 UI/Particles/Hidden 着色器,您可以找到 here)

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

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

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

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

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

希望对你有帮助,

编辑:
你有两种方法来设置你的GameObjects

  • 您在同一个 GameObject 上拥有所有组件(ParticleSystemUIParticleSystemYOUR_SCRIPT):这样,您可以通过在脚本中调用 GetComponent&lt;ParticleSystem&gt;() 来获取 ParticleSystem 参考

  • 您有一个粒子 GameObject(带有 ParticleSystemUIParticleSystem)并且 YOUR_SCRIPT 在另一个GameObject:你不能在你的脚本中调用GetComponent&lt;ParticleSystem&gt;(),因为它会搜索这个GameObject的组件,所以你声明了一个ParticleSystem ps;变量(public[SerializeField] private),通过将粒子 GameObject 拖动到 Inspector 来分配。

请注意,GetComponent&lt;ParticleSystem&gt;() 隐含地等于 this.gameObject.GetComponent&lt;ParticleSystem&gt;():这就是它会从当前 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();
    }
}

【讨论】:

  • 简单说明一下:问题似乎来自粒子系统的 Play On Awake 属性。如果您在我的脚本中调用Stop() 之前测试ps.isPlaying 值,那么即使是第一次也是如此(未选中Play On Awake)。
  • 谢谢@Kardux 我收到 NullReferenceException: Object reference not set to an instance on an object on ps.Stop()..你对此有什么想法吗?
  • 脚本是否与您的 ParticleSystem 组件位于同一对象上?如果不是,您必须将 [SerializeField] private ParticleSystem ps; 声明为脚本的变量并通过 Inspector 分配它(或者您可以将脚本移动到与 ParticleSystem 相同的对象)。
  • 我创建了一个游戏对象 ParticleSystem 然后将 UIParticleSystem.cs 这个脚本添加到该对象......并从编辑器将 ParticleSystem 分配给面板下的粒子......不是上面提到的我在所需方法上添加的代码。 ..我对团结完全陌生..这是正确的方式吗?
  • 我刚刚编辑了我的答案,向您解释了如何为您的 ParticleSystem 组件提供工作参考:告诉我您是否可以使其工作:)
【解决方案2】:

如果您在调用它的脚本所在的游戏对象上拥有一个粒子系统,那么应该没问题。

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

它很旧,但仍然很重要。

【讨论】:

    【解决方案3】:

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

    1. 创建一个空的游戏对象 - 将粒子附加到该对象。
    2. 只要你想发射粒子,请致电Gameobject.SetActive(true);
    3. 确保在粒子系统中选中 Play on Awake 选项。

    根据您的 UI 设置粒子的位置。

    【讨论】:

    • 我使用的是 unity 5.6 编辑器.. 已经添加了游戏对象和粒子系统,勾选了在唤醒时播放选项.. 所以我只需要调用 Gameobject.SetActive(true);运行时脚本所需的条件?
    • 是的,最初禁用粒子系统游戏对象。每当您需要发射粒子时,只需在所需时间内启用它即可。将粒子添加到不用于 UI 的单独游戏对象中。你确定粒子系统工作正常吗,在编辑器中播放它以检查它是否工作。
    • 我可以在静态元素上添加粒子......或主页......但不是我在运行时需要的地方!
    • 让粒子系统一直发射并禁用它是不好的做法。而是使用ParticleSystem.PlayParticleSystem.Stop
    • 以上代码我的问题不起作用...对此有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多