Loading GKComponents from scene file

I'm not able to load GameplayKit entities from the scene with GKComponents working. In Xcode 10.2.1 I started with a new Spritekit/GameplayKit project. I added a new component class to the project:


class TestComponent : GKAgent2D {

    override init() {
        super.init()
        
        let goal = GKGoal(toWander: 1)
        behavior = GKBehavior(goal: goal, weight: 1)
        
        print("Wander goal added")
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func didAddToEntity() {
        super.didAddToEntity()
        
        if let entity = self.entity, let nodeComp = entity.component(ofType: GKSKNodeComponent.self) {
            self.delegate = nodeComp
            print("Added node component as delegate")
        }
    }
    
    override func update(deltaTime seconds: TimeInterval) {
        super.update(deltaTime: seconds)
        print("\(self.position) @ \(self.velocity)")
    }
}


I then set the "Hello World" string to have this component. When I run, the "Hello World" sprite isn't seen and the logs show:


Wander goal added
Added node component as delegate
SIMD2<Float>(0.0, 0.0) @ SIMD2<Float>(0.0, 0.0)
SIMD2<Float>(-nan, -nan) @ SIMD2<Float>(-nan, -nan)
SIMD2<Float>(-nan, -nan) @ SIMD2<Float>(-nan, -nan)
SIMD2<Float>(-nan, -nan) @ SIMD2<Float>(-nan, -nan)
SIMD2<Float>(-nan, -nan) @ SIMD2<Float>(-nan, -nan)
...


Is there something simple I'm missing here or is there are bug with GKComponents set in the scene file?


- jjacob

Replies

You apparently have to override your components' supportsSecureCoding property to return true, in order for them to be serialized or deserialized correctly.


https://stackoverflow.com/questions/58698088/does-xcode-11-2-scene-editor-allow-adding-components