【Swift】SpriteKitの使い方。SKVideoNodeで動画の再生、リピート(繰り返し)、アニメーションを実行する。

2020年6月16日

SKVideoNodeとは

本記事ではSKVideoNode(以下、ビデオノード)について説明する。ビデオノードとは、シーンで動画を作成するノードである。

背景を動画で見せたり、ゲームのチュートリアルでプレイ動画を再生したりするといった使い方が想像できる。

 

ビデオノードを試してみる。

実際にビデオノードを使ってシーンに動画を追加してみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。⇒「テスト用プロジェクト

事前準備ではパンダが踊る動画(movファイル)をプロジェクトに追加しておいた。この動画をシーンに追加して再生する。

 

TestScene.swiftを以下のコードに変更する。画面をタッチしたらビデオノードを再生するようにした。

 

以下は実際のプレイ動画

 

当初、動画(dance.mov)をアセットカタログ(Assets.xcassets)に格納して使おうと思っていたが、そうすると何故か動画が表示されないので、プロジェクトのフォルダに格納している。理由が分かったら追記する。

動画ファイルはアセットカタログに追加しない

ビデオノードをアニメーションさせる

ビデオノードはSKSpriteNodeと同じように移動、回転、拡大縮小などのアクションでアニメーションさせられる。

実際にやってみよう。TestScene.swiftを以下のコードに変更する。サイズを2倍に変えながらタップした場所まで移動するようにした。

 

以下は実際のプレイ動画

 

動画をループさせる

実はビデオノードの動画を操作するメソッドにはplayメソッドとstopメソッドしか無い。なので、上記のビデオノードの作り方では動画をリピートしたり、再生速度を変えたりといったことができない。

公式リファレンスには以下のように記載されている。
⇒「公式リファレンス:SKVideoNode

If you need more precise control over the video playback behavior, you can use AV Foundation to create an AVPlayer object for your video content and then use this object to initialize the SKVideoNode node. Then, instead of using the node’s playback methods, you use the AVPlayer object to control playback. The video content is automatically displayed in the video node. For more information, see AVFoundation Programming Guide.

 

つまり、再生をコントロールしたかったらAVPlayerクラスのインスタンスでビデオノードを初期化するということ。実際にやってみよう。TestScene.swiftを以下のコードに変更する。

AVPlayerの動画の再生が最後に到達したときにコールバックメソッドを呼び出すようにNotification Centerに登録し、コールバックメソッドが動画の再生位置を最初に戻している。
⇒参考「stackoverflow:How do you loop AVPlayer in Swift?

 

以下は実際のプレイ動画。パンダのダンスがループした。