【问题标题】:Get reference to a Particle System created in Scene Editor获取对在场景编辑器中创建的粒子系统的引用
【发布时间】:2016-09-16 04:31:32
【问题描述】:

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

回到 ViewController,我正在尝试获取对这个粒子系统的引用并更改它的一些属性。

但我不知道为什么这不起作用:

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

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

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

额外的努力:

按照 Rickster 的建议,试试这个:

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

现在有这个问题:

我的想法(虽然是错误的)是阵列的 0 位置将具有我在这个场景中唯一的粒子系统。

【问题讨论】:

    标签: swift reference scenekit ios10 particle-system


    【解决方案1】:

    这是我得到的场景图片:

    以及获取分配给粒子 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])!
    

    【讨论】:

    • 谢谢!!!那个时髦的(?。)!或者 (?[])!语法是我的头脑。发送选项来测试我们。或者也许只有我。
    • 显然我必须等待 20 小时才能奖励你。我试着马上去做,你的答案很准确,而且效果很好。
    • 我没有看到在 SceneKit 编辑器中将多个粒子系统添加到给定节点的方法。但也许有。我看到的是,每次您放置一个粒子系统时,它都会为其创建一个节点并将其分配给该节点。但是,我看到在代码中添加多个选项:addparticlesystemremoveparticlesystem。然后在粒子系统数组属性中顺序是连续的。
    • 没错。节点检查器中的身份名称是节点的名称。我通常将第一个节点添加为空节点并将其称为根节点。然后我将其他节点添加到它。
    • 是的。默认节点名称始终相同,“particles”而不是“particles1”、“particles2”等...
    【解决方案2】:

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

    要找到它...好吧,首先您必须加载该文件所代表的SCNScene 对象。假设您已经这样做了,您将需要以下两种方法之一来访问粒子系统,具体取决于您在编辑器中的定义方式:

      1234563使用您在编辑器中指定的名称查找包含粒子系统的节点。 (你确实在编辑器中给了它一个名字,对吧?如果没有,那就去做吧……或者最坏的情况,总是有this method 可以让你根据你可以编码的任何测试来搜索节点。)
    • 如果没有,请使用场景的 particleSystems 属性查找所有未连接到节点的系统。

    【讨论】:

    • 我真的很纠结苹果文档。这在实际使用时是什么样子的? varparticleSystems:[SCNParticleSystem]? {得到}
    • 顺便说一句,是的,不是孩子。我在层次结构的顶部添加了粒子系统,它们不是场景中其他任何东西的子系统。只需使用基本的 SceneKit 模板并将它们从右下角的对象生成器池中拖入即可。然后将它们从默认存在的层次结构中拾取并向上拖动。
    • 我之前尝试过“使用名称查找 childNode”方法,并获得了对它的引用,但它不是粒子系统,作为 SKNode 回来,我不能弄清楚如何将其向后/向下投射到粒子系统。
    • 从对象库中拖动对象将始终创建一个SCNNode 来保存该对象。您在编辑器左侧的场景图视图中看到的所有内容都是一个节点。绝不是像灯光、相机或粒子系统这样的节点属性。
    • 太棒了。那么如何获得对我以这种方式创建的粒子系统的引用呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多