Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nreal Light / Air 開発入門ハンズオン

Nreal Light / Air 開発入門ハンズオン

2022/04/29に開催のハンズオン資料

TakashiYoshinaga

April 29, 2022
Tweet

More Decks by TakashiYoshinaga

Other Decks in Technology

Transcript

  1. ハンズオン⼿順 オブジェクト 配置 p Unityプロジェクトの作成 p NRSDKの基礎 p オブジェクトのクリック検知 p

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

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

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

    オブジェクトのマニピュレーション p ヘッドトラッキングの活⽤ p 何もないところでのクリック検知 p uGUI操作
  5. オブジェクト回転のスクリプト記述 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); } }
  6. 回転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になるまで回転しない
  7. コントローラでオブジェクトをクリック (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) {/*スペースの都合により省略*/} } }
  8. コントローラでオブジェクトをクリック (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) {/*スペースの都合により省略*/} } } クリック関連のインターフェース
  9. コントローラでオブジェクトをクリック (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関数内のコードを削除
  10. コントローラでオブジェクトをクリック (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を切り替え
  11. コントローラ押下と解放の検知 (1/5) using UnityEngine; using NRKernal; using UnityEngine.EventSystems; public class

    Manipulation : MonoBehaviour ,IPointerDownHandler, IPointerUpHandler { void Start() { } void Update() { } } コントローラ押下開始 コントローラ押下終了
  12. コントローラ押下と解放の検知 (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() { } }
  13. コントローラ押下と解放の検知 (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() { } }
  14. 不要なコードを削除 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() { } }
  15. コントローラ押下でオブジェクト移動 (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; }
  16. オブジェクトの前後移動 (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; }
  17. オブジェクトの前後移動 (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
  18. オブジェクトの前後移動 (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); } }
  19. オブジェクトの左右回転 //移動速度 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 ); } }
  20. 弾を発射するスクリプトを作成 (1/5) NRInput → Right → ControllerTrack → ModelAnchorを⾒つける [補⾜]

    弾を発射したいオブジェクトに次⾴で作るスクリプトを貼り付ける。 例としてコントローラを指定しているが、NRCameraRig内の CenterAnhorに貼れば頭から発射も可能
  21. 発射スクリプトの記述 (2/6) using UnityEngine; using NRKernal; public class ShootBullet :

    MonoBehaviour { //発射する弾の元データ public GameObject bulletPrefab; //実際に空間に放たれる弾 GameObject bullet; void Start() { } void Update() { } }
  22. 発射スクリプトの記述 (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); } ); }