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
390
UnityとZapWorksで始めようWebAR開発
takashiyoshinaga
0
4.2k
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
機械学習を「社会実装」するということ 2026年夏版 / Social Implementation of Machine Learning June 2026 Version
moepy_stats
6
2.4k
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
150
【2026年版】 ベクトル検索䛸 Embedding最前線
mocobeta
6
2.5k
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
130
自律型AIエージェントは何を破壊するのか
kojira
0
160
あなたの知らないPDFのアクセシビリティ
lycorptech_jp
PRO
0
200
AIはどのように 組織のアジリティを変えるのか?
junki
4
990
エンジニアリング戦略の作り方 / Crafting Engineering Strategy
iwashi86
21
7k
iAEONの段階的リアーキテクト戦略 / iAEON's_Gradual_Re-architecture_Strategy
aeonpeople
0
210
不要なレビューをAIにまかせて AIコーディングの環境改善を加速した
shoota
1
200
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
3
2.2k
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
270
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
4 Signs Your Business is Dying
shpigford
187
22k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Six Lessons from altMBA
skipperchong
29
4.3k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
860
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
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