見出し画像

watchOSでSceneKitを利用する

watchOS 3から(最新は6なので、3年前から)SceneKitの利用が可能になった。実際に使ってみたメモ。

## WKInterfaceSCNScene

watchOSにはUIKitはないので、SCNViewは使えない。その代わりとなるのがWKInterfaceSCNSceneクラス。SceneKit関連でwatchOS独自のクラスがあるとすればこれだけ。

class WKInterfaceSCNScene : WKInterfaceObject, SCNSceneRenderer

SCNViewやSCNRenderer同様、SCNSceneRendererプロトコルに準拠している。

WKInterfaceSCNScene自体に定義されているプロパティ・メソッドはこれで全部。

var scene: SCNScene?
func snapshot() -> UIImage
var preferredFramesPerSecond: Int
var antialiasingMode: SCNAntialiasingMode

## 実装方法

storyboardからWKInterfaceSCNSceneオブジェクトを追加して、

@IBOutlet var sceneInterface: WKInterfaceSCNScene!

このプロパティに接続。

あとはSCNSceneを渡してやるだけ。

sceneInterface.scene = SCNScene(named: "model.scnassets/ship.scn")!

ちなみにシーンファイルはExtension側に置く。

以上で動く。

FPS等の情報を表示したり、FPSを指定したり、デバッグオプション(SCNDebugOptions)を指定したりもできる。

sceneInterface.showsStatistics = true
sceneInterface.preferredFramesPerSecond = 60
sceneInterface.debugOptions = [.showWireframe]

## watchOSでもシェーダーを使えるのか?

watchOSではMetalフレームワークやOpenGL ESフレームワークを(サードパーティーデベロッパーは)使えない。従って、SCNProgramは使えないようだ。

しかし、SCNShadableプロトコルはサポートされている。SCNProgram型のprogramプロパティはないが、shaderModifiersプロパティはwatchOSにもある。SceneKitのドキュメントは間違いだらけなので、これもなにかの間違いでは・・・

そう思って簡単なシェーダーを書いて試してみたところ・・・

なんと動いた・・・!

以下、shaderModifiersが動くか試した際のコード:

ここから先は

613字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/