Ios 如何使用gameplaykit向编辑器中的精灵添加组件

Ios 如何使用gameplaykit向编辑器中的精灵添加组件,ios,swift,sprite-kit,components,gameplay-kit,Ios,Swift,Sprite Kit,Components,Gameplay Kit,我有一个组成部分: class Test: GKComponent { override init() { super.init() print("init ran") } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) print("coder init ran") } } 我还有一个子类: class T

我有一个组成部分:

class Test: GKComponent {
    override init() {
        super.init()
        print("init ran")
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        print("coder init ran")
    }
}
我还有一个子类:

class Testing: SKSpriteNode {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

    }
}
所以在我的场景编辑器中,我有一个精灵。在编辑器中,我将其子类化为测试

在场景编辑器中,我还添加了组件测试

当我运行该项目时,它运行良好,并在组件子类中打印两条print语句

  • 为什么它同时使用init函数以及如何使它只使用1

  • 我该如何在这个组件中添加一些东西,比如一个动作或什么。。。比如说我想让精灵旋转?我该怎么做

  • 感谢您的帮助……

    1)我想您不明白什么是组件,组件与
    SKSpriteNode
    不是一回事,事实上它们是两个完全不同的东西,几乎没有任何关系。使用场景生成器在场景中放置节点时,它会在场景后面自动生成
    GKEntity
    GKSKComponent
    的实例
    GKSKComponent
    是保存
    SKSpriteNode
    的组件。您的
    测试组件是一个执行其他操作的组件。一切都被划分了。最好的例子,想想自行车。车轮是一个部件,链条是一个部件,制动器是一个部件,每个部件都有一个非常独特的用途。您需要创建(初始化)所有这些对象才能获得自行车

    2) 要使其他组件与您的
    SKSpriteNode
    一起工作,您需要访问实体。组件应该可以访问它,所以您只需要执行
    self.entity
    。然后您需要找到
    GKSKComponent
    ,它将有一个指向您正在查找的节点的链接,以便您可以对其应用操作

    这是我制作的类,它使组件更容易访问节点

    import GameplayKit
    
    class NodeComponent : GKComponent
    {
        public private(set) lazy var node : SKNode = self.entity!.component(ofType: GKSKNodeComponent.self)!.node
    
        func resetNode(to node:SKNode)
        {
            self.node = node;
        }
    
    }
    

    我知道组件不是精灵。我基本上是在问如何从组件访问精灵,这样我就可以在组件中对精灵进行操作。例如,制作一个旋转组件。如果我可以使用let node=self.entity(component:GKSKComponent.self)访问解决该问题的节点。我不知道GKSComponent,所以回答了问题2,谢谢……是的,我实际上制作了GKSComponent的一个子类,这样我需要节点的任何组件都可以得到问题1的它。我只是想知道为什么两个init函数都在运行,根据您的回答,我仍然不确定。但是通过实验,我注意到aDecoder init函数运行是因为它是在编辑器中实现的。另外,super.init(aDecoder)调用另一个init(),我想这是有意义的。我必须重写init(),否则它会崩溃,因为它需要实现。但我仍然不确定为什么要添加它,因为我假设super中有init(),因为我的覆盖。但是它可以工作。访问节点的语法正确吗?我会使用GKSKComponent.self?因为它们是两个不同的东西,为什么它们不都是init呢?您需要创建一个组件,还需要创建一个精灵