获取对在场景编辑器中创建的粒子系统的引用

时间:2016-09-12 00:34:28

标签: swift reference scenekit ios10 particle-system

我在场景编辑器(而不是粒子编辑器)中创建了一个粒子系统,它命名为"粒子" (这是默认名称)。

回到ViewController,我试图获得对这个粒子系统的引用并改变它的一些属性。

但我无法弄清楚为什么这不起作用:

let particleSystem = SCNParticleSystem(named: "particles", inDirectory: "")
        particleSystem?.isAffectedByGravity = true

我知道可以在场景编辑器中设置重力,但我只是将其作为测试来查看对粒子系统的引用是否有效。不是。

我错过了什么或做错了什么?

额外的努力:

根据Rickster的建议,试试这个:

 let particleSystems = scene.particleSystems
    let myParticleSystem = particleSystems?[0]
    myParticleSystem?.isAffectedByGravity = true
    print(particleSystems)

现在出现了这个问题:

enter image description here

我的想法(错误的是)数组的0位置将拥有我在这个场景中唯一的粒子系统。

2 个答案:

答案 0 :(得分:1)

这是我得到的场景的照片:

SCNParticleSystem instance assigned to SCNNOde

获取对粒子系统的引用的代码分配给粒子SCNNode实例:

在Swift 2.3(及更早版本)中

 let particlesNode:SCNNode = scene.rootNode.childNodeWithName("particles", recursively: true)!
 let particleSystem:SCNParticleSystem = (particlesNode.particleSystems?.first)!

在Swift 3.0中

 let particlesNode:SCNNode = scene.rootNode.childNode(withName: "particles", recursively: true)!
 let particleSystem:SCNParticleSystem = (particlesNode.particleSystems?.first)!

替代阵列索引语法

 let particleSystem:SCNParticleSystem = (particlesNode.particleSystems?[0])!

答案 1 :(得分:0)

正如docs for that initializer建议的那样,它可以加载自己文件中的粒子系统。在场景编辑器中制作粒子系统时,粒子系统不是自己的文件 - 它是您正在制作的场景文件的一部分。

要找到它......好吧,首先你必须加载文件所代表的SCNScene对象。假设您已经完成了这项工作,那么根据您在编辑器中的定义方式,您将需要以下两种方式之一来访问粒子系统:

  • 如果粒子系统附加到节点 - 将其放置在场景中的简单方法 - 您可以使用场景的rootNode属性来获取场景内容,然后使用像this one这样的方法使用您在编辑器中指定的名称来查找包含粒子系统的节点。 (你确实在编辑器中给它起了一个名字,对吗?如果没有,那就去做吧......或者最糟糕的情况是,总是this method让你根据你可以编码的任何测试搜索节点。)

  • 如果没有,请使用场景的particleSystems属性查找未附加到节点的所有系统。