LoginSignup
18
17

More than 5 years have passed since last update.

UIKitアプリにSpriteKitのviewを差し込んでパーティクルを出してみた(Swift3)

Posted at

先日CoreAnimationのパーティクルをSwift3で試してみたという記事で、SpriteKitをUIKitに組み込むよりCoreAnimationのパーティクルを入れた方が楽だよと書いたんですが、CoreAnimationのパーティクルは設定できる項目が少なく、欲しいパーティクルが作れませんでした。結局SpriteKitのパーティクルを使うことになったのでシェアします。

まずはSingleViewApplicationでプロジェクトを作ります

スクリーンショット 2016-11-01 6.18.13.png

ストーリーボードで、ViewControllerにもともとあるViewに新しいViewを載せますスクリーンショット_2016-11-01_6_19_29.png

追加したviewのクラスをSKViewにします
スクリーンショット 2016-11-01 6.20.11.png

追加したViewの背景を黒くしてパーティクルが見やすくなるようにしますスクリーンショット_2016-11-01_6_33_32.png

storyboardで追加したSKViewをViewController.swiftと紐付けします(skViewっていう名前にしました)
スクリーンショット 2016-11-01 6.36.56.png
紐付け完了
スクリーンショット_2016-11-01_6_40_06.png

SKSceneのswiftファイルを作ります

スクリーンショット 2016-11-01 6.46.31.png

スクリーンショット_2016-11-01_6_46_49.png

作ったSKSceneファイルにはこんなコードを書きます
スクリーンショット 2016-11-01 6.54.37.png

import SpriteKit

class TestSKScene : SKScene {

    override func didMove(to view: SKView) {
        self.backgroundColor = SKColor.clear    // これ落とし穴!やらないとモヤがかかったみたいになる
        self.scaleMode = .resizeFill    // これを入れないとiPadで表示した時にパーティクルが小さく表示されてしまう
        emitParticle()
    }

    func emitParticle() {

        // パーティクルファイルのパスを指定
        guard let testParticlePath = Bundle.main.path(forResource: "testParticle", ofType: "sks") else {
            return
        }

        // パーティクルを作って載せる
        let testParticle = NSKeyedUnarchiver.unarchiveObject(withFile: testParticlePath) as! SKEmitterNode
        testParticle.position = CGPoint(x: self.frame.midX, y: self.frame.midY)
        self.addChild(testParticle)
    }
}

まだパーティクルファイルは作ってないですが、名前はtestParticle.sksにする予定です。

SpriteKitのパーティクルファイルを作ります

スクリーンショット 2016-11-01 6.58.09.png
※SceneKitのパーティクルを選ばないように気をつけて

タイプは色々ありますが、とりあえずRainを選びました
スクリーンショット 2016-11-01 6.58.32.png

値を調整しないとこんな感じ
スクリーンショット 2016-11-01 6.59.02.png
値を変えて欲しいイメージに調整しましょう

これでSKSceneにパーティクルは載ったので、最初に作ったViewControllerに載せたSKViewにSKSceneを載せます
スクリーンショット_2016-11-01_7_06_14.png

override func viewWillAppear(_ animated: Bool) {
let scene = TestSKScene(size: skView.bounds.size)
skView.presentScene(scene)
}

ビルドしましょう

はい完成♪

スクリーンショット 2016-11-01 7.09.04.png

落とし穴がひとつだけ

TestSKScene.swiftファイルにコメントで書いたんですが、

self.backgroundColor = SKColor.clear

これを入れないとパーティクルの上にモヤがかかったみたいになります。これだけハマりました。
スクリーンショット_2016-11-01_7_09_04.png

これができればシーンの上にSKSpriteNodeを載せることも可能だし、SpriteKitのパワー生かし放題ですね。

18
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17