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

How to add components to sprites within editor with gameplaykit

我有一个组件:

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)

    }
}

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

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

当我 运行 项目时,它 运行 没问题,它会打印 Component 子类中的两个打印语句。

  1. 为什么它同时使用两个初始化函数,我如何让它只使用 1 个函数?

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

感谢您的帮助...

1) 我猜你不明白组件是什么,组件和SKSpriteNode不是一回事,实际上它们是两个完全不同的东西,彼此几乎没有关系。当您使用场景生成器将节点放置在场景中时,它会在幕后自动生成 GKEntityGKSKComponent 的实例。 GKSKComponent 是包含 SKSpriteNode 的组件。您的 Test 组件是一个执行其他操作的组件。一切都是分开的。最好的例子是自行车。车轮是一个组件,链条是一个组件,刹车是一个组件,每个组件都有一个非常独特的用途。您需要创建(初始化)所有这些对象才能获得一辆自行车。

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

这是我的class我为了让组件更容易访问节点

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;
    }

}