質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

970閲覧

swiftuiで作ったボタンでSceneKitでボールを出現させたいです。

marriageblue

総合スコア3

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2022/02/15 12:57

swiftuiで作ったボタンを押すたびにボールが出現する方法を教えていただきたいです。

swift

1 2import SwiftUI 3import SceneKit 4 5struct ContentView: View { 6 @State var flag:Bool = true 7 var body: some View { 8 Button("Button") { 9 flag.toggle() 10 print("\(flag)") 11 } 12 gameview(gameflag: $flag) 13 } 14} 15 16struct gameview:UIViewRepresentable{ 17 @Binding var gameflag:Bool 18 var scene = SCNScene() 19 var scnView = SCNView() 20 var floorNode = SCNNode() 21 typealias UIViewType = SCNView 22 23 func makeUIView(context: Context) -> SCNView{ 24 scnView.backgroundColor = UIColor.black // 背景を黒色に 25 //scnView.allowsCameraControl = true // ユーザーによる視点操作を可能に 26 scnView.scene = scene 27 Omnilight() 28 ambientlight() 29 Camera() 30 FloorNode() 31 if gameflag == true{ 32 generateBall() 33 print("trueninatta") 34 }else{ 35 print("falseninatta") 36 } 37 return scnView 38 } 39 func updateUIView(_ uiView: SCNView, context: Context){ 40 41 } 42 func Omnilight(){ 43 let light = SCNNode() 44 light.light = SCNLight() 45 light.light?.type = .omni 46 light.position = SCNVector3(0,10,35) 47 scene.rootNode.addChildNode(light) 48 } 49 func ambientlight(){ 50 let ambientLightNode = SCNNode() 51 ambientLightNode.light = SCNLight() 52 ambientLightNode.light?.type = .ambient 53 ambientLightNode.light?.color = UIColor.gray 54 scene.rootNode.addChildNode(ambientLightNode) 55 } 56 func Camera(){ 57 let camera = SCNNode() 58 camera.camera = SCNCamera() 59 camera.position = SCNVector3(0,10,35) 60 scene.rootNode.addChildNode(camera) 61 } 62 func FloorNode(){ 63 let floor = SCNFloor() 64 floorNode.geometry = floor 65 floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: .init(geometry: floor)) 66 floorNode.physicsBody?.contactTestBitMask = 1 67 scene.rootNode.addChildNode(floorNode) 68 } 69 func generateBall() { 70 let ball: SCNGeometry = SCNSphere(radius: 0.6) 71 ball.firstMaterial?.diffuse.contents = [UIColor.red, UIColor.blue, UIColor.white].shuffled().first 72 73 let physicsShape = SCNPhysicsShape(geometry: ball, options: nil) 74 75 let ballBody = SCNPhysicsBody(type: .dynamic, shape: nil) 76 ballBody.restitution = 1.0 77 ballBody.physicsShape = physicsShape 78 79 let ballNode = SCNNode(geometry: ball) 80 ballNode.position.x = Float.random(in: -5 ... 5) 81 ballNode.position.y = 20 82 ballNode.physicsBody = ballBody 83 84 scene.rootNode.addChildNode(ballNode) 85 } 86 87} 88

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

updateUIView(_:context:)
SwiftUIからの新しい情報で指定されたビューの状態を更新します。
(略)
アプリの状態が変更されたとき、SwiftUI はそれらの変更によって影響を受けるインターフェイスの部分を更新します。SwiftUI は対応する UIKit のビューに影響を与えるすべての変更に対してこのメソッドを呼び出します。コンテキストパラメータで提供される新しい状態の情報に一致するように、ビューの設定を更新するためにこのメソッドを使用します。
https://developer.apple.com/documentation/swiftui/uiviewrepresentable/updateuiview(_:context:)

updateUIView(_:context:)でビューを更新すれば良いみたいですので、この中でボールを作るメソッドを呼び出してみました。
(makeUIViewの中でもボールを出現させていますので、最初に2つボールが落ちてきます)

落ちているボールに当たると、ボールがそれに合わせて動いて面白いですね。

swift

1import SwiftUI 2import SceneKit 3 4struct ContentView: View { 5 @State var flag:Bool = true 6 var body: some View { 7 Button("Button") { 8 flag.toggle() 9 print("\(flag)") 10 } 11 gameview(gameflag: $flag) 12 } 13} 14 15struct gameview:UIViewRepresentable{ 16 @Binding var gameflag:Bool 17 var scene = SCNScene() 18 var scnView = SCNView() 19 var floorNode = SCNNode() 20 typealias UIViewType = SCNView 21 22 func makeUIView(context: Context) -> SCNView{ 23 scnView.backgroundColor = UIColor.black // 背景を黒色に 24 //scnView.allowsCameraControl = true // ユーザーによる視点操作を可能に 25 scnView.scene = scene 26 Omnilight() 27 ambientlight() 28 Camera() 29 FloorNode() 30 if gameflag == true{ 31 generateBall() 32 print("trueninatta") 33 }else{ 34 print("falseninatta") 35 } 36 return scnView 37 } 38 func updateUIView(_ uiView: SCNView, context: Context){ 39 // ボールを出現させます 40 generateBall() 41 } 42 func Omnilight(){ 43 let light = SCNNode() 44 light.light = SCNLight() 45 light.light?.type = .omni 46 light.position = SCNVector3(0,10,35) 47 scene.rootNode.addChildNode(light) 48 } 49 func ambientlight(){ 50 let ambientLightNode = SCNNode() 51 ambientLightNode.light = SCNLight() 52 ambientLightNode.light?.type = .ambient 53 ambientLightNode.light?.color = UIColor.gray 54 scene.rootNode.addChildNode(ambientLightNode) 55 } 56 func Camera(){ 57 let camera = SCNNode() 58 camera.camera = SCNCamera() 59 camera.position = SCNVector3(0,10,35) 60 scene.rootNode.addChildNode(camera) 61 } 62 func FloorNode(){ 63 let floor = SCNFloor() 64 floorNode.geometry = floor 65 floorNode.physicsBody = SCNPhysicsBody(type: .static, shape: .init(geometry: floor)) 66 floorNode.physicsBody?.contactTestBitMask = 1 67 scene.rootNode.addChildNode(floorNode) 68 } 69 func generateBall() { 70 let ball: SCNGeometry = SCNSphere(radius: 0.6) 71 ball.firstMaterial?.diffuse.contents = [UIColor.red, UIColor.blue, UIColor.white].shuffled().first 72 73 let physicsShape = SCNPhysicsShape(geometry: ball, options: nil) 74 75 let ballBody = SCNPhysicsBody(type: .dynamic, shape: nil) 76 ballBody.restitution = 1.0 77 ballBody.physicsShape = physicsShape 78 79 let ballNode = SCNNode(geometry: ball) 80 ballNode.position.x = Float.random(in: -5 ... 5) 81 ballNode.position.y = 20 82 ballNode.physicsBody = ballBody 83 84 scene.rootNode.addChildNode(ballNode) 85 } 86 87}

投稿2022/02/22 14:49

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marriageblue

2022/02/25 17:41

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問