37836


いつもお世話になっております。

以下サイトを参考にGameplayKitを勉強しております。  
GKComponentを継承したクラス内のentity?.componentの箇所がnilになってしまいます。  
自分の力では解決できそうにない為、教えて頂けると幸いです。  
ご教授ご鞭撻のほどよろしくお願い致します。

参考サイト  
<https://github.com/marielin/CocoaBlast/blob/master/CocoaBlast_guide.md>

参考コード

[code]

    class PlayerControlComponent: GKComponent {
        /// A convenience property for the entity's sprite component.
        var spriteComponent: SpriteComponent? {
            return entity?.component(ofType: SpriteComponent.self)
        }
    ...
    
[/code]

自己解決致しましたので、回答にソースコードを記載せて頂きました。


CC BY-SA 3.0
2017-09-05T14:16:48.057
37737
2017-09-10T15:34:39.353
2017-09-10T15:32:40.337
20142
20142
question
swift3
GameplayKitにて、GKComponentを継承したクラス内でentityがnilになる


簡易なソースコードで試したところ意図した動作で動いていることを確認しました。  
そのコードを記載致します。  
いろいろアドバイス頂きありがとうございます。

[code]

    class GameScene {
    
        init() {
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func didMove() {
            let entityManager = EntityManager()
        }
    }
    
    class EntityManager {
    
        init() {
            let player: GKEntity = Player()
    
            if let visual = player.component(ofType: Visual.self) {
                print(visual.callDamage())  // "hit"
            }
        }
    }
    
    class Player: GKEntity {
    
        override init() {
            super.init()
            addComponent(Visual())
            addComponent(Damage())
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    
    class Visual: GKComponent {
    
        // 自身のエンティティにおいてコンポーネントから他のコンポーネントを呼び出す便利なプロパティ
        var damage: Damage? {
            return entity?.component(ofType: Damage.self)
        }
    
        override init() {
            super.init()
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func callDamage() -> String {
            return (self.damage?.message())!
        }
    }
    
    class Damage: GKComponent {
    
        override init() {
            super.init()
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func message() -> String {
            return "hit"
        }
    }
    
    let i = GameScene()
    i.didMove()
    
[/code]


CC BY-SA 3.0
2017-09-09T17:31:33.500
37836
2017-09-09T17:47:03.683
2017-09-09T17:47:03.683
20142
20142
37737
answer