Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Nreal Light / Air 開発入門ハンズオン
Search
TakashiYoshinaga
April 29, 2022
Technology
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Nreal Light / Air 開発入門ハンズオン
2022/04/29に開催のハンズオン資料
TakashiYoshinaga
April 29, 2022
More Decks by TakashiYoshinaga
See All by TakashiYoshinaga
MediaPipeのハンドトラッキングで作るARライトセイバー
takashiyoshinaga
1
400
UnityとZapWorksで始めようWebAR開発
takashiyoshinaga
0
4.3k
Getting Started with WebAR for HoloLens2 and Meta Quest
takashiyoshinaga
0
2.9k
Getting Started with HoloSDK
takashiyoshinaga
0
320
Getting Started with Non-Programming AR Development with MRTK v2.4.0
takashiyoshinaga
0
2.9k
Getting Started With MRTK (for Beginner)
takashiyoshinaga
0
750
始めようWebAR/VR開発
takashiyoshinaga
1
1.1k
Getting Started with Azure Kinect DK
takashiyoshinaga
1
6.2k
Getting Started with WebVR Contents Creation for Oculus Quest
takashiyoshinaga
2
660
Other Decks in Technology
See All in Technology
環境凍結という Toil を倒す -セルフサービス型 Ephemeral テスト環境の 設計と実践
shirouz
1
2k
Terraform共通モジュールをチーム横断で“変えられる”運用へ ― リリースと適用の分離
kekke_n
1
2.3k
Keeping applications secure by evolving OAuth 2.0 and OpenID Connect
ahus1
PRO
1
150
AIDLC_ヤフーショッピングの取り組み
lycorptech_jp
PRO
0
580
ゼロをイチにする仕事が終わったあと
smasato
0
320
Foxgloveについて 実際にExtensionを開発して公開するまでの話 / About Foxglove: The Story of Developing and Releasing an Extension
ry0_ka
0
190
Empower GenAI with Agile - あなたのアジャイルが生成AIのバフになる仕組み
hageyahhoo
1
150
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
370
Kotlin 開発のツラミを爆破した話! / Explode the difficulty of Kotlin dev!
eller86
0
160
NDIAS CTF 2026 問題解説会資料
bata_24
0
180
End-to-Endで考える信頼性 —LINEアプリにおけるクライアント開発×SRE連携の実践
maruloop
4
3.7k
FinOps X 2026 Recap from Engineer Side #JapanFinOps
chacco38
0
270
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
HDC tutorial
michielstock
2
740
How GitHub (no longer) Works
holman
316
150k
Claude Code のすすめ
schroneko
67
230k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Statistics for Hackers
jakevdp
799
230k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The Invisible Side of Design
smashingmag
301
52k
Transcript
Nreal Light/Air開発⼊⾨
⾃⼰紹介 ⽒名︓吉永崇(Takashi Yoshinaga) 専⾨︓ARを⽤いた医療⽀援や運動計測 Volumetric Video (3Dビデオ) コミュニティ︓ARコンテンツ作成勉強会 主催
ARコンテンツ作成勉強会の紹介 p 2013年5⽉に勉強会をスタート。 p ARコンテンツの作り⽅をハンズオン形式で学ぶ p ⼈数は5~10名程度の少⼈数で実施 p 参加条件はAR/VRに興味がある⼈(知識不要) p
各地で開催 (福岡、熊本、宮崎、⻑崎、⼤分、 ⿅児島、⼭⼝、広島、札幌、関東)
Twitterと勉強会ページで情報を発信しています @AR_Fukuoka Googleで「AR勉強会」で検索
#AR_Fukuoka #nreal ハッシュタグ
今⽇の内容 Nreal Light / Airのコントローラを使った コンテンツ開発の基本⼿順を解説
今⽇のゴール https://youtu.be/uyxVuTEpdJw
演習⽤素材のダウンロード https://github.com/TakashiYoshinaga/AR- Fukuoka/raw/main/20220429_Nreal3DoF/Samples.zip
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作
ハンズオン⼿順 オブジェクト 配置 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p
オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作
ハンズオン⼿順 エミュレータ 実機 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p
オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作 リセットボタン
ハンズオンスタート
ハンズオン⼿順 オブジェクト 配置 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p
オブジェクトのマニピュレーション p 何もないところでのクリック検知 p uGUI操作
Unity Hub起動 Unity Hub
プロジェクトの作成 (1/6) ①Projects ②NewProject
プロジェクトの作成 (2/6) EditorVersionを開く
プロジェクトの作成 (3/6) 2020.3.xxf1 この資料は2020.3.xを前提に解説をしています
プロジェクトの作成 (4/6) ①3D ②Project name ③保存場所
プロジェクトの作成 (5/6) Create project
プロジェクトの作成 (6/6) Unity Editorが起動すればOK
表⽰オブジェクトのインポート (1/5) Assets
表⽰オブジェクトのインポート (2/5) ①Import Package ②Custom Package
表⽰オブジェクトのインポート (3/5) Scan.unitypackage Samplesフォルダ
表⽰オブジェクトのインポート (4/5) Import
表⽰オブジェクトのインポート (5/5) ScanフォルダができればOK
表⽰オブジェクトをシーンに追加 (1/4) Bread BreadをHierarchy にドラッグ&ドロップ
表⽰オブジェクトをシーンに追加 (2/4) ⼩さすぎてBread が⾒えない︖
表⽰オブジェクトをシーンに追加 (3/4) Breadをダブルクリック
表⽰オブジェクトをシーンに追加 (4/4) クローズアップされる
ハンズオン⼿順 エミュレータ 実機 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p
オブジェクトのマニピュレーション p ヘッドトラッキングの活⽤ p 何もないところでのクリック検知 p uGUI操作
プラットフォームの設定 (1/4) ①File ②Build Settings
プラットフォームの設定 (2/4) ①Androidを選択 ②Switch Platform
プラットフォームの設定 (3/4) Androidに切り替わる
プラットフォームの設定 (4/4) 閉じる
NRSDKのインストール (1/4) ①Assets ②Import Package ③Custom Package
NRSDKのインストール (2/4) NRSDKをダブルクリック
NRSDKのインストール (3/4) Import
NRSDKのインストール (4/4) NRSDKフォルダができればOK
Nreal⽤カメラの設定 (1/3) MainCameraを削除
Nreal⽤カメラの設定 (2/3) Assets → NRSDK → Prefabs
Nreal⽤カメラの設定 (3/3) NRCameraRig Hierarchyにドラッグ&ドロップ
表⽰出⼒の確認 Gameタブをドラッグして右に移動 (次⾴参照)
表⽰出⼒の確認 (1/2) こんな感じ
表⽰出⼒の確認 (2/2) カメラとCGが同じ位置(0,0,0) にあるため何も⾒えない状態
オブジェクトの位置を調整 (1/4) ①Breadをクリック ②Positionを下記に変更 0,-0.08,0.8
オブジェクトの位置を調整 (2/4) BreadがSceneからフレームアウトするかも Breadが視界内に表⽰
オブジェクトの位置を調整 (3/4) Breadをダブルクリック
オブジェクトの位置を調整 (4/4) 視点が調整され、カメラとの位置関係も確認可能
Sceneの視点調整 カメラが⼿前に来るように視点を変えると 実⾏画⾯と⽐較しやすいかもしれない
現状を保存 Ctrl/command + S
エミュレーターで動作確認 (1/4) Play
エミュレーターで動作確認 (2/4) [W][S]: 前後移動 [A][D]: 左右移動 [Space]+ドラッグ︓⾸振り
エミュレーターで動作確認 (3/4) 再度Playをクリックして停⽌
エミュレーターで動作確認 (4/4) 再⽣ボタンが⻘くなければOK
コントローラの追加 (1/2) Assets → NRSDK → Prefabs
コントローラの追加 (2/2) NRInput Hierarchyにドラッグ&ドロップ
エミュレーターでのコントローラ使⽤ (1/5) Play
エミュレーターでのコントローラ使⽤ (2/5) コントローラ画⾯ ※実際はスマホ画⾯に表⽰される コントローラオブジェクト
エミュレーターでのコントローラ使⽤ (3/5) ①Gameタブ内をクリック ②Shiftを押したままマウスカーソルを 動かすとポインタも連動して動く
エミュレーターでのコントローラ使⽤ (4/5) ①Shiftから指を離すと ポインタは動かなくなる ②コントローラ画⾯をクリックすると •が表⽰されクリックしたことがわかる
エミュレーターでのコントローラ使⽤ (5/5) 停⽌
補⾜︓3DoFを前提に開発 (for Light) ①NRCameraRig ②NRHMD Pose Trackerの TrackingTypeを[3DoF]に変更 ※今回は不要
実機で動作確認 (1/7) NRSDK
実機で動作確認 (2/7) Project Tips
実機で動作確認 (3/7) Accept All
実機で動作確認 (4/7) Close Window
実機で動作確認 (5/7) スマホ/コンピュータユニットとPCを接続
実機で動作確認 (6/7) ①File ②Build And Run
実機で動作確認 (7/7) ①インストーラー名 ②保存
動作確認
シーンを名前を付けて保存 (1/3) ①File ②Save As
シーンを名前を付けて保存 (2/3) ①Scene名をSample␣0 ②保存
シーンを名前を付けて保存 (3/3) ①Assets ②Sample 0があることを確認
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作
シーンの複製 (1/4) Sample 0を選択して Ctrl + D
シーンの複製 (2/4) Sample 1が⽣成される
シーンの複製 (3/4) Sample 1をダブルクリック
シーンの複製 (4/4) Sample 1に切り替わればOK
スクリプトの追加 (1/5) ①Bread ②Add Component
スクリプトの追加 (2/5) ①検索エリアを空に ②New Script
スクリプトの追加 (3/5) ①スクリプト名︓TapAndRotate ②Create and Add
スクリプトの追加 (4/5) TapAndRotateが追加される AssetsフォルダにもTapAndRotate.csファイルができる
スクリプトの追加 (5/5) TapAndRotateをダブルクリック
オブジェクト回転のスクリプト記述 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); } }
現状を保存 ソースコードを保存 Ctrl/command + S
動作確認 Play
動作確認 回転する ここで速度を変更
動作確認 停⽌
回転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になるまで回転しない
コントローラでオブジェクトをクリック (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) {/*スペースの都合により省略*/} } }
コントローラでオブジェクトをクリック (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) {/*スペースの都合により省略*/} } } クリック関連のインターフェース
コントローラでオブジェクトをクリック (3/6) IpointerClickHandlerにカーソルを合わせる ヒントの中から「インターフェイスを実装」を選択
コントローラでオブジェクトをクリック (4/6) OnPointerClick関数が追加される
コントローラでオブジェクトをクリック (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関数内のコードを削除
コントローラでオブジェクトをクリック (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を切り替え
現状を保存 ソースコードを保存 Ctrl/command + S
動作確認 Play
動作確認 Shift + ドラッグでポインタを 移動してオブジェクトに合わせる
動作確認 Shiftから⼀旦指を離す
動作確認 コントローラ画⾯上でマウスクリック
動作確認 いくらクリックしても回転しない︕
動作確認 停⽌
原因 ポインターとの接触判定を⾏う コライダーがCG側に設定されていない ※Cubeとかのサンプルでは初めからコライダーが設定されているので忘れがち
コライダーの設定 (1/4) Breadをクリック
コライダーの設定 (2/4) Add Component
コライダーの設定 (3/4) Boxで検索 Box Collider
コライダーの設定 (4/4) Center: 0 0.05 0 Size: 0.2 0.1 0.2
現状を保存 Ctrl/command + S
動作確認 Play
動作確認 ポインターを合わせる コントローラ画⾯をクリック
動作確認 今度は回転する ※再クリックで停⽌
動作確認(動画)
動作確認(動画)
動作確認 停⽌
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作
現状を保存 Unityのシーンの現状を保存 Ctrl/command + S
プロジェクトの複製 (1/3) Sample 1を選択して Ctrl/command + D
プロジェクトの複製 (2/3) Sample 2をダブルクリック
プロジェクトの複製 (3/3) Sample 2になっていればOK
不要なスクリプトの削除 (1/2) Bread TapAndRotate横の
不要なスクリプトの削除 (2/2) Remove Component
新規スクリプトの追加 (1/4) Add Component
新規スクリプトの追加 (2/4) 検索エリアを空に New script
新規スクリプトの追加 (3/4) Script名: Manipulation Create and Add
新規スクリプトの追加 (4/4) Manipulationが追加される Manipulationをダブルクリック
コントローラ押下と解放の検知 (1/5) using UnityEngine; using NRKernal; using UnityEngine.EventSystems; public class
Manipulation : MonoBehaviour ,IPointerDownHandler, IPointerUpHandler { void Start() { } void Update() { } } コントローラ押下開始 コントローラ押下終了
コントローラ押下と解放の検知 (2/5) IpointerDownHandlerにカーソルを合わせる ヒントの中からインターフェイスを実装を選択
コントローラ押下と解放の検知 (3/5) IpointerUpHandlerにカーソルを合わせる ヒントの中からインターフェイスを実装を選択
コントローラ押下と解放の検知 (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() { } }
コントローラ押下と解放の検知 (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() { } }
現状を保存 ソースコードを保存 Ctrl/command + S
動作確認 Console
動作確認 Play ポインタをオブジェクトに合わせる
動作確認 Shiftから⼿を離す コントローラをゆっくりクリック
動作確認 ボタンを押下したタイミングと離したタイミングでそれぞれ⽂字が表⽰
動作確認 停⽌
不要なコードを削除 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() { } }
コントローラ押下でオブジェクト移動 Breadの親要素なし(=3D空間) 親要素を切り替えることでコントローラへの追従のOn/Offを切り替える コントローラがBreadの親 押下 押下 選択
コントローラ押下でオブジェクト移動 (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; }
現状を保存 Ctrl/command + S
コントローラ押下でオブジェクト移動 (2/5) スクリプトとUnityEditor上の コントローラを関連づけよう
コントローラ押下でオブジェクト移動 (3/5) NRInput → Right → ControllerTrack → ModelAnchorを⾒つける
コントローラ押下でオブジェクト移動 (4/5) Breadをクリック Manipulationに注⽬
コントローラ押下でオブジェクト移動 (5/5) ModelAncor Controllerに ドラッグ&ドロップ
動作確認 Play
動作確認 オブジェクトにポインタを合わせる
動作確認 ①Shiftから指を離す ②Shiftを押してコントローラ画⾯上をドラッグ
動作確認
動作確認 停⽌
実機での動作の様⼦
オブジェクトの前後移動 (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; }
オブジェクトの前後移動 (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
オブジェクトの前後移動 (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); } }
動作確認 Play
動作確認 ポインターをオブジェクトに合わせる コントローラ画⾯の上か下周辺でクリック
動作確認 ポインターの前後⽅向に移動
動作確認
動作確認 停⽌
オブジェクトの左右回転 //移動速度 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 ); } }
動作確認 Play
動作確認 ポインターをオブジェクトに合わせる コントローラ画⾯の右か左周辺をクリック
動作確認 回転もできるようになる
動作確認 停⽌
ここまでの成果(エミュレーター)
ここまでの成果(実機)
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作
現状を保存 Ctrl/command + S
プロジェクトの複製 (1/4) Sample 2をCtrl/command + D
プロジェクトの複製 (2/4) Sample 3が⽣成される
プロジェクトの複製 (3/4) Sample 3をダブルクリック
プロジェクトの複製 (4/4) Sample 3に切り替わればOK
不要なオブジェクトを削除 Breadを削除
サンプルのインポート (1/4) Assets → Import Package → Custom Package
サンプルのインポート (2/4) ARShooter.unitypackage
サンプルのインポート (3/4) Import
サンプルのインポート (4/4) Shooterが追加されていればOK
壁を表⽰ (1/8) Hierarchyの何もないところを右クリック
壁を表⽰ (2/8) Crate Empty
壁を表⽰ (3/8) ①GameObject ②名前をWallに変更
壁を表⽰ (4/8) Positionを 0 -0.2 2 ※壁が表⽰される位置
壁を表⽰ (5/8) Shooter
壁を表⽰ (6/8) WallScriptに注⽬ ※クリックしない WallのInspectorに ドラッグ&ドロップ
壁を表⽰ (7/8) WallScriptが追加される
壁を表⽰ (8/8) Cubeに注⽬ (クリックしない) CubePrefabに ドラッグ&ドロップ
動作確認 Play
動作確認 壁が表⽰される
動作確認 停⽌
弾を発射するスクリプトを作成 (1/5) NRInput → Right → ControllerTrack → ModelAnchorを⾒つける [補⾜]
弾を発射したいオブジェクトに次⾴で作るスクリプトを貼り付ける。 例としてコントローラを指定しているが、NRCameraRig内の CenterAnhorに貼れば頭から発射も可能
弾を発射するスクリプトを作成 (2/5) Add Component
弾を発射するスクリプトを作成 (3/5) 検索エリアを空に New script
弾を発射するスクリプトを作成 (4/5) Script名: ShootBullet Create and Add
弾を発射するスクリプトを作成 (5/5) ShootBulletが追加される
発射スクリプトの記述 (1/6) ①Assets ②ShootBulletをダブルクリック
発射スクリプトの記述 (2/6) using UnityEngine; using NRKernal; public class ShootBullet :
MonoBehaviour { //発射する弾の元データ public GameObject bulletPrefab; //実際に空間に放たれる弾 GameObject bullet; void Start() { } void Update() { } }
発射スクリプトの記述 (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<Rigidbody>().AddForce( transform.forward * 8, ForceMode.Impulse); } ); }
現状を保存 ソースコードを保存 Ctrl/command + S
発射スクリプトの記述 (4/6) NRInput → Right → ControllerTrack → ModelAnchor
発射スクリプトの記述 (5/6) Shooter
発射スクリプトの記述 (6/6) Bulletに注⽬ (クリックしない) BulletPrefabに ドラッグ&ドロップ
動作確認 Play
動作確認 弾が発射される
動作確認
動作確認 停⽌
ハンズオン⼿順 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p オブジェクトのマニピュレーション p
何もないところでのクリック検知 p uGUI操作 リセットボタン
リセットボタンを追加 (1/5) Shooter
リセットボタンを追加 (2/5) Canvas Hierarchyに ドラッグ&ドロップ
リセットボタンを追加 (3/5) Canvas CanvasのRenderModeが WorldSpaceとなっていることを確認
リセットボタンを追加 (4/5) Add Component
リセットボタンを追加 (5/5) Canvas Raycast Canvas Raycast Target
リセット機能を呼び出す (1/9) Canvasを開く
リセット機能を呼び出す (2/9) Buttonをクリック
リセット機能を呼び出す (3/9) Buttonを⾒つける On Clickを⾒つける
リセット機能を呼び出す (4/9) Wallを⾒つける (クリックしない)
リセット機能を呼び出す (5/9) OnClickにドラッグ&ドロップ
リセット機能を呼び出す (6/9) ドロップダウンメニューを開く
リセット機能を呼び出す (7/9) ①WallScript ②ResetWall
リセット機能を呼び出す (8/9) NRInput → Right → ControllerTracker → LaserRaycaster
リセット機能を呼び出す (9/9) Mask Type: Inclusive Mask: UI
動作確認
参考 • クイックスタート 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