ぼくの息抜き

ぼくの息抜き

気ままな二人が記事を書くことで息抜きしていくブログ

CSS MenuMaker

【VR,OculusGo,Unity】素人がコントローラーでオブジェクトを動かす

f:id:bokunoikinuki:20180903124329p:plain



掴んでもの投げたい!

Virtual VRのゲームやってVR空間はもの投げてこそ楽しいということを強く実感した。

一歩ずつ行こう。

まずはコントローラーでオブジェクトを操れるようにしよう。

コントローラーでオブジェクトを操る

情報収集

  1. 【Unity / Oculus Go】Oculus Goコントローラー表示方法とボタン取得方法 - ソースに絡まるエスカルゴ

  2. UnityのVector3.DIstance()よりもVector3.sqrMagnitudeを使いましょうという話 - ただの適当な開発記

  3. 【VR】Oculus Go Unityでコントローラーを追加し移動してみる - helloworlds

  4. UnityでOculus Goの開発環境をセットアップしてみた - Yoshidayo diary

情報収集して思ったこと

// ヒットしたオブジェクトを取得// ヒットしたオブジェクトを取得 GameObject obj = hitInfo.collider.gameObject;

 これでRayと衝突したオブジェクト取得できるのか。すげー。

 Vector3 maxScale = new Vector3(5f,5f,5f);

// スケールの各値が5より小さい場合は0.1大きくする

if (scale.sqrMagnitude < maxScale.sqrMagnitude) {

sqrMagnitudeってなに?

二番目の参考記事によるとVector3.magnitudeとの違いは

  1. 値の精度のロスを減らせる
  2. パフォーマンスが向上する

という二つの利点があるらしい。そもそも英語でmagnitudeは大きさらしい。

実践

情報収集の結果参考記事1番目の『ソースに絡まるエスカルゴ』さんの記事がわかりやすかったので、参考にさせてもらってサンプルを作る。

参考記事

【Unity / Oculus Go】Oculus Goコントローラー表示方法とボタン取得方法 - ソースに絡まるエスカルゴ

やること

  • レーザーポインターとポインターを再度作る
  • ヒットしたオブジェクトを取得

レーザーポインターを復習がてら1から作る。

パッケージ化という技を覚えた!

VRでもう6つくらい新しいプロジェクトを作っているのだが、毎回

  • 『Oculus Integration』をインポート
  • 『OculusUtilities.unitypackage』でアップデート

という手順踏むのは飽きた。

ということで自作のunitypackageをインポートして、新規プロジェクトで作ってレーザーポインターを作って行く。

1.新規プロジェクトインポート

LaserPointerの出し方はこの記事で書いたので、手順は箇条書きだけ書く。

【VR,OculusGo,Unity】素人がレーザーポインターを出すやり方を実践 Part2 完成! - ぼくの息抜き

  1. 新規プロジェクト作って
  2. SwitchPlatformして
  3. インポートして
  4. Build&Runできるように

f:id:bokunoikinuki:20180902145315p:plain

2.LaserPointerを出す
  1. OVRPlayerController入れて
  2. TrackedRemote入れて
  3. 空のオブジェクトでLaserPointer作って
  4. 何入れるんだっけ?LineRendererだ。入れて
  5. サイズ変えて、Material入れて、先細くして
  6. Script入れて、Anchorとかも入れて

ここで参考記事の右手、左手対応や何もない時目線での選択対応のプログラムを追加することにする。

private Transform anchor {
        get {
            // 現在アクティブなコントローラーを取得
            var controller = OVRInput.GetActiveController();

            if (controller == OVRInput.Controller.RTrackedRemote) {
                return rightHandAnchor;
            } else if (controller == OVRInput.Controller.LTrackedRemote) {
                return leftHandAnchor;
            } 

            return centerEyeAnchor;
}

これを追加して、右手、左手、なかったら目線にanchorに代入という形ができた。

3.ヒット時のPointerを出す

これも簡単

  1. LaserPointerにSphere入れて
  2. 名前をPointerに変えて
  3. 自作のScript入れて
  4. あとはMaterial入れて終了

3DObjectのPlaneで床作ってさて、ビルドして試してみよう。

あ、PointerをRayCastのヒット判定を外すの忘れていた。

4.Poiterでヒットしたオブジェクトを取得できるように

適当にCubeを配置。

f:id:bokunoikinuki:20180902170852p:plain

 

LaserPointer Scriptにこれを追加して、PrimaryIndexTrigge押し続けてた時に上に上がり、PrimaryTouchpadで下がるように

コード全文はこちら

【VR,OculusGo,Unity】素人がコントローラーでオブジェクトを動かす のコード - ぼくの息抜き

    void GetHitObject (RaycastHit hit) {
        // ヒットしたオブジェクトを取得
        GameObject obj = hit.collider.gameObject;

        if (OVRInput.Get (OVRInput.Button.PrimaryIndexTrigger)) {
            obj.transform.position += new Vector3 (0, 0.1f, 0);
        }
        
        if (OVRInput.Get (OVRInput.Button.PrimaryTouchpad)) {
            obj.transform.position += new Vector3 (0, -0.1f, 0);
        }
    }
       

 

f:id:bokunoikinuki:20180902171703g:plain

 

Rayがヒットしてるオブジェクトだけしっかり上下移動ができてる!