はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Nreal Airを買ったので空中の立方体がくるくる回るアプリを作ろう

前回:
hatsune.hatenablog.jp

準備

開発環境

  • Unity 2021.3.14f1
  • Visual Studio 2022 (Community 2019なども可)
  • NRSDK 1.9.5

環境整備:詳細は前回参照

  1. NRSDKのインポート
  2. NRSDKのTipsのFix
  3. GraphicsAPI is not OpenGLES3の対応

新規プロジェクト作成

Unity Hubからプロジェクトの新規作成を行います。

オブジェクト配置:詳細は前回参照

  1. Hierarchyへのプレハブ(NRCameraRig、NRInput)の追加
  2. HierarchyからのMainCameraの削除
  3. HierarchyへのCubeの追加、位置や大きさの調整

C#エディタの設定

[Edit]-[Perferences]メニューから[External Tools]の[External Script Editor]で使用するVisual Studioを選択します。
VSCodeなども選べますが、今回は愛用している「Microsoft Visual Studio 2022」を選択しました。

アプリ作成

今回は、前回配置した立方体をくるくる回すアプリなので、くるくる回すためのスクリプトC#コード)を作成して、それを立方体に割り当てて動くようにしていきます。

スクリプトの作成

[Project]領域で[Assets]フォルダを選択してから、[Assets]-[Create]-[C# Script]メニューをクリックすると、[Assets]フォルダに「NewBehaviourScript」というファイル名でC#のコードを書くためのファイルが生成されます。
今回は、名前を「Interaction」とリネームして使います。

gist.github.com

くるくる回すコードを書く

Unityでオブジェクトをくるくる回す方法はいくつかありますが、今回は、Rigidbodyを追加してポインタが当たっている間だけangularVelocityに加速度を設定してあげることで回転させてみたいと思います。
gist.github.com

RigidBodyの追加

StartメソッドでRigidBodyをgameObject = スクリプトを割り当てたオブジェクトを追加しています。

this.Body = gameObject.AddComponent();
this.Body.useGravity = false;
this.Body.angularDrag = 0f;

これはオブジェクトに物理法則を割り当てることになるため、デフォルトのままだと重力が働いてオブジェクトが自由落下を始めてしまうため、useGravity = falseを設定しています。
また、angularDrag = 0fとすることで空気抵抗をなくして回転し始めたらずっと同じ速度で回転するようにします。

ポインタがあたっているときは回転する

Interactionクラスに「IPointerEnterHandler」インターフェースを追加して「OnPointerEnter」イベントがキャッチできるようにします。そのイベントが発生したときに呼び出される「OnPointerEnter」メソッドの中では、angularVelocityに対して、y軸に2の加速度を設定することで、くるくる回します。

this.Body.angularVelocity = new Vector3(0, 2f, 0);

ポインタがはずれたときは停止する

Interactionクラスに「IPointerExitHandler」インターフェースを追加して「OnPointerExit」イベントがキャッチできるようにします。そのイベントが発生したときに呼び出される「OnPointerExit」メソッドの中では、angularVelocityに対して、Vector3.zeroで加速度を0にすることで回転を停止します。

this.Body.angularVelocity = Vector3.zero;

くるくる回すコードをCubeに割り当てる

[Hierarchy]で「Cube」を選択して、「Cube」の[Inspector]を表示したら、そこに「Interaction」をドラッグ&ドロップします。
そうすると、「Cube」の[Inspector]に「Interacton(Script)」という項目が追加され、OnPointEnterとOnPointExitのイベントで「Interaction」クラスのコードが呼びされるようになります。

Unity Editor上での確認

プログラムが完成したら、Unity上で実行して動作を確認します。
ポインタの移動は、Shiftキーを押しながらのマウス操作で可能です。
ポインタがCubeに当たると回転し、外れると回転が止まります。

実機動作

一通り動作が確認できたら、実機をUSBで接続後に[Build Settings]で[Run Device]に実機を指定して[Build And Run]で実機転送します。
転送が完了したら、PCとのUSB接続ケーブルを外して、Nreal Airを繋いで起動します。
youtube.com
手元のAndroid端末を動かせばポインタも動くのでCubeに当てたり外したりして回転させてみましょう。