SKSceneのゲーム画面をPNG形式で保存する(Swift 4.0)

macOS向けのSpriteKitを使用したSwiftプログラムで
ゲーム画面をPNG形式で保存する方法がなかなか見つからなかったので、
とりあえず動いたものをメモがてら公開します。
なぜ動くのかは知らない。
バージョンはSwift 4.0.2です。

extension GameScene {
    func savePNG() {
        let texture = self.view!.texture(from: self)
        let image = texture?.cgImage()
        let bitmap = NSBitmapImageRep(cgImage: image!)
        let data = bitmap.representation(using: NSBitmapImageRep.FileType.png, properties: [:])!
        
        let filename = "test.png"
        
        if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last {
            do {
                try data.write(to: dir.appendingPathComponent(filename))
            } catch let error as NSError {
                print("failed to write: \(error)")
            }
        }
    }
}


前半部で、ゲーム画面から保存したい画像を取り出しています。
本体のSKScene内のSKViewを参照し、
SKScene自身に関連するSKTextureを取り出してる模様。
そのSKTextureをCGImage、NSBitmapImageRep、Dataと順々に変換し
保存可能な形式に持ち込んでいる模様。
(なんだか呪文みたい)


後半部は、データの保存部分ですね。
Data型のメソッドであるwrite関数で保存先を指定して保存します。
引数が、URL型とString型があるので注意(ここではURL型になっています)。
保存部分でエラー吐かれたら、頑張るしかありません。


色々変換しているのが遠回りなように見えて
もっとスマートに保存できないのかと思ってますが、
趣味のものなので、動けばそれでいいか、と。
検索すれば色々ヒットはするんですけど、
どうやらmacOSじゃない方の解決法っぽいのが多くて。


なお、たくさんのサイトを参考にしましたが、
組み合わせてるうちにどれを参考にしたかわからなくなったので、
紹介は省略します。
大体はApple公式のドキュメントです。


そしてこれをはてなダイアリーで公開するという。
もっといい場所あるだろうと。
でも面倒だしこれでいいや。