我是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
答案 0 :(得分:2)
首先,如果您在Unity UI中使用粒子,我强烈建议您查看来自UIParticleSystem.cs存储库的Unity UI Extension脚本:这是许多有用的UI工具的社区聚会:)
(只是不要忘记添加您可以找到的{strong> UI /粒子/隐藏着色器here)
使用此脚本时请记住,您必须根据屏幕缩放粒子(粒子初始化为1,因为在Unity 3D世界中这是1米:但现在您可能会在画布空间中这将是像1920x1080px,所以1px将是非常小的)。您可以在下面找到一些基本设置:
现在来到你的脚本我怀疑你只需要在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世界空间吗?
Gameobject.SetActive(true);
根据您的UI设置粒子的位置。