XREAL Air and Nreal Light開発入門

85.8K Views

May 12, 24

スライド概要

profile-image

可視化技術や人間計測/空間計測技術を活用した問題解決に関する研究開発。 ARコンテンツ作成勉強会(tryAR)を主催。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

XREAL Light/Air開発入門

2.

自己紹介 氏名:吉永崇 (Takashi Yoshinaga) 仕事:AR/VR応用に関するR&D。主に医療支援 ウェアラブル・モーションキャプチャ技術開発 活動:ARコンテンツ作成勉強会(#tryAR) 趣味:ARを用いたプロトタイピング お問い合わせ・ご質問はこちら! https://twitter.com/Taka_Yoshinaga

3.

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

4.

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

5.

ハッシュタグ #tryAR #xreal

6.

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

7.

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

8.

演習用素材のダウンロード https://github.com/TakashiYoshinaga/ARFukuoka/raw/main/Nreal3DoF_20220429/Samples.zip

9.

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

10.

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

11.

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

12.

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

13.

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

14.

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

15.

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

16.

ハンズオンスタート

17.

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

18.

Unity Hub起動 Unity Hub

19.

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

20.

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

21.

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

22.

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

23.

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

24.

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

25.

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

26.

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

27.

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

28.

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

29.

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

30.

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

31.

表示オブジェクトをシーンに追加 (2/4) 小さすぎてBread が見えない?

32.

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

33.

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

34.

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

35.

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

36.

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

37.

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

38.

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

39.

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

40.

NRSDKのインストール (2/5) NRSDKをダブルクリック 最新版は2.2.0 (2024年5月12日現在)

41.

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

42.

NRSDKのインストール (4/5) このウィンドウが出た場合は Accept Allをクリック

43.

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

44.

XREAL用カメラの設定 (1/3) Main Cameraを削除

45.

XREAL用カメラの設定 (2/3) Assets → NRSDK → Prefabs

46.

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

47.

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

48.

表示出力の確認 (1/2) こんな感じ

49.

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

50.

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

51.

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

52.

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

53.

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

54.

Sceneの視点調整 カメラが手前に来るようにSceneの視点を 変えると実行画面と比較しやすいかもしれない

55.

現状を保存 Ctrl/command + S

56.

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

57.

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

58.

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

59.

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

60.

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

61.

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

62.

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

63.

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

64.

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

65.

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

66.

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

67.

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

68.

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

69.

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

70.

実機で動作確認 (3/7) SDKインストール時に 設定した場合には不要 Accept All

71.

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

72.

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

73.

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

74.

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

75.

動作確認 インストールが済んだらXREALとスマホを接続し Nebulaからアプリを起動

76.

動作確認 オブジェクトが表示される

77.

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

78.

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

79.

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

80.

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

81.

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

82.

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

83.

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

84.

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

85.

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

86.

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

87.

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

88.

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

89.

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

90.

オブジェクト回転のスクリプト記述 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); } }

91.

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

92.

動作確認 Play

93.

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

94.

動作確認 停止

95.

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

96.

コントローラでオブジェクトをクリック (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) {/*スペースの都合により省略*/} } }

97.

コントローラでオブジェクトをクリック (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) {/*スペースの都合により省略*/} } }

98.

コントローラでオブジェクトをクリック (3/6) IpointerClickHandlerにカーソルを合わせる ヒントの中から「インターフェイスを実装」を選択 ※上記が表示されない場合は次のページへ

99.

コントローラでオブジェクトをクリック (4/6) OnPointerClick関数が追加される ※自動で追加されない場合は手入力でOnPointerClickを実装

100.

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

101.
[beta]
コントローラでオブジェクトをクリック (6/6)
using UnityEngine;
using NRKernal;
using UnityEngine.EventSystems;

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

102.

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

103.

動作確認 Play

104.

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

105.

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

106.

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

107.

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

108.

動作確認 停止

109.

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

110.

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

111.

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

112.

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

113.

コライダーの設定 (4/4) Center: 0 0.05 0 Size: 0.2 0.1 0.2 ※上記パラメーターは一例です

114.

現状を保存 Ctrl/command + S

115.

動作確認 Play

116.

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

117.

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

118.

動作確認(動画) https://youtu.be/uyxVuTEpdJw?si=w6j1ertfoUKoYDPK&t=11

119.

動作確認 停止

120.

動作確認(動画) https://youtu.be/uyxVuTEpdJw?si=w6j1ertfoUKoYDPK&t=11

121.

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

122.

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

123.

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

124.

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

125.

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

126.

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

127.

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

128.

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

129.

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

130.

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

131.

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

132.

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

133.

コントローラ押下と解放の検知 (2/5) IpointerDownHandlerにカーソルを合わせる ヒントの中からインターフェイスを実装を選択 ※上記が表示されない場合は次のページへ

134.

補足 ※自動で追加されない場合は手入力でOnPointerDownを実装

135.

コントローラ押下と解放の検知 (3/5) IpointerUpHandlerにカーソルを合わせる ヒントの中からインターフェイスを実装を選択 ※上記が表示されない場合は次のページへ

136.

補足 public void OnPointerUp(PointerEventData eventData) { throw new System.NotImplementedException(); } ※自動で追加されない場合は手入力でOnPointerUPを実装

137.

コントローラ押下と解放の検知 (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() { } }

138.
[beta]
コントローラ押下と解放の検知 (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()
{
}
}

139.

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

140.

動作確認 Console

141.

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

142.

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

143.

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

144.

動作確認 停止

145.
[beta]
不要なコードを削除
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()
{
}
}

146.

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

147.

コントローラ押下でオブジェクト移動 (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; }

148.

現状を保存 Ctrl/command + S

149.

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

150.

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

151.

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

152.

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

153.

動作確認 Play

154.

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

155.

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

156.

動作確認 https://youtu.be/uyxVuTEpdJw?si=37zqqFeivLbDkLBD&t=29

157.

動作確認 停止

158.

実機での動作の様子 https://youtu.be/uyxVuTEpdJw?si=37zqqFeivLbDkLBD&t=29

159.

オブジェクトの前後移動 (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; }

160.
[beta]
オブジェクトの前後移動 (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;
1
//タッチ位置を取得し、yの絶対値>0.6なら前後移動
Vector2 p = NRInput.GetTouch();
if (Mathf.Abs(p.y) > 0.6f)
{
transform.Translate(Mathf.Sign(p.y) * controller.forward
-1
* moveSpeed * Time.deltaTime);
}
}

161.
[beta]
オブジェクトの前後移動 (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);
}
}

162.

動作確認 Play

163.

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

164.

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

165.

動作確認 https://youtu.be/uyxVuTEpdJw?si=ElkwoYB1T4exC1OR&t=36

166.

動作確認 停止

167.
[beta]
オブジェクトの左右回転
//移動速度
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 );
}
}

168.

動作確認 Play

169.

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

170.

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

171.

動作確認 停止

172.

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

173.

ここまでの成果(実機) https://youtu.be/uyxVuTEpdJw?si=ElkwoYB1T4exC1OR&t=36

174.

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

175.

現状を保存 Ctrl/command + S

176.

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

177.

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

178.

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

179.

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

180.

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

181.

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

182.

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

183.

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

184.

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

185.

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

186.

壁を表示 (2/8) Crate Empty

187.

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

188.

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

189.

壁を表示 (5/8) Shooter

190.

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

191.

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

192.

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

193.

動作確認 Play

194.

動作確認 壁が表示される

195.

動作確認 停止

196.

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

197.

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

198.

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

199.

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

200.

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

201.

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

202.

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

203.
[beta]
発射スクリプトの記述 (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);
}
);
}

204.

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

205.

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

206.

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

207.

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

208.

動作確認 Play

209.

動作確認 弾が発射される

210.

動作確認

211.

動作確認 停止

212.

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

213.

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

214.

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

215.

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

216.

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

217.

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

218.

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

219.

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

220.

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

221.

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

222.

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

223.

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

224.

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

225.

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

226.

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

227.

動作確認 https://youtu.be/uyxVuTEpdJw?si=v0kF11CDsHaPoN8Q&t=68

228.

参考 • クイックスタート https://xreal.gitbook.io/nrsdk/nrsdkfundamentals/quickstart-for-android • コントローラ詳細 https://xreal.gitbook.io/nrsdk/nrsdkfundamentals/xreal-devices/controller • 前回のNreal Lightハンズオン https://www.slideshare.net/ssuserc0d7fb/nreallight • 今回のプロジェクト https://github.com/TakashiYoshinaga/XREALSampl eScenes