1

我一直在为 Xcode 8 和新的场景编辑器更新 SpriteKit/GameplayKit 项目,它允许将实体组件信息添加到场景中。我一直在将我的实体代码移动到场景中,但是我无法从相应的节点访问实体。根据 Apple 的文档:

场景中您附加了一个实体或组件的任何 SpriteKit 节点都会自动拥有一个 GKSKNodeComponent 对象来管理节点与其所代表的 GKEntity 对象之间的关系。

将 GKSKNodeComponent 对象添加到实体会自动更新组件的 SpriteKit 节点(SKNode 对象)的实体属性以指向该实体。

我要加载场景的新代码基本如下:

guard let newTowerScene = GKScene(fileNamed: "TowerScene"),
    let rootScene = newTowerScene.rootNode as? SKScene 
    else { return }
self.view?.presentScene(rootScene, transition: SKTransition.push(with: .up, duration: 1.75))

访问该GKScene对象会返回一个正确加载的实体数组,但如果我尝试GKEntity.entity从连接的节点访问一个实体,它会返回 nil。该节点是通过GKSKNodeComponent.node从 中的实体访问来连接的GKScene

如何按预期获取GKSKNodeComponentGKScene自动更新SKNode的属性?entity

4

1 回答 1

1

万一其他人遇到这个问题……</p>

我注意到,如果我GKScene在加载后添加了一个具有关联节点的实体,则该节点的entity属性已正确设置。现在,我添加了一个在加载后运行的循环GKScene

for nextEntity in gkScene.entities
    {
        gkScene.removeEntity(nextEntity)
        if let nextNode = nextEntity.component(ofType: GKSKNodeComponent.self)?.node
        {
            nextEntity.addComponent(GKSKNodeComponent(node: nextNode))
        }
        gkScene.addEntity(nextEntity)
    }

GKSKNodeComponent除非替换以前的,否则它似乎也不起作用。希望这只是对将很快解决的错误的临时修复。

于 2016-09-19T18:06:15.403 回答