{"id":7606,"date":"2021-02-22T09:13:16","date_gmt":"2021-02-22T00:13:16","guid":{"rendered":"https:\/\/www.ecomottblog.com\/?p=7606"},"modified":"2021-02-22T09:27:02","modified_gmt":"2021-02-22T00:27:02","slug":"arkit4%e3%81%a8swiftui%e3%82%92%e7%b5%84%e3%81%bf%e5%90%88%e3%82%8f%e3%81%9b%e3%81%9f%e6%8b%a1%e5%bc%b5%e7%8f%be%e5%ae%9f%ef%bc%88ar%ef%bc%89%e4%bd%93%e9%a8%93","status":"publish","type":"post","link":"https:\/\/test.ecomottblog.com\/?p=7606","title":{"rendered":"ARKit4\u3068SwiftUI\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u62e1\u5f35\u73fe\u5b9f\uff08AR\uff09\u4f53\u9a13"},"content":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\uff01<br \/>\n\u88fd\u54c1\u958b\u767a\u90e8\u306e\u5f35\u671d\u7a0b\u3067\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-7669 alignright\" src=\"https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/SwiftUIArKit-300x162.jpeg\" alt=\"\" width=\"300\" height=\"162\" srcset=\"https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/SwiftUIArKit-300x162.jpeg 300w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/SwiftUIArKit-304x164.jpeg 304w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/SwiftUIArKit-282x152.jpeg 282w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/SwiftUIArKit.jpeg 310w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u6700\u8fd1\u3001Apple\u793e\u306e\u6700\u65b0UI\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30afSwiftUI\u3092\u5b66\u7fd2\u3057\u3066iOS\u30a2\u30d7\u30ea\u306e\u958b\u767a\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002SwiftUI\u3092\u5b9f\u969b\u306b\u4f53\u9a13\u3057\u3001\u77ed\u6642\u9593\u3067Apple\u3063\u307d\u3044iOS\u30a2\u30d7\u30ea\u3092\u4f5c\u308c\u308b\u305f\u3081\u3001\u975e\u5e38\u306b\u4fbf\u5229\u3060\u3068\u611f\u3058\u307e\u3057\u305f\u3002<\/p>\n<p>\u3057\u304b\u3057\u30012019\u5e74\u8a95\u751f\u306eSwiftUI\u306f\u3001Swift\u304c\u63d0\u4f9b\u3059\u308b\u5168\u3066\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3084\u6a5f\u80fd\u306b\u306f\u5bfe\u5fdc\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u3002\u4f8b\u3048\u3070\u3001Apple\u793e\u304c\u516c\u8868\u3057\u3066\u3044\u308bAR\u95a2\u9023\u306e<a href=\"https:\/\/developer.apple.com\/documentation\/arkit\/visualizing_a_point_cloud_using_scene_depth\">\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9<\/a>\u306eUI\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306f\u3001SwiftUI\u3092\u4f7f\u308f\u305a\u3001\u5f93\u6765\u306eUIKit\u3092\u63a1\u7528\u3057\u3066\u3044\u307e\u3059\u3002SwiftUI\u57fa\u76e4\u306e\u30a2\u30d7\u30ea\u306b\u8907\u96d1\u306a\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u305f\u3044\u5834\u5408\u3001SwiftUI\u3068UIKit\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>SwiftUI\u3068UIKit\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001\u6700\u3082\u7406\u89e3\u3057\u3084\u3059\u3044\u4f8b\u306f\u3001<a href=\"https:\/\/www.hackingwithswift.com\/books\/ios-swiftui\/wrapping-a-uiviewcontroller-in-a-swiftui-view\">Hacking with Swift\u306ePaul Hudson\u3055\u3093\u306e\u8a18\u4e8b<\/a>\u3060\u3068\u601d\u3044\u307e\u3059\u3002\u3053\u306e\u8a18\u4e8b\u306e\u304a\u304b\u3052\u3067\u3001\u7aef\u672b\u306e\u5199\u771f\u30e9\u30a4\u30d6\u30e9\u30ea\u304b\u3089\u753b\u50cf\u3092\u53d6\u5f97\u3059\u308b\u624b\u6cd5\u3092\u5b66\u3093\u3067\u3001UIKit\u306eUIViewController\u3092SwiftUI\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u65b9\u6cd5\u3082\u7406\u89e3\u3067\u304d\u307e\u3057\u305f\u3002\u30cd\u30c3\u30c8\u4e0a\u306e\u60c5\u5831\u30b5\u30a4\u30c8\u306b\u306f\u7aef\u672b\u5185\u306b\u3042\u308b\u753b\u50cf\u3092\u53d6\u5f97\u3059\u308b\u4f8b\u304c\u307b\u3068\u3093\u3069\u306e\u305f\u3081\u3001\u4eca\u56de\u306fMTKView\u306eUIViewController\u3092SwiftUI\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u65b9\u6cd5\u3092\u8a18\u8f09\u3057\u307e\u3059\u3002<br \/>\n<!--more--><br \/>\nHudson\u3055\u3093\u306e\u8a18\u4e8b\u306b\u3068\u308b\u3068\u3001SwiftUI\u3068UIKit\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u524d\u306b\u3001\u4e8b\u524d\u306b\u5fc5\u8981\u306aUIKit\u306e\u77e5\u8b58\u306f\u4ee5\u4e0b\u306e\u4e09\u70b9\u3067\u3059\u3002<\/p>\n<ol>\n<li>UIKit\u306b\u306f\u3001<span class=\"lang:default decode:true crayon-inline \">UIView<\/span>&nbsp;\u30af\u30e9\u30b9\u304c\u3042\u308a\u3001\u30e9\u30d9\u30eb<span class=\"lang:default decode:true crayon-inline \">UILabel<\/span>&nbsp;\u3084\u30dc\u30bf\u30f3<span class=\"lang:default decode:true crayon-inline \">UIButton<\/span>&nbsp;\u3001\u30b9\u30e9\u30a4\u30c0\u30fc<span class=\"lang:default decode:true crayon-inline \">UISlider<\/span>&nbsp;\u306a\u3069\u306eView\u306b\u7d99\u627f\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/li>\n<li>UIKit\u306b\u306f\u3001UIView\u306e\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u3092\u5236\u5fa1\u3059\u308b<span class=\"lang:default decode:true crayon-inline \">UIViewController<\/span>&nbsp;\u30af\u30e9\u30b9\u304c\u3042\u308a\u307e\u3059\u3002<\/li>\n<li>UIKit\u306b\u306f\u3001delegation\u3068\u3044\u3046design pattern\u304c\u3042\u308a\u307e\u3059\u3002delegation\u306f\u3001\u306a\u3093\u306e\u51e6\u7406\u3092\u8ab0\u306b\u547c\u3070\u305b\u308b\u306e\u304b\u3092\u6c7a\u3081\u308b\u5f79\u5272\u3092\u6301\u3061\u307e\u3059\u3002<\/li>\n<\/ol>\n<p>SwiftUI\u306e\u8a71\u306b\u623b\u308a\u307e\u3059\u3002SwiftUI\u306b\u306f\u3001\u4e00\u822c\u7684\u306aMVC\u30e2\u30c7\u30eb\u3067\u306f\u306a\u304f\u3001<a href=\"https:\/\/www.hackingwithswift.com\/example-code\/language\/what-is-mvvm\">Model-View-ViewModel<\/a> (MVVM\u3001\u30e2\u30c7\u30eb\u30fb\u30d3\u30e5\u30fc\u30fb\u30d3\u30e5\u30fc\u30e2\u30c7\u30eb) \u304c\u63a1\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002UIView\u3068UIViewController\u306f\u3001SwiftUI\u306eMVVM\u30e2\u30c7\u30eb\u306eView\u30ec\u30a4\u30e4\u3068\u307f\u306a\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u3001SwiftUI\u3068UIKit\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u7c21\u5358\u306a\u30a2\u30d7\u30ea\u3092\u4f5c\u6210\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<h2>1. \u958b\u767a\u74b0\u5883<\/h2>\n<p>iOS :\u300014.3<br \/>\nXcode :\u300012.3<br \/>\n\u7aef\u672b:\u300011-inch iPad Pro<br \/>\n\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9:&nbsp;&nbsp;<a href=\"https:\/\/developer.apple.com\/documentation\/arkit\/visualizing_a_point_cloud_using_scene_depth\">Visualizing a Point Cloud Using Scene Depth<\/a><\/p>\n<h2>2. \u753b\u9762<\/h2>\n<ul>\n<li>Home\u753b\u9762<\/li>\n<li>AR\u30ab\u30e1\u30e9\u753b\u9762<\/li>\n<\/ul>\n<h2>3. &nbsp;\u5229\u7528\u30e9\u30a4\u30d6\u30e9\u30ea\uff08SwiftUI\u3068\u304b\u304b\u308f\u308b\u5bfe\u8c61\u306e\u307f\uff09<\/h2>\n<ul>\n<li>SwiftUI\n<ul>\n<li>protocol <strong>View&nbsp;<\/strong>\n<ul>\n<li>ContentView<\/li>\n<li>HomeView<\/li>\n<li>ARView<\/li>\n<\/ul>\n<\/li>\n<li>protocol&nbsp;<strong>UIViewControllweResentable<\/strong>\n<ul>\n<li>ARViewContainer<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>UIKit\n<ul>\n<li>controller\n<ul>\n<li>class <strong>ARViewController<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>delegate\n<ul>\n<li>protocol <strong>ARSessionDelegate<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>view\n<ul>\n<li>class <strong>MTKView<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>4. \u30d5\u30a1\u30a4\u30eb\u69cb\u9020<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-7607\" src=\"https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/project-186x300.png\" alt=\"\" width=\"186\" height=\"300\" srcset=\"https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/project-186x300.png 186w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/project-133x214.png 133w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/project-161x260.png 161w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/project.png 267w\" sizes=\"(max-width: 186px) 100vw, 186px\" \/><\/p>\n<h2>5. \u5b9f\u88c5\u624b\u9806<\/h2>\n<h3>5.1 \u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/h3>\n<p>Apple\u793e<a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2020\/10611\/\">WWDC20\u3067\u516c\u8868\u3057\u305fARKit 4<\/a>\u306e\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9<a href=\"https:\/\/developer.apple.com\/documentation\/arkit\/visualizing_a_point_cloud_using_scene_depth\">Visualizing a Point Cloud Using Scene Depth<\/a>\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057Xcode\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u958b\u3044\u3066\u3001AppDelegate.swift\u306e\u5185\u5bb9\u3092SwiftUI\u306e\u5f62\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"theme:xcode lang:default decode:true\">@main\nstruct Sample: App { \n    var body: some Scene {\n        WindowGroup{\n           ContentView()\n        }\n    }\n}<\/pre>\n<p>UIKit\u306e<span class=\"lang:default decode:true crayon-inline \">@UIApplicationMain<\/span>&nbsp;\u3088\u308a\u3001SwiftUI\u306e<span class=\"lang:default decode:true crayon-inline \">@main<\/span>&nbsp;\u306e\u30b3\u30fc\u30c9\u91cf\u304c\u9a5a\u304f\u307b\u3069\u5c11\u306a\u3044\u3067\u3059\u306d\u3002<\/p>\n<h3>5.2 HomeView\u3068ARView\u3092\u751f\u6210<\/h3>\n<p>\u307e\u305a\u3001HomeView\u3068ARView\u306ebody\u306b<span class=\"lang:swift decode:true crayon-inline\">Text(&#8220;Hello AR world!&#8221;)<\/span>\u3092\u5165\u308c\u307e\u3059\u3002<\/p>\n<h3>5.3 ContentView\u3092\u751f\u6210<\/h3>\n<p>HomeView\u3068ARView\u3092TabView \u3067\u753b\u9762\u3092\u5207\u308a\u66ff\u3048\u308bSwiftUI\u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"theme:xcode lang:swift decode:true\">struct ContentView: View {\n    var body: some View {\n        TabView () {\n            HomeView().tabItem {\n                Image(systemName: \"list.bullet\")\n                Text(\"\u30db\u30fc\u30e0\")\n            }\n            ARView().tabItem {\n                Image(systemName: \"arkit\")\n                Text(\"AR\u30ab\u30e1\u30e9\")\n            }\n        }.font(.headline)\n    }\n}<\/pre>\n<p>\u3053\u3093\u306a\u611f\u3058\u3067\u3059\u306d\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-7608\" src=\"https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/home-300x210.png\" alt=\"\" width=\"373\" height=\"261\" srcset=\"https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/home-300x210.png 300w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/home-768x536.png 768w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/home-1024x715.png 1024w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/home-304x212.png 304w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/home-282x197.png 282w\" sizes=\"(max-width: 373px) 100vw, 373px\" \/><\/p>\n<h3>5.4 ARView\u3092\u7de8\u96c6<\/h3>\n<h4>5.4.1 ARViewContainer<\/h4>\n<p>UIKit\u306eView controll\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u305f\u3081\u306b\u3001\u307e\u305aprotocol <span class=\"lang:default decode:true crayon-inline \">UIViewControllerRepresentable<\/span>&nbsp;\u304c\u30a4\u30f3\u30d7\u30ea\u30e1\u30f3\u30c8\u3055\u308c\u308bstruct <span class=\"lang:default decode:true crayon-inline \">ARViewContainer<\/span>&nbsp;\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<p><span class=\"lang:default decode:true crayon-inline \">UIViewControllerRepresentable<\/span>&nbsp;\u3092<span class=\"lang:default decode:true crayon-inline \">ARViewContainer<\/span>&nbsp;\u306b\u30a4\u30f3\u30d7\u30ea\u30e1\u30f3\u30c8\u3059\u308b\u306b\u306f\u3001\u4e8c\u3064\u306e\u30e1\u30bd\u30c3\u30c9\u306e\u5b9f\u88c5\u304c\u5fc5\u8981\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<ul>\n<li><span class=\"lang:default decode:true crayon-inline \">makeUIViewController()<\/span>&nbsp;\uff1aView controller\u306einitail\u3059\u308b\u5f79\u5272\u3092\u6301\u3061\u3001ARViewController\u3092return\u3057\u307e\u3059\u3002<\/li>\n<li><span class=\"lang:default decode:true crayon-inline \">updateUIViewController()<\/span>&nbsp;\uff1aSwiftUI\u306e\u72b6\u614b\u304c\u5909\u308f\u308b\u969b\u3001View controller\u3092\u66f4\u65b0\u3059\u308b\u5f79\u5272<\/li>\n<\/ul>\n<p>\u30e1\u30bd\u30c3\u30c9\u306e\u5b9f\u88c5\u65b9\u6cd5\u306b\u3064\u3044\u3066\u3001<span class=\"lang:default decode:true crayon-inline \">UIViewControllerRepresentable<\/span>&nbsp;\u3092\u30a4\u30f3\u30d7\u30ea\u30e1\u30f3\u30c8\u3059\u308b\u3068\u3001Xcode\u306b\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30af\u30ea\u30c3\u30af\u3057fix\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001Xcode\u304c\u4e8c\u3064\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u5165\u308c\u3066\u304f\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"theme:xcode lang:swift decode:true \">struct ARViewContainer: UIViewControllerRepresentable {\n    func makeUIViewController(context: Context) -&gt; ARViewController {\n        return ARViewController()\n    }\n    func updateUIViewController(_ uiViewController: ARViewController, context: Context) {\n    }\n}<\/pre>\n<h4>5.4.2 ARView<\/h4>\n<p>\u6b21\u306b\u3001ARViewContainer\u3092ARView\u306ebody\u306b\u5165\u308c\u307e\u3059\u3002<\/p>\n<pre class=\"theme:xcode lang:swift decode:true\">struct ARView: View { \n    var body: some View {\n        ARViewContainer()\n    }\n}<\/pre>\n<h3>5.5 ARViewController\u3092\u7de8\u96c6<\/h3>\n<p>\u3053\u3053\u307e\u3067\u3001SwifyUI\u5074\u306e\u5b9f\u88c5\u306f\u5b8c\u4e86\u3067\u3059\u3002UIKit\u306e\u4e16\u754c\u306b\u5165\u308a\u307e\u3057\u3087\u3046\u3002<\/p>\n<div>\n<div>\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u3092\u307f\u3066\u5206\u304b\u3063\u305f\u3053\u3068\uff1a<\/div>\n<ul>\n<li>1. class <span class=\"lang:default decode:true crayon-inline \">ARViewController<\/span>&nbsp;\u306f\u3059\u3067\u306b<span class=\"lang:default decode:true crayon-inline \">UIViewController<\/span>&nbsp;\u3068<span class=\"lang:default decode:true crayon-inline \">ARSessionDelegate<\/span>&nbsp;\u304c\u30a4\u30f3\u30d7\u30ea\u30e1\u30f3\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3064\u307e\u308a\u3001<span class=\"lang:default decode:true crayon-inline \">ARViewController<\/span>&nbsp;\u306eview\u30d7\u30ed\u30d1\u30c6\u30a3\u306evalue\u306fUIView\u3060\u3068\u5206\u304b\u308a\u307e\u3057\u305f\u3002<\/li>\n<li>2. <span class=\"lang:default decode:true crayon-inline \">ARViewController<\/span>&nbsp;\u306e\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u306e\u95a2\u6570\u306f\u3001<span class=\"lang:default decode:true crayon-inline \">viewDidLoad()<\/span>&nbsp;\u3068<span class=\"lang:default decode:true crayon-inline \">viewWillAppear()<\/span>&nbsp;\u3057\u304b\u306a\u3044\u3067\u3059\u3002\n<ul>\n<li>2.1 viewDidLoad()\u5185\u306e\u51e6\u7406\n<ul>\n<li>\u81ea\u5206\u81ea\u8eab(self)\u3092ARSession\u306b\u51e6\u7406\u3092\u4f9d\u983c\uff08delegate\uff09\u3057\u307e\u3059\u3002<\/li>\n<li>\u81ea\u5206\u81ea\u8eab(self)\u3092MTKView\u306b\u51e6\u7406\u3092\u4f9d\u983c\uff08delegate\uff09\u3057\u307e\u3059\u3002\u305d\u3046\u3059\u308b\u3068\u3001view\u30d7\u30ed\u30d1\u30c6\u30a3\u3092UIView\u304b\u3089MTKView\u306b\u306a\u308a\u307e\u3059\u3002<\/li>\n<li>\u63cf\u753b\u30af\u30e9\u30b9Renderer\u3092\u521d\u671f\u5316<\/li>\n<li>\u30ab\u30e1\u30e9\u753b\u9762\u306bUI\u306e\u914d\u7f6e<\/li>\n<\/ul>\n<\/li>\n<li>2.2 viewWillAppear()\u5185\u306e\u51e6\u7406\n<ul>\n<li>AR\u306econfiguration\u3092\u5b9f\u884c\uff08run\uff09\u3057\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u554f\u984c\u306a\u3055\u305d\u3046\u3067\u3059\u306d\u3001\u5b9f\u969b\u306b\u30a2\u30d7\u30ea\u3092\u5b9f\u884c\u3057\u3066\u307f\u3066\u3001\u30a2\u30d7\u30ea\u4e0b\u90e8\u306e\u30ab\u30e1\u30e9\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u6012\u3089\u308c\u307e\u3057\u305f\u3002<\/p>\n<p><span class=\"theme:xcode lang:default decode:true crayon-inline\">Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file Point_Cloud\/ARViewController.swift, line 53<\/span><\/p>\n<div>ARViewController.swift\u306eline 53\u306f\u3001<span class=\"lang:default decode:true crayon-inline \">viewDidLoad()<\/span>&nbsp;\u5185\u306e\u51e6\u7406\u3060\u3068\u308f\u304b\u308a\u307e\u3057\u305f\u3002\u8abf\u67fb\u3057\u3066\u307f\u308b\u3068\u3001\u30a8\u30e9\u30fc\u306e\u539f\u56e0\u306f\u3001<span class=\"lang:default decode:true crayon-inline \">viewDidLoad()<\/span>&nbsp;\u5185\u306e\u63cf\u753b\u30af\u30e9\u30b9<span class=\"lang:default decode:true crayon-inline \">Renderer<\/span>&nbsp;\u306f\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u306a\u304f\u3066\u3001nil\u5024\u304c<span class=\"lang:default decode:true crayon-inline \">renderer<\/span>&nbsp;\u30d7\u30ed\u30d1\u30c6\u30a3\u306b\u4ee3\u5165\u3055\u308c\u3066\u3057\u307e\u3063\u305f\u3053\u3068\u3067\u3059\u3002<\/div>\n<p>\u5177\u4f53\u7684\u306b\u8aac\u660e\u3059\u308b\u3068\u3001<span class=\"lang:default decode:true crayon-inline \">viewDidLoad()<\/span>&nbsp;\u5185\u306e<span class=\"lang:default decode:true crayon-inline\">if let view = view as? MTKView { Renderer\u3092\u521d\u671f\u5316\u3059\u308b\u51e6\u7406\u306a\u3069 }<\/span>&nbsp;\u306f\u3001if\u6587\u306b\u5165\u3089\u305a\u306b\u51e6\u7406\u304c\u7d9a\u3044\u3066\u3057\u307e\u3044\u3001<span class=\"lang:default decode:true crayon-inline \">ARViewController<\/span>&nbsp;\u306eview\u30d7\u30ed\u30d1\u30c6\u30a3\u304cUIView\u306e\u307e\u307e\u3067\u3057\u305f\u3002<\/p>\n<\/div>\n<p>UIView\u304b\u3089MTKView\u306b\u5909\u63db\u3067\u304d\u306a\u304b\u3063\u305f\u7406\u7531\u304c\u308f\u304b\u3089\u305a\u3001\u8ae6\u3081\u305f\u3044\u307b\u3069\u30cf\u30de\u308a\u307e\u3057\u305f\u3002\u3053\u306e\u554f\u984c\u3092\u89e3\u6c7a\u3059\u308b\u306b\u306f\u3001UIViewController\u306eview\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u306b\u3064\u3044\u3066\u6df1\u304f\u8abf\u3079\u307e\u3057\u305f\u3002<\/p>\n<p>\u4e00\u822c\u7684\u306b\u3001UIViewController\u306eview\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u306f\u3001<span class=\"theme:xcode lang:default decode:true crayon-inline\">\u3007 &gt; loadView &gt; viewDidLoad &gt; viewWillAppear &gt; viewDidAppear &gt; viewWillDisapper &gt;&amp;nbsp;viewDidDisapper &gt; \u25ce<\/span>&nbsp;\u3067\u3059\u3002<\/p>\n<p>\u4e00\u65b9\u3001<span class=\"lang:default decode:true crayon-inline \">ARViewController<\/span>&nbsp;\u306e\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u306b\u95a2\u3059\u308b\u30e1\u30bd\u30c3\u30c9\u306f\u3001<span class=\"lang:default decode:true crayon-inline\">viewDidLoad()<\/span>&nbsp;\u3068 <span class=\"lang:default decode:true crayon-inline \">viewWillAppear()<\/span>&nbsp;\u3057\u304b\u306a\u3044\u3067\u3059\u3002\u306a\u305c\u304b\u3068\u3044\u3046\u3068\u3001\u66f8\u304b\u306a\u304f\u3066\u3082<span class=\"lang:default decode:true crayon-inline \">ARViewController<\/span>&nbsp;\u306e\u89aa\u30af\u30e9\u30b9\u306f\u305d\u308c\u3089\u3092\u5b9f\u884c\u3057\u3066\u304f\u308c\u307e\u3059\u3002<\/p>\n<div>\u4ee5\u4e0a\u306e\u8abf\u67fb\u3092\u3082\u3068\u306b\u3001<span class=\"lang:default decode:true crayon-inline \">ARViewController<\/span>&nbsp;\u306eview\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u6b63\u3057\u3044\u7b87\u6240\u306b\u8a2d\u5b9a\u3059\u308c\u3070\u3001\u554f\u984c\u3092\u89e3\u6d88\u3067\u304d\u308b\u3068\u8003\u3048\u307e\u3059\u3002\u3082\u3063\u3068\u8abf\u3079\u3066\u307f\u305f\u3089\u3001<span class=\"lang:default decode:true crayon-inline \">loadView()<\/span>&nbsp;\u3092override\u3059\u308c\u308c\u3070\u3001\u3046\u307e\u304fview\u30d7\u30ed\u30d1\u30c6\u30a3\u306bMTKView\u306b\u4ee3\u5165\u3067\u304d\u308b\u3067\u3057\u3087\u3046\u3002<\/div>\n<p>\u4ee5\u4e0b\u306e\u51e6\u7406\u3092class&nbsp;ARViewController\u306b\u5165\u308c\u3066\u307f\u307e\u3059\u3002<\/p>\n<div>\n<pre class=\"theme:xcode lang:swift decode:true\">override func loadView() {\n    super.loadView()\n    self.view = MTKView(frame: .zero)\n}<\/pre>\n<p>class\u56f3\u304b\u3089\u898b\u308b\u3068<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-7613\" src=\"https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/ARViewControllerUML-1-240x300.jpg\" alt=\"\" width=\"240\" height=\"300\" srcset=\"https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML-1-240x300.jpg 240w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML-1-171x214.jpg 171w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML-1-208x260.jpg 208w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML-1.jpg 286w\" sizes=\"(max-width: 240px) 100vw, 240px\" \/><\/p>\n<p>\u2193<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-7615\" src=\"https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/ARViewControllerUML2-1-219x300.jpg\" alt=\"\" width=\"219\" height=\"300\" srcset=\"https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML2-1-219x300.jpg 219w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML2-1-157x214.jpg 157w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML2-1-190x260.jpg 190w, https:\/\/test.ecomottblog.com\/wp-content\/uploads\/2021\/02\/ARViewControllerUML2-1.jpg 286w\" sizes=\"(max-width: 219px) 100vw, 219px\" \/><\/p>\n<p>\u3068\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\n<\/div>\n<p>\u3082\u3046\u4e00\u5ea6\u30a2\u30d7\u30ea\u3092\u5b9f\u884c\u3057\u3066\u307f\u308b\u3068\u3001\u3046\u307e\u304fSwiftUI\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u4f7f\u3063\u3066Apple\u793e\u306eAR\u30a2\u30d7\u30ea\u3092\u958b\u304d\u307e\u3057\u305f\u306d\u3002<\/p>\n<h2>6. \u5b9f\u6f14<\/h2>\n<p>\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u306e\u63cf\u753b\u30af\u30e9\u30b9<span class=\"lang:default decode:true crayon-inline \">Renderer<\/span>&nbsp;\u306e<span class=\"lang:default decode:true crayon-inline \">numGridPoints <\/span>&nbsp;\u3068<span class=\"lang:default decode:true crayon-inline \">particlaSize<\/span>&nbsp;\u30d7\u30ed\u30d1\u30c6\u30a3\u3092\u5fae\u8abf\u6574\u3057\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"theme:xcode lang:default decode:true \">private let numGridPoints = 5000\nprivate let particleSize: Float = 3<\/pre>\n<p>\u305d\u3046\u3059\u308b\u3068\u3001AR\u30ab\u30e1\u30e9\u753b\u9762\u306b\u63cf\u753b\u3055\u308c\u308b\u70b9\u7fa4\u306e\u6570\u304c\u591a\u304f\u306a\u308a\u3001\u70b9\u306e\u5927\u304d\u3055\u304c\u5c0f\u3055\u304f\u306a\u308a\u307e\u3059\u3002<\/p>\n<div style=\"width: 1920px;\" class=\"wp-video\"><!--[if lt IE 9]><script>document.createElement('video');<\/script><![endif]-->\n<video class=\"wp-video-shortcode\" id=\"video-7606-1\" width=\"1920\" height=\"1342\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/ARApp_30mb.mp4?_=1\" \/><a href=\"https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/ARApp_30mb.mp4\">https:\/\/www.ecomottblog.com\/cmswp\/wp-content\/uploads\/2021\/02\/ARApp_30mb.mp4<\/a><\/video><\/div>\n<h2>7. \u611f\u60f3<\/h2>\n<p>iOS\u958b\u767a\u306b\u95a2\u3057\u3066\u5438\u53ce\u3057\u305f\u3044\u77e5\u8b58\u306f\u5c71\u307b\u3069\u3042\u308a\u307e\u3059\u3002\u4eca\u56de\u306e\u8a18\u4e8b\u3092\u5951\u6a5f\u306b\u3001SwiftUI\u3092\u4f7f\u3063\u3066Apple\u793e\u3063\u307d\u3044\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u3066\u3001\u9054\u6210\u611f\u3092\u5473\u308f\u3044\u307e\u3057\u305f\u3002<\/p>\n<p>Apple\u793e\u306eARKit\u306f\u3001\u4e16\u754c\u6700\u5927\u306eAR\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u9593\u9055\u3044\u306a\u3044\u3067\u3059\u30022020\u306b\u767a\u58f2\u3055\u308c\u305fiPhone 12 Pro\u3001iPad Pro\u306b\u306f\u3001\u3059\u3067\u306b\u9ad8\u5ea6\u306aAR\u3092\u5b9f\u73fe\u3059\u308bLiDAR\u304c\u642d\u8f09\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u306e\u6a5f\u80fd\u3068\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u306e\u6a5f\u80fd\u3092\u6d3b\u7528\u3057\u305f\u3089\u3001\u624b\u8efd\u306bAR\u4f53\u9a13\u3067\u304d\u308b\u3057\u30013D\u30b9\u30ad\u30e3\u30f3\u306e\u5206\u91ce\u306b\u3082\u5c0e\u5165\u3067\u304d\u308b\u3067\u3057\u3087\u3046\u3002\u4eca\u5e74\u306eWWDC\u306b\u3001\u3069\u3093\u306a\u65b0\u88fd\u54c1\u3068\u30b5\u30fc\u30d3\u30b9\u304c\u516c\u8868\u3059\u308b\u306e\u304b\u3001\u3068\u3066\u3082\u697d\u3057\u307f\u3067\u3059\u306d\u3002<\/p>\n<h2>\u53c2\u8003\u8cc7\u6599<\/h2>\n<div>\n<p>Wrapping a UIViewController in a SwiftUI view<br \/>\n<a href=\"https:\/\/www.hackingwithswift.com\/books\/ios-swiftui\/wrapping-a-uiviewcontroller-in-a-swiftui-view\">https:\/\/www.hackingwithswift.com\/books\/ios-swiftui\/wrapping-a-uiviewcontroller-in-a-swiftui-view<\/a><\/p>\n<p>Explore ARKit 4<br \/>\n<a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2020\/10611\/\">https:\/\/developer.apple.com\/videos\/play\/wwdc2020\/10611\/<\/a><\/p>\n<p>Visualizing a Point Cloud Using Scene Depth<br \/>\n<a href=\"https:\/\/developer.apple.com\/documentation\/arkit\/visualizing_a_point_cloud_using_scene_depth\">https:\/\/developer.apple.com\/documentation\/arkit\/visualizing_a_point_cloud_using_scene_depth<\/a><\/p>\n<p>What is MVVM?<br \/>\n<a href=\"https:\/\/www.hackingwithswift.com\/example-code\/language\/what-is-mvvm\">https:\/\/www.hackingwithswift.com\/example-code\/language\/what-is-mvvm<\/a><\/p>\n<p class=\"\">UIKit\u306eView\u8868\u793a\u30e9\u30a4\u30d5\u30b5\u30a4\u30af\u30eb\u3092\u7406\u89e3\u3059\u308b<br \/>\n<a href=\"https:\/\/qiita.com\/shtnkgm\/items\/f133f73baaa71172efb2\">https:\/\/qiita.com\/shtnkgm\/items\/f133f73baaa71172efb2<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\uff01 \u88fd\u54c1\u958b\u767a\u90e8\u306e\u5f35\u671d\u7a0b\u3067\u3059\u3002 \u6700\u8fd1\u3001Apple\u793e\u306e\u6700\u65b0UI\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30afSwiftUI\u3092\u5b66\u7fd2\u3057\u3066iOS\u30a2\u30d7\u30ea\u306e\u958b\u767a\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002SwiftUI\u3092\u5b9f\u969b\u306b\u4f53\u9a13\u3057\u3001\u77ed\u6642\u9593\u3067Apple\u3063\u307d\u3044iOS\u30a2\u30d7\u30ea\u3092\u4f5c\u308c\u308b\u305f\u3081\u3001 [&hellip;]<\/p>\n","protected":false},"author":89,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[102,103,100,101,104],"_links":{"self":[{"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts\/7606"}],"collection":[{"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/users\/89"}],"replies":[{"embeddable":true,"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7606"}],"version-history":[{"count":18,"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts\/7606\/revisions"}],"predecessor-version":[{"id":7670,"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=\/wp\/v2\/posts\/7606\/revisions\/7670"}],"wp:attachment":[{"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7606"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7606"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/test.ecomottblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7606"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}