見出し画像

iOSアプリ開発5日目〜その3〜

ARKitを用いたARアプリ開発の続き。今回は、3Dオブジェクトにタッチしたら色が変わる仕組みを実装する。

前回のメモはこちら。


BoxARのコードに、タッチを検出してオブジェクトの色を変える記述を追加していく方法で実装していく。


まずは、BoxARのコード

スクリーンショット 2020-05-14 18.56.55

シーンを作ってそこにボックスを配置した。


タッチを検出しボックスの色を変更するコードを追記

スクリーンショット 2020-05-14 19.11.51

今回のミソ▶︎▶︎▶︎ Objective-Cの関数を使用する!!


それでは、追加した記述をひとつずつ見ていきます。

・42行目:ARKitに実装されているUITapGestureRecognizerクラスを使う

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapped))

・43行目:tapRecognizerをシーンに追加

self.sceneView.addGestureRecognizer(tapRecognizer)


・49行目:Objective-Cの関数を使うため、funcでtappedを定義する

@objc func tapped(recognizer: UIGestureRecognizer){

・50行目:タップされたオブジェクトのシーンを取得

let sceneView = recognizer.view as! SCNView

・51行目:シーンビューの中でタッチされた座標を返すための定数を定義

let touchLocation = recognizer.location(in:sceneView)

・52行目:タッチしたデータを返す hitTestの引数はタッチされた座標と、オプションは:でナシを設定する

let hitResults = sceneView.hitTest(touchLocation, options: [:])

・54行目:もしも、タッチしたデータがあれば((もしも空でなければ)isEmptyは空を返すので、それを否定する!を先頭につける)

if !hitResults.isEmpty{

・55行目:ノードという定数にhitResultsのタッチした値、先頭の値を定義する

let node = hitResults[0].node

・56行目:マテリアルを定義する。ジオメトリーはオプショナル型(変数にnilの代入を許す型)のため、変数の後ろに?を入力

let material = node.geometry?.material(named: "Color")

・57行目:マテリアルをオプショナル型に変換し、UIColorをブルーに設定

material?.diffuse.contents = UIColor.blue



実行すると、目の前に赤いボックスが配置されている。

画像3

これをタッチすると、青色に変わった。

画像4



<今回出てきたキーワード>

Swiftでは、基本的にnilを扱うことはできない。しかし、変数の型をオプショナル型に変換することで、nilを扱うことができるようになる。

オプショナル型・・・データ型の一つ。オプショナル型とは変数にnilの代入を許容するデータ型で、反対に非オプショナル型はnilを代入できない。オプショナル型の変数にはデータ型の最後に「?」か「!」をつける。

アンラップ・・・オプショナル型で指定された変数は、Optional()というサランラップのようなもので包まれるため、オプショナル型と非オプショナル型を演算しようとしたら、エラーをはく。そのため、オプショナル型のラップを剥がす(通常の値に変換する)というアンラップが必要になる。



オプショナル型などの詳しい説明は以下の記事を参照した。


よろしければサポートお願いします。いただいたサポートを皆さんに還元していきたいと思っております。