【備忘録】UnityでVRアプリを勉強するのに使った資料まとめ

※Meta Quest2を利用して勉強しています
※あくまで自分用です。

最終的にはピアノのMRをできたらいいなと思ってます（語彙力

いいねもらえるとモチベになるので使えるなと思ったらお願いします！

## 1.目の前にキューブがあるだけのVRアプリ
主にこの記事を見て進めた。

https://developer.oculus.com/documentation/unity/unity-tutorial-hello-vr/

〇失敗したこと
・Unityのバージョンが古すぎた（ポンコツの極みですね☆）

https://tech.framesynthesis.co.jp/unity/metaquest/

・MQDH(Meta Quest Developer hub)をインストールしていなかった。
　＋MQDHをインストールしたはいいけどADBを設定し忘れていた。
（こいつがいないとビルドしたapkファイルをquestにインストールできない、多分。）

https://developer.oculus.com/documentation/unity/ts-odh/#set-up


・apkファイルの保存先にonedriveを指定してはいけない
⇒Cドライブ直下にアプリ用のフォルダを作って解決しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/d967270a-9614-93a3-adae-6387aa517d67.png)
この画面はもう見たくないですね

**このチュートリアルで事故ってる方は下記の初期設定の項目のどれかが欠落しているだけの可能性が高いので確認してみてください。僕のように涙を流しながらやらずにすむように頑張りましょう！**

# ビルドしたアプリの起動までの流れ
①MQDHでビルドしたapkファイルをMeta Quest2にインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/0bd2bbe1-4f79-cd20-c529-4e128ddc24e3.png)

②一番右にあるオキュラスのアプリライブラリを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/2de03621-71aa-31c6-ff7c-cbee534cd0b1.png)
③検索窓を選択し、提供元不明を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/891b9a52-5804-8c4c-8c99-d2fb2626c7c0.png)
④ビルドしたアプリを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/ab0efa6d-6b07-1c6d-de57-be756056e60b.png)

# 初期設定(チュートリアルと一緒とかは知らない)

これから何度も使うのでまとめました。

・開発者モードにすること（最初だけ）

・総合SDKをインポートすること（保存しとくと便利なので初めての人はちゃんとどっかに保存しましょう）

https://developer.oculus.com/downloads/package/unity-integration/

・Build SettingからplatformをAndroidに変更し、run deviceを選択する

・Player SettingのPlayerにて
　Minimum API LevelをAndroid 10 (APIレベル29)
　Scripting backendをIL2CPP
　Target ArchitecturesをARM64のみにする

・XR Plugin Managementをインストールし、oculusにチェックを入れる

ー

・ビルド前にBuild Settingにてシーンを追加する
→最後だと忘れるので最初にやろう。アップデートしますか？ってくるので最初で問題ないです。

・ovrcamerarigはVRアプリではデフォ装備っぽいのでちゃんと入れましょう（入れないとただの静止画になります）
→ovrplayercontrollerを使う場合はデフォでovrcamerarigが入っているので入れる必要がない


# 2.起動時にパススルーを起動するだけのアプリ
↓主にはこの記事を見て進めた。

https://qiita.com/tishihara/items/9289e9bace6dbd5f934d

〇追加で見たほうがいいと思った資料
・Oculus PCアプリでやること

https://developer.oculus.com/documentation/unity/unity-passthrough-over-link/?locale=ja_JP

・パススルーの有効化について（メインで見るのはこっちの記事のほうがいいかもしれない）

https://developer.oculus.com/documentation/unity/unity-passthrough/

・話の途中でLighting Settingについて出てくるので

https://docs.unity3d.com/ja/2020.3/Manual/class-LightingSettings.html

（×ここではあまり関係ないのですがなんかしらべたので）
（背景のパススルーで見た内容でした）
・アルファ値は透明度のこと(rgbaのa)

https://game.daraha.me/basic/imagealpha/

〇失敗したこと
・最初に設定する部分でarm64にするのを忘れた。
⇒こいつじゃないと動かないらしい

# 3.最初に作ったアプリだと画面が固定なので動くように修正した

１のままだと
この画面から動かないので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/6029f862-6c6b-ce3b-68a4-740aba304a3e.png)

こんな風に動くようにする

https://x.com/RsMtJkjuAc46Nyo/status/1719001798470783208?s=20


ーーー

基本的にやることは変わらない
追加でovrcamerarigのPrefabをhierarchyに追加する。以上。
もう少し丁寧に説明すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/f803fb66-3394-7875-5db7-a901393edd5d.png)
①ovrcamerarigを検索する
②ovrcamerarigのPrefabをhierarchyに追加する
③ovrcamerarigを少しずらす(ずらさんとカメラとキューブが被る)
（④maincameraは消す）

## ４．トリガーを押すとCubeが落下するアプリ

今回はどの資料を見てもよくわからなかったのでGPT先生の力を借りてやってみました。
（調べ方が下手クソは認める）
よくわかっていない部分も多いのでそこはご了承ください。
まずは最終的にどんな感じになったか

https://x.com/RsMtJkjuAc46Nyo/status/1719763922360910279?s=20

＜新しくやったこと＞
・ovrplayercontrollerの利用
・C#で落下とコントローラー入力のスクリプトを書いた
・Rigidbodyをオブジェクトに追加した

＜話を始める前に知っておきたいこと＞
説明の前に前提として覚えておいた方がいいなという内容を少しメモります

〇ovrplayercontrollerについて

・こいつにはovrcamerarigがデフォで入っているのでこいつを使う場合は別でovrcamerarigを入れる必要はない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/f1c23c7f-c5c1-53cc-97d1-027464e82bed.png)

・ovrplayercontrollerにはデフォでCharacter Controllerがアタッチされている。「Character Controller は、物理エンジンをバイパスしてキャラクターの移動を制御する特殊な Collider の一種です。」らしいです。
⇒つまり床などを作っておかないとアプリを起動した瞬間、物理エンジンの重力の影響を受けて、地平のかなたまで落下するという現象がおきます。なのでちゃんと床は作りましょう。

〇スクリプトをクリエイトしてオブジェクトにアタッチするまでの流れ
（C#などのファイルを作って、Cubeなどに付与させることです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/bf6a73f6-db70-58a4-af23-25398f904ceb.png)

①projectの余白で右クリック、create->C#Scriptを選択
②生成されたC#のファイルをダブルクリックし、出てきたエディタで好きなようにコードを編集
③作ったC#ファイルを付与したいオブジェクトにドラッグ＆ドロップする。以上。

〇Rigidbodyについて
・「Rigidbodyは、Unityプログラミングにおいて、物理挙動を再現する機能を持ったコンポネントです。」らしいです。今回大事で何が言いたいかというとこのコンポーネントをもつオブジェクトは物理エンジンの重力の影響を受けるということです。

・このコンポーネントを追加する手順としては、
①Cubeを選択し、インスペクターにある、「add component」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/f99fd710-e4d9-feed-215d-30a3c4105877.png)
②Physicsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/a1350446-17bd-c039-7025-86e0b9767cc4.png)
③Rigidbodyを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/b516b71a-8e64-c1e8-405a-b6c0c3609f83.png)



＜手順＞
１．初期設定（ここは前にまとめてあるので失敗しないように気を付けましょう）
２．cube,ovrplayercontroller,planeをhierarchyに設置
３．スクリプトを作成し、以下のコードをコピペしてください
※スクリプトの名前は「dropcube」にしてください。スクリプト名とクラス名が異なるとUnityでコンソールエラーが出るので気を付けてください。
```dropcube.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR;

public class dropcube : MonoBehaviour
{
    private bool isHeld = true;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        // トリガーの値を取得
        if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger) && isHeld)
        {
            DropCube();
        }
        
    }
    void DropCube()
    {
        Rigidbody rb = GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.isKinematic = false;  // Rigidbodyの動きをアクティブにする
            isHeld = false;
        }
    }
}

```
※この部分を以下の記事の使用例を参考にして変更すれば使用するボタンをいじれる
```memo.cs
if (OVRInput.Get(OVRInput.Button.PrimaryIndexTrigger) && isHeld)
```

https://developer.oculus.com/documentation/unity/unity-ovrinput/

４．CubeにRigidbodyのコンポーネントを追加
５．Cubeを選択し、Rigidbodyの中のIs Kinematicにチェックを入れる
（これをやらないとアプリ起動時に物理エンジンがこのRigidbodyに影響を与えていきなり落下してしまう：最初は空間で止まっている状態でいて欲しいから）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/43d629b4-4c86-cf52-4d2f-31ff569e5e50.png)

https://ekulabo.com/rigidbody-is-kinematic#outline__3

６．あとはビルドして実行です。

今回は、ovrplayercontrollerを利用しているので移動も可能です。進度の実感を感じますね。
この調子でまた頑張ります。

## コントローラー入力についてのメモ

僕の言葉で一般化したりしているのでそこは注意してください。
間違ってたらごめんなさい
この記事を参考にしてます

https://developer.oculus.com/documentation/unity/unity-ovrinput/

**＜各ボタン＞**

Aボタン：One

Bボタン：Two

Xボタン：Three

Yボタン：Four

左の人差し指のトリガー：PrimaryIndexTrigger

左の中指のトリガー：PrimaryHandIndexTrigger

右の人差し指のトリガー：SecondaryIndexTrigger

右の中指のトリガー：SecondaryHandIndexTrigger


**＜入力方法＞**

ここに対して「.各ボタン」をしていけばよさそう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/22e8f8df-4260-c111-ec33-4fa08332a8bd.png)

＜コピペ用＞
OVRInput.Button
OVRInput.Touch
OVRInput.NearTouch
OVRInput.Axis1D
OVRInput.Axis2D

**＜コントロール指定＞**

Get()　：コントローラーの現在の状態を取得

GetDown()　：コントローラーがこのフレームで押されたかどうかを取得

GetUp()　：コントローラーがこのフレームで解放されたかどうかを取得

**＜OVRInputの使い方＞**

一般化すると多分こんな感じかな

```
if (OVRInput.コントロール指定(入力方法.各ボタン))
{
    //処理
}
```
## なんちゃってアステロイドを再現したい
ワールドトリガーが好きだったんでVRでやれたらいいなと思い始めましたが…

https://qiita.com/Bassiy/items/87356862f97f29b0b157

①キューブの生成
②分割
③前方に発射
いけるんじゃね？！
と浅い考えを実践した結果、今ボコボコにやられてるんですが、とりあえず進んだ分は上げてこうと思ったのでこちらの記事に上げます。参考記事ばっか上げてますが、まとまったら手順も書いていく予定です。


## ５．僕の勉強が進んだらまた追加します