Slide 1

Slide 1 text

Nreal Light/Air開発⼊⾨

Slide 2

Slide 2 text

⾃⼰紹介 ⽒名︓吉永崇(Takashi Yoshinaga) 専⾨︓ARを⽤いた医療⽀援や運動計測 Volumetric Video (3Dビデオ) コミュニティ︓ARコンテンツ作成勉強会 主催

Slide 3

Slide 3 text

ARコンテンツ作成勉強会の紹介 p 2013年5⽉に勉強会をスタート。 p ARコンテンツの作り⽅をハンズオン形式で学ぶ p ⼈数は5~10名程度の少⼈数で実施 p 参加条件はAR/VRに興味がある⼈(知識不要) p 各地で開催 (福岡、熊本、宮崎、⻑崎、⼤分、 ⿅児島、⼭⼝、広島、札幌、関東)

Slide 4

Slide 4 text

Twitterと勉強会ページで情報を発信しています @AR_Fukuoka Googleで「AR勉強会」で検索

Slide 5

Slide 5 text

#AR_Fukuoka #nreal ハッシュタグ

Slide 6

Slide 6 text

今⽇の内容 Nreal Light / Airのコントローラを使った コンテンツ開発の基本⼿順を解説

Slide 7

Slide 7 text

今⽇のゴール https://youtu.be/uyxVuTEpdJw

Slide 8

Slide 8 text

演習⽤素材のダウンロード https://github.com/TakashiYoshinaga/AR- Fukuoka/raw/main/20220429_Nreal3DoF/Samples.zip

Slide 9

Slide 9 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 10

Slide 10 text

ハンズオン⼿順 オブジェクト 配置 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 11

Slide 11 text

ハンズオン⼿順 エミュレータ 実機 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 12

Slide 12 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 13

Slide 13 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 14

Slide 14 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 15

Slide 15 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作 リセットボタン

Slide 16

Slide 16 text

ハンズオンスタート

Slide 17

Slide 17 text

ハンズオン⼿順 オブジェクト 配置 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 18

Slide 18 text

Unity Hub起動 Unity Hub

Slide 19

Slide 19 text

プロジェクトの作成 (1/6) ①Projects ②NewProject

Slide 20

Slide 20 text

プロジェクトの作成 (2/6) EditorVersionを開く

Slide 21

Slide 21 text

プロジェクトの作成 (3/6) 2020.3.xxf1 この資料は2020.3.xを前提に解説をしています

Slide 22

Slide 22 text

プロジェクトの作成 (4/6) ①3D ②Project name ③保存場所

Slide 23

Slide 23 text

プロジェクトの作成 (5/6) Create project

Slide 24

Slide 24 text

プロジェクトの作成 (6/6) Unity Editorが起動すればOK

Slide 25

Slide 25 text

表⽰オブジェクトのインポート (1/5) Assets

Slide 26

Slide 26 text

表⽰オブジェクトのインポート (2/5) ①Import Package ②Custom Package

Slide 27

Slide 27 text

表⽰オブジェクトのインポート (3/5) Scan.unitypackage Samplesフォルダ

Slide 28

Slide 28 text

表⽰オブジェクトのインポート (4/5) Import

Slide 29

Slide 29 text

表⽰オブジェクトのインポート (5/5) ScanフォルダができればOK

Slide 30

Slide 30 text

表⽰オブジェクトをシーンに追加 (1/4) Bread BreadをHierarchy にドラッグ&ドロップ

Slide 31

Slide 31 text

表⽰オブジェクトをシーンに追加 (2/4) ⼩さすぎてBread が⾒えない︖

Slide 32

Slide 32 text

表⽰オブジェクトをシーンに追加 (3/4) Breadをダブルクリック

Slide 33

Slide 33 text

表⽰オブジェクトをシーンに追加 (4/4) クローズアップされる

Slide 34

Slide 34 text

ハンズオン⼿順 エミュレータ 実機 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p ヘッドトラッキングの活⽤ p 何もないところでのクリック検知 p uGUI操作

Slide 35

Slide 35 text

プラットフォームの設定 (1/4) ①File ②Build Settings

Slide 36

Slide 36 text

プラットフォームの設定 (2/4) ①Androidを選択 ②Switch Platform

Slide 37

Slide 37 text

プラットフォームの設定 (3/4) Androidに切り替わる

Slide 38

Slide 38 text

プラットフォームの設定 (4/4) 閉じる

Slide 39

Slide 39 text

NRSDKのインストール (1/4) ①Assets ②Import Package ③Custom Package

Slide 40

Slide 40 text

NRSDKのインストール (2/4) NRSDKをダブルクリック

Slide 41

Slide 41 text

NRSDKのインストール (3/4) Import

Slide 42

Slide 42 text

NRSDKのインストール (4/4) NRSDKフォルダができればOK

Slide 43

Slide 43 text

Nreal⽤カメラの設定 (1/3) MainCameraを削除

Slide 44

Slide 44 text

Nreal⽤カメラの設定 (2/3) Assets → NRSDK → Prefabs

Slide 45

Slide 45 text

Nreal⽤カメラの設定 (3/3) NRCameraRig Hierarchyにドラッグ&ドロップ

Slide 46

Slide 46 text

表⽰出⼒の確認 Gameタブをドラッグして右に移動 (次⾴参照)

Slide 47

Slide 47 text

表⽰出⼒の確認 (1/2) こんな感じ

Slide 48

Slide 48 text

表⽰出⼒の確認 (2/2) カメラとCGが同じ位置(0,0,0) にあるため何も⾒えない状態

Slide 49

Slide 49 text

オブジェクトの位置を調整 (1/4) ①Breadをクリック ②Positionを下記に変更 0,-0.08,0.8

Slide 50

Slide 50 text

オブジェクトの位置を調整 (2/4) BreadがSceneからフレームアウトするかも Breadが視界内に表⽰

Slide 51

Slide 51 text

オブジェクトの位置を調整 (3/4) Breadをダブルクリック

Slide 52

Slide 52 text

オブジェクトの位置を調整 (4/4) 視点が調整され、カメラとの位置関係も確認可能

Slide 53

Slide 53 text

Sceneの視点調整 カメラが⼿前に来るように視点を変えると 実⾏画⾯と⽐較しやすいかもしれない

Slide 54

Slide 54 text

現状を保存 Ctrl/command + S

Slide 55

Slide 55 text

エミュレーターで動作確認 (1/4) Play

Slide 56

Slide 56 text

エミュレーターで動作確認 (2/4) [W][S]: 前後移動 [A][D]: 左右移動 [Space]+ドラッグ︓⾸振り

Slide 57

Slide 57 text

エミュレーターで動作確認 (3/4) 再度Playをクリックして停⽌

Slide 58

Slide 58 text

エミュレーターで動作確認 (4/4) 再⽣ボタンが⻘くなければOK

Slide 59

Slide 59 text

コントローラの追加 (1/2) Assets → NRSDK → Prefabs

Slide 60

Slide 60 text

コントローラの追加 (2/2) NRInput Hierarchyにドラッグ&ドロップ

Slide 61

Slide 61 text

エミュレーターでのコントローラ使⽤ (1/5) Play

Slide 62

Slide 62 text

エミュレーターでのコントローラ使⽤ (2/5) コントローラ画⾯ ※実際はスマホ画⾯に表⽰される コントローラオブジェクト

Slide 63

Slide 63 text

エミュレーターでのコントローラ使⽤ (3/5) ①Gameタブ内をクリック ②Shiftを押したままマウスカーソルを 動かすとポインタも連動して動く

Slide 64

Slide 64 text

エミュレーターでのコントローラ使⽤ (4/5) ①Shiftから指を離すと ポインタは動かなくなる ②コントローラ画⾯をクリックすると ●が表⽰されクリックしたことがわかる

Slide 65

Slide 65 text

エミュレーターでのコントローラ使⽤ (5/5) 停⽌

Slide 66

Slide 66 text

補⾜︓3DoFを前提に開発 (for Light) ①NRCameraRig ②NRHMD Pose Trackerの TrackingTypeを[3DoF]に変更 ※今回は不要

Slide 67

Slide 67 text

実機で動作確認 (1/7) NRSDK

Slide 68

Slide 68 text

実機で動作確認 (2/7) Project Tips

Slide 69

Slide 69 text

実機で動作確認 (3/7) Accept All

Slide 70

Slide 70 text

実機で動作確認 (4/7) Close Window

Slide 71

Slide 71 text

実機で動作確認 (5/7) スマホ/コンピュータユニットとPCを接続

Slide 72

Slide 72 text

実機で動作確認 (6/7) ①File ②Build And Run

Slide 73

Slide 73 text

実機で動作確認 (7/7) ①インストーラー名 ②保存

Slide 74

Slide 74 text

動作確認

Slide 75

Slide 75 text

シーンを名前を付けて保存 (1/3) ①File ②Save As

Slide 76

Slide 76 text

シーンを名前を付けて保存 (2/3) ①Scene名をSample␣0 ②保存

Slide 77

Slide 77 text

シーンを名前を付けて保存 (3/3) ①Assets ②Sample 0があることを確認

Slide 78

Slide 78 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 79

Slide 79 text

シーンの複製 (1/4) Sample 0を選択して Ctrl + D

Slide 80

Slide 80 text

シーンの複製 (2/4) Sample 1が⽣成される

Slide 81

Slide 81 text

シーンの複製 (3/4) Sample 1をダブルクリック

Slide 82

Slide 82 text

シーンの複製 (4/4) Sample 1に切り替わればOK

Slide 83

Slide 83 text

スクリプトの追加 (1/5) ①Bread ②Add Component

Slide 84

Slide 84 text

スクリプトの追加 (2/5) ①検索エリアを空に ②New Script

Slide 85

Slide 85 text

スクリプトの追加 (3/5) ①スクリプト名︓TapAndRotate ②Create and Add

Slide 86

Slide 86 text

スクリプトの追加 (4/5) TapAndRotateが追加される AssetsフォルダにもTapAndRotate.csファイルができる

Slide 87

Slide 87 text

スクリプトの追加 (5/5) TapAndRotateをダブルクリック

Slide 88

Slide 88 text

オブジェクト回転のスクリプト記述 public class TapAndRotate : MonoBehaviour { //回転速度(初期値: 20 deg/sec) public float speed = 20.0f; //初期化で使⽤(今回は使わない) void Start(){ } //毎フレーム更新 void Update() { //Rotate(x軸,y軸,z軸,回転基準) transform.Rotate( 0, speed * Time.deltaTime, 0, Space.World); } }

Slide 89

Slide 89 text

現状を保存 ソースコードを保存 Ctrl/command + S

Slide 90

Slide 90 text

動作確認 Play

Slide 91

Slide 91 text

動作確認 回転する ここで速度を変更

Slide 92

Slide 92 text

動作確認 停⽌

Slide 93

Slide 93 text

回転On/Offの条件を追加 //回転速度(初期値: 20 deg/sec) public float speed = 20.0f; //回転のOn/Off bool rotate = false; //初期化で使⽤(今回は使わない) void Start(){ } //毎フレーム更新 void Update() { if (rotate) { transform.Rotate( 0, speed * Time.deltaTime, 0, Space.World); } } trueになるまで回転しない

Slide 94

Slide 94 text

コントローラでオブジェクトをクリック (1/6) using UnityEngine; //NRSDKの読み込み using NRKernal; //クリックなどのイベント検出 using UnityEngine.EventSystems; public class TapAndRotate : MonoBehaviour { //回転速度(初期値: 20 deg/sec) public float speed = 20.0f; //回転のOn/Off bool rotate = false; void Start(){ } void Update() { if (rotate) {/*スペースの都合により省略*/} } }

Slide 95

Slide 95 text

コントローラでオブジェクトをクリック (2/6) using UnityEngine; using NRKernal; using UnityEngine.EventSystems; public class TapAndRotate : MonoBehaviour, IPointerClickHandler { //回転速度(初期値: 20 deg/sec) public float speed = 20.0f; //回転のOn/Off bool rotate = false; void Start(){ } void Update() { if (rotate) {/*スペースの都合により省略*/} } } クリック関連のインターフェース

Slide 96

Slide 96 text

コントローラでオブジェクトをクリック (3/6) IpointerClickHandlerにカーソルを合わせる ヒントの中から「インターフェイスを実装」を選択

Slide 97

Slide 97 text

コントローラでオブジェクトをクリック (4/6) OnPointerClick関数が追加される

Slide 98

Slide 98 text

コントローラでオブジェクトをクリック (5/6) using UnityEngine; using NRKernal; using UnityEngine.EventSystems; public class TapAndRotate : MonoBehaviour, IPointerClickHandler { //回転速度(初期値: 20 deg/sec) public float speed = 20.0f; //回転のOn/Off bool rotate = false; //このスクリプトが貼られたオブジェクトクリックすると呼ばれる関数 public void OnPointerClick(PointerEventData eventData) { throw new System.NotImplementedException(); } void Start(){ } void Update(){/*スペースの都合により省略*/} } OnPointerClick関数内のコードを削除

Slide 99

Slide 99 text

コントローラでオブジェクトをクリック (6/6) using UnityEngine; using NRKernal; using UnityEngine.EventSystems; public class TapAndRotate : MonoBehaviour, IPointerClickHandler { //回転速度(初期値: 20 deg/sec) public float speed = 20.0f; //回転のOn/Off bool rotate = false; //このスクリプトが貼られたオブジェクトクリックすると呼ばれる関数 public void OnPointerClick(PointerEventData eventData) { rotate = !rotate; } void Start(){ } void Update(){/*スペースの都合により省略*/} } 回転⽤フラグのOn/Offを切り替え

Slide 100

Slide 100 text

現状を保存 ソースコードを保存 Ctrl/command + S

Slide 101

Slide 101 text

動作確認 Play

Slide 102

Slide 102 text

動作確認 Shift + ドラッグでポインタを 移動してオブジェクトに合わせる

Slide 103

Slide 103 text

動作確認 Shiftから⼀旦指を離す

Slide 104

Slide 104 text

動作確認 コントローラ画⾯上でマウスクリック

Slide 105

Slide 105 text

動作確認 いくらクリックしても回転しない︕

Slide 106

Slide 106 text

動作確認 停⽌

Slide 107

Slide 107 text

原因 ポインターとの接触判定を⾏う コライダーがCG側に設定されていない ※Cubeとかのサンプルでは初めからコライダーが設定されているので忘れがち

Slide 108

Slide 108 text

コライダーの設定 (1/4) Breadをクリック

Slide 109

Slide 109 text

コライダーの設定 (2/4) Add Component

Slide 110

Slide 110 text

コライダーの設定 (3/4) Boxで検索 Box Collider

Slide 111

Slide 111 text

コライダーの設定 (4/4) Center: 0 0.05 0 Size: 0.2 0.1 0.2

Slide 112

Slide 112 text

現状を保存 Ctrl/command + S

Slide 113

Slide 113 text

動作確認 Play

Slide 114

Slide 114 text

動作確認 ポインターを合わせる コントローラ画⾯をクリック

Slide 115

Slide 115 text

動作確認 今度は回転する ※再クリックで停⽌

Slide 116

Slide 116 text

動作確認(動画)

Slide 117

Slide 117 text

動作確認(動画)

Slide 118

Slide 118 text

動作確認 停⽌

Slide 119

Slide 119 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 120

Slide 120 text

現状を保存 Unityのシーンの現状を保存 Ctrl/command + S

Slide 121

Slide 121 text

プロジェクトの複製 (1/3) Sample 1を選択して Ctrl/command + D

Slide 122

Slide 122 text

プロジェクトの複製 (2/3) Sample 2をダブルクリック

Slide 123

Slide 123 text

プロジェクトの複製 (3/3) Sample 2になっていればOK

Slide 124

Slide 124 text

不要なスクリプトの削除 (1/2) Bread TapAndRotate横の

Slide 125

Slide 125 text

不要なスクリプトの削除 (2/2) Remove Component

Slide 126

Slide 126 text

新規スクリプトの追加 (1/4) Add Component

Slide 127

Slide 127 text

新規スクリプトの追加 (2/4) 検索エリアを空に New script

Slide 128

Slide 128 text

新規スクリプトの追加 (3/4) Script名: Manipulation Create and Add

Slide 129

Slide 129 text

新規スクリプトの追加 (4/4) Manipulationが追加される Manipulationをダブルクリック

Slide 130

Slide 130 text

コントローラ押下と解放の検知 (1/5) using UnityEngine; using NRKernal; using UnityEngine.EventSystems; public class Manipulation : MonoBehaviour ,IPointerDownHandler, IPointerUpHandler { void Start() { } void Update() { } } コントローラ押下開始 コントローラ押下終了

Slide 131

Slide 131 text

コントローラ押下と解放の検知 (2/5) IpointerDownHandlerにカーソルを合わせる ヒントの中からインターフェイスを実装を選択

Slide 132

Slide 132 text

コントローラ押下と解放の検知 (3/5) IpointerUpHandlerにカーソルを合わせる ヒントの中からインターフェイスを実装を選択

Slide 133

Slide 133 text

コントローラ押下と解放の検知 (4/5) public class Manipulation : MonoBehaviour , IPointerDownHandler, IPointerUpHandler { public void OnPointerDown(PointerEventData eventData) { throw new System.NotImplementedException(); } public void OnPointerUp(PointerEventData eventData) { throw new System.NotImplementedException(); } void Start() { } void Update() { } }

Slide 134

Slide 134 text

コントローラ押下と解放の検知 (5/5) public class Manipulation : MonoBehaviour , IPointerDownHandler, IPointerUpHandler { public void OnPointerDown(PointerEventData eventData) { Debug.Log("Down"); } public void OnPointerUp(PointerEventData eventData) { Debug.Log("Up"); } void Start() { } void Update() { } }

Slide 135

Slide 135 text

現状を保存 ソースコードを保存 Ctrl/command + S

Slide 136

Slide 136 text

動作確認 Console

Slide 137

Slide 137 text

動作確認 Play ポインタをオブジェクトに合わせる

Slide 138

Slide 138 text

動作確認 Shiftから⼿を離す コントローラをゆっくりクリック

Slide 139

Slide 139 text

動作確認 ボタンを押下したタイミングと離したタイミングでそれぞれ⽂字が表⽰

Slide 140

Slide 140 text

動作確認 停⽌

Slide 141

Slide 141 text

不要なコードを削除 public class Manipulation : MonoBehaviour , IPointerDownHandler, IPointerUpHandler { public void OnPointerDown(PointerEventData eventData) { Debug.Log("Down"); } public void OnPointerUp(PointerEventData eventData) { Debug.Log("Up"); } void Start() { } void Update() { } }

Slide 142

Slide 142 text

コントローラ押下でオブジェクト移動 Breadの親要素なし(=3D空間) 親要素を切り替えることでコントローラへの追従のOn/Offを切り替える コントローラがBreadの親 押下 押下 選択

Slide 143

Slide 143 text

コントローラ押下でオブジェクト移動 (1/5) //コントローラの位置・姿勢 (あとでUnityEditorから指定) public Transform controller; //デフォルトの(マニピュレーションしていない時の)親オブジェクト public Transform base_parent; public void OnPointerDown(PointerEventData eventData) { //このオブジェクトの親をコントローラにする(コントローラに追従) transform.parent = controller; } public void OnPointerUp(PointerEventData eventData) { //このオブジェクトをコントローラから解放する transform.parent = base_parent; } void Start() { //最初にこのオブジェクトの親Transformを覚えさせておく base_parent = transform.parent; }

Slide 144

Slide 144 text

現状を保存 Ctrl/command + S

Slide 145

Slide 145 text

コントローラ押下でオブジェクト移動 (2/5) スクリプトとUnityEditor上の コントローラを関連づけよう

Slide 146

Slide 146 text

コントローラ押下でオブジェクト移動 (3/5) NRInput → Right → ControllerTrack → ModelAnchorを⾒つける

Slide 147

Slide 147 text

コントローラ押下でオブジェクト移動 (4/5) Breadをクリック Manipulationに注⽬

Slide 148

Slide 148 text

コントローラ押下でオブジェクト移動 (5/5) ModelAncor Controllerに ドラッグ&ドロップ

Slide 149

Slide 149 text

動作確認 Play

Slide 150

Slide 150 text

動作確認 オブジェクトにポインタを合わせる

Slide 151

Slide 151 text

動作確認 ①Shiftから指を離す ②Shiftを押してコントローラ画⾯上をドラッグ

Slide 152

Slide 152 text

動作確認

Slide 153

Slide 153 text

動作確認 停⽌

Slide 154

Slide 154 text

実機での動作の様⼦

Slide 155

Slide 155 text

オブジェクトの前後移動 (1/3) public Transform base_parent; //コントローラで選択されているかどうか bool selected = false; public void OnPointerDown(PointerEventData eventData) { //ポインターを合わせてボタンを押したら選択 selected = true; //このオブジェクトの親をコントローラにする(コントローラに追従) transform.parent = controller; } public void OnPointerUp(PointerEventData eventData) { //指を離したら選択解除 selected = false; //このオブジェクトをコントローラから解放する transform.parent = base_parent; }

Slide 156

Slide 156 text

オブジェクトの前後移動 (2/3) //コントローラで選択されているかどうか bool selected = false; //移動速度 public float moveSpeed = 0.08f; public void OnPointerDown(PointerEventData eventData){ 略 } public void OnPointerUp(PointerEventData eventData){ 略 } void Start(){ 略 } void Update() { if (!selected) return; //タッチ位置を取得し、yの絶対値>0.6なら前後移動 Vector2 p = NRInput.GetTouch(); if (Mathf.Abs(p.y) > 0.6f) { transform.Translate(Mathf.Sign(p.y) * controller.forward * moveSpeed * Time.deltaTime); } } -1 1

Slide 157

Slide 157 text

オブジェクトの前後移動 (3/3) //コントローラで選択されているかどうか bool selected = false; //移動速度 public float moveSpeed = 0.08f; public void OnPointerDown(PointerEventData eventData){ 略 } public void OnPointerUp(PointerEventData eventData){ 略 } void Start(){ 略 } void Update() { if (!selected) return; //タッチ位置(-1~1)を取得し、yの絶対値>0.6なら前後移動 Vector2 p = NRInput.GetTouch(); if (Mathf.Abs(p.y) > 0.6f) { transform.Translate(Mathf.Sign(p.y) * controller.forward * moveSpeed * Time.deltaTime); } }

Slide 158

Slide 158 text

動作確認 Play

Slide 159

Slide 159 text

動作確認 ポインターをオブジェクトに合わせる コントローラ画⾯の上か下周辺でクリック

Slide 160

Slide 160 text

動作確認 ポインターの前後⽅向に移動

Slide 161

Slide 161 text

動作確認

Slide 162

Slide 162 text

動作確認 停⽌

Slide 163

Slide 163 text

オブジェクトの左右回転 //移動速度 public float moveSpeed = 0.08f; //回転速度 public float rotSpeed = -20.0f; /*中略*/ void Update() { if (!selected) return; //タッチ位置(-1~1)を取得し、xyの絶対値が0.6以上なら移動/回転 Vector2 p = NRInput.GetTouch(); if (Mathf.Abs(p.y) > 0.6f){ /* 略(前後移動) */ } else if (Mathf.Abs(p.x) > 0.6f) { transform.Rotate(0, Mathf.Sign(p.x) * rotSpeed * Time.deltaTime, 0, Space.Self ); } }

Slide 164

Slide 164 text

動作確認 Play

Slide 165

Slide 165 text

動作確認 ポインターをオブジェクトに合わせる コントローラ画⾯の右か左周辺をクリック

Slide 166

Slide 166 text

動作確認 回転もできるようになる

Slide 167

Slide 167 text

動作確認 停⽌

Slide 168

Slide 168 text

ここまでの成果(エミュレーター)

Slide 169

Slide 169 text

ここまでの成果(実機)

Slide 170

Slide 170 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作

Slide 171

Slide 171 text

現状を保存 Ctrl/command + S

Slide 172

Slide 172 text

プロジェクトの複製 (1/4) Sample 2をCtrl/command + D

Slide 173

Slide 173 text

プロジェクトの複製 (2/4) Sample 3が⽣成される

Slide 174

Slide 174 text

プロジェクトの複製 (3/4) Sample 3をダブルクリック

Slide 175

Slide 175 text

プロジェクトの複製 (4/4) Sample 3に切り替わればOK

Slide 176

Slide 176 text

不要なオブジェクトを削除 Breadを削除

Slide 177

Slide 177 text

サンプルのインポート (1/4) Assets → Import Package → Custom Package

Slide 178

Slide 178 text

サンプルのインポート (2/4) ARShooter.unitypackage

Slide 179

Slide 179 text

サンプルのインポート (3/4) Import

Slide 180

Slide 180 text

サンプルのインポート (4/4) Shooterが追加されていればOK

Slide 181

Slide 181 text

壁を表⽰ (1/8) Hierarchyの何もないところを右クリック

Slide 182

Slide 182 text

壁を表⽰ (2/8) Crate Empty

Slide 183

Slide 183 text

壁を表⽰ (3/8) ①GameObject ②名前をWallに変更

Slide 184

Slide 184 text

壁を表⽰ (4/8) Positionを 0 -0.2 2 ※壁が表⽰される位置

Slide 185

Slide 185 text

壁を表⽰ (5/8) Shooter

Slide 186

Slide 186 text

壁を表⽰ (6/8) WallScriptに注⽬ ※クリックしない WallのInspectorに ドラッグ&ドロップ

Slide 187

Slide 187 text

壁を表⽰ (7/8) WallScriptが追加される

Slide 188

Slide 188 text

壁を表⽰ (8/8) Cubeに注⽬ (クリックしない) CubePrefabに ドラッグ&ドロップ

Slide 189

Slide 189 text

動作確認 Play

Slide 190

Slide 190 text

動作確認 壁が表⽰される

Slide 191

Slide 191 text

動作確認 停⽌

Slide 192

Slide 192 text

弾を発射するスクリプトを作成 (1/5) NRInput → Right → ControllerTrack → ModelAnchorを⾒つける [補⾜] 弾を発射したいオブジェクトに次⾴で作るスクリプトを貼り付ける。 例としてコントローラを指定しているが、NRCameraRig内の CenterAnhorに貼れば頭から発射も可能

Slide 193

Slide 193 text

弾を発射するスクリプトを作成 (2/5) Add Component

Slide 194

Slide 194 text

弾を発射するスクリプトを作成 (3/5) 検索エリアを空に New script

Slide 195

Slide 195 text

弾を発射するスクリプトを作成 (4/5) Script名: ShootBullet Create and Add

Slide 196

Slide 196 text

弾を発射するスクリプトを作成 (5/5) ShootBulletが追加される

Slide 197

Slide 197 text

発射スクリプトの記述 (1/6) ①Assets ②ShootBulletをダブルクリック

Slide 198

Slide 198 text

発射スクリプトの記述 (2/6) using UnityEngine; using NRKernal; public class ShootBullet : MonoBehaviour { //発射する弾の元データ public GameObject bulletPrefab; //実際に空間に放たれる弾 GameObject bullet; void Start() { } void Update() { } }

Slide 199

Slide 199 text

発射スクリプトの記述 (3/6) void Start() { NRInput.AddClickListener( //右⼿or左⼿の指定 ControllerHandEnum.Right, //コントローラの押した箇所に対応するアクションを記述 ControllerButton.TRIGGER, () => { //既に弾を発射している場合は⼀旦削除 if (bullet != null) DestroyImmediate(bullet); //弾を作って発射位置にセット bullet = GameObject.Instantiate(bulletPrefab); bullet.transform.position = transform.position; //下記設定で⼒を加える bullet.GetComponent().AddForce( transform.forward * 8, ForceMode.Impulse); } ); }

Slide 200

Slide 200 text

現状を保存 ソースコードを保存 Ctrl/command + S

Slide 201

Slide 201 text

発射スクリプトの記述 (4/6) NRInput → Right → ControllerTrack → ModelAnchor

Slide 202

Slide 202 text

発射スクリプトの記述 (5/6) Shooter

Slide 203

Slide 203 text

発射スクリプトの記述 (6/6) Bulletに注⽬ (クリックしない) BulletPrefabに ドラッグ&ドロップ

Slide 204

Slide 204 text

動作確認 Play

Slide 205

Slide 205 text

動作確認 弾が発射される

Slide 206

Slide 206 text

動作確認

Slide 207

Slide 207 text

動作確認 停⽌

Slide 208

Slide 208 text

ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作 リセットボタン

Slide 209

Slide 209 text

リセットボタンを追加 (1/5) Shooter

Slide 210

Slide 210 text

リセットボタンを追加 (2/5) Canvas Hierarchyに ドラッグ&ドロップ

Slide 211

Slide 211 text

リセットボタンを追加 (3/5) Canvas CanvasのRenderModeが WorldSpaceとなっていることを確認

Slide 212

Slide 212 text

リセットボタンを追加 (4/5) Add Component

Slide 213

Slide 213 text

リセットボタンを追加 (5/5) Canvas Raycast Canvas Raycast Target

Slide 214

Slide 214 text

リセット機能を呼び出す (1/9) Canvasを開く

Slide 215

Slide 215 text

リセット機能を呼び出す (2/9) Buttonをクリック

Slide 216

Slide 216 text

リセット機能を呼び出す (3/9) Buttonを⾒つける On Clickを⾒つける

Slide 217

Slide 217 text

リセット機能を呼び出す (4/9) Wallを⾒つける (クリックしない)

Slide 218

Slide 218 text

リセット機能を呼び出す (5/9) OnClickにドラッグ&ドロップ

Slide 219

Slide 219 text

リセット機能を呼び出す (6/9) ドロップダウンメニューを開く

Slide 220

Slide 220 text

リセット機能を呼び出す (7/9) ①WallScript ②ResetWall

Slide 221

Slide 221 text

リセット機能を呼び出す (8/9) NRInput → Right → ControllerTracker → LaserRaycaster

Slide 222

Slide 222 text

リセット機能を呼び出す (9/9) Mask Type: Inclusive Mask: UI

Slide 223

Slide 223 text

動作確認

Slide 224

Slide 224 text

参考 • クイックスタート https://nreal.gitbook.io/nrsdk/discove r/quickstart-for-android • コントローラ詳細 https://nreal.gitbook.io/nrsdk/nrsdk- fundamentals/controller • 前回のNreal Lightハンズオン https://www.slideshare.net/ssuserc0d 7fb/nreal-light