SCNScene の subclass 化 with SwiftUI

iOS

SceneKit が開発していると Scene の部分を別ファイルに分離したいときがあります。

あまり情報がなく、海外の Stack Overflow などを調べていると、Don’t subclass などと書かれている記事もありますが、サブクラス化できました。

SceneView という iOS 14 から追加されたものを使います。

SceneView – A SwiftUI view for displaying 3D SceneKit content.
https://developer.apple.com/documentation/scenekit/sceneview

実行すると以下のような黄色い球が出ます。

それではよい SceneKit 開発ライフを!

ContentView.swift


import SwiftUI
import SceneKit

struct ContentView: View { 
    var body: some View {
        SceneView(scene: GameScene())
    }
}

GameScene.swift


import SceneKit

class GameScene: SCNScene {
    override init() {
        super.init()
        
        self.background.contents = UIColor.black

        let testGeo = SCNSphere(radius: 1)
        let testNode = SCNNode(geometry: testGeo)
        testGeo.firstMaterial?.diffuse.contents = UIColor.yellow
        self.rootNode.addChildNode(testNode)

        let cameraNode = SCNNode()
        cameraNode.camera = SCNCamera()
        cameraNode.position = SCNVector3(0, 0, 10)
        self.rootNode.addChildNode(cameraNode)

        let omniLight = SCNNode()
        omniLight.light = SCNLight()
        omniLight.light?.type = .omni
        omniLight.position = SCNVector3(10, 10, 10)
        self.rootNode.addChildNode(omniLight)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

SwiftUIを学ぶのにおすすめの本

SwiftUI 徹底入門

SwiftUIではじめるiPhoneアプリプログラミング入門

iOS/macOS UIフレームワーク SwiftUIプログラミング

コメント

タイトルとURLをコピーしました