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语句
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呢?您需要创建一个组件,还需要创建一个精灵