VR:オブジェクトを発射する

Keita_Nakamoriです。

前回やった、オブジェクトの召喚(Summon.cs)を発展させて、出現と同時に、別のスクリプト(Shooter.cs)を追加し初速度を与えることにより、砲弾のようにオブジェクトを前方へ発射させてみましょう。

スクリプト Shooter.cs

これはまだ、Summon.csと同じく、オブジェクトを召喚するだけです。

Shooter.csを設置するヒエラルキーの場所

新規にEmptyObjectを追加し、オブジェクトの名前をわかりやすくShooterにします。

置き場所はどこでもいいのですが、オブジェクトを発射するのは自分であるということで、MeMyselfEyeに入れました。またDayDreamコントローラーのAppボタンによって発射するということで、GrvControllerPointerの下に入れました。

インスペクターに Objectをアタッチする

Bullet Object : 砲弾として打ち出すオブジェクト。今回はCubeで作ったボール上のものを設定した。

Mazzle Psition:オブジェクトを出現させる初期位置のオブジェクト。今回は目の前のカーソルを設定した。

Shooter2.cs

では、Shooter.csで召喚したモンスターボールオブジェクトに対して、当該Shooter2.csによりオブジェクトに初速を与えてみます。Shooter2.csはモンスターボールオブジェクトのインスペクターに設置します。

ShooterDestroy.cs

オブジェクトを召喚しすぎると、処理が重くなってしまい、最悪フリーズします。

定期的にオブジェクトを壊す(Destroy)して数を減らさなくてはなりません。

こちらも、モンスターボールオブジェクトのインスペクターの中にいれます。

以上です。

VR:Daydreamコントローラをクリックしてオブジェクトを出現させる

Keita_Nakamoriです。

前回、予め上空に配置したボールに対して、重力と反発係数を定義して、跳ねるボールたちを実装しましたが、今回は、任意のタイミングでブロックを空間に召喚しようという試みを致しました。

ヒエラルキー

GvrController群を使っていきます。説明:google公式サイト

下記のユニティパッケージをダウンロードしました。

GoogleVRForUnity_1.190.1.unitypackage

何かしらユニティプロジェクトを開いている状態で先程ダウンロードしたunitypackageファイルをダブルクリックすると、インポートが始まります。

インポートが終わったら、下図のようにヒエラルキーにGvrController関連を配置しましょう。Assets>GoogleVR>Prefab の中にあります。

GvrControllerMain

コントローラーの状態を管理するメインモジュールです。

(ユニティではモジュールはプレハブという扱いなんですね。)

GvrControllerInputをコンポーネントとして持ち、google VRコントローラーAPIへのメインエントリーポイントとして機能します。

GvrEventSystem

DayDream コントローラーがユニティイベントシステムを使用できるようにするためのモジュール(プレハブ)。通常のユニティイベントシステムから代替して機能するようになります。

GvrPointerInputModuleコンポーネントを含んでいて、こちらもユニティ標準のStandaloneInputModuleから代替されます。

GvrEditorEmulator

プレイモードの時に、ヘッドセットの動きをキーボードとマウスで代替できるようにするためのモジュールです。以前から設置していたものです。

Alt+マウス:周囲を見渡す

Ctrl+マウス:顔を傾ける

GvrInstantPreviewMain

ユニティ上でプレイモードにしたとき、スマホの画面へVR化した表示をし、さらにさらにその中で、物理的なDaydreamコントローラーを使用できるようにする機能をもつコントローラーです。

windows10デスクトップ上のタスクバー右端アイコンからBlueToothを有効にして、物理Daydreemコントローラーとのペアリングを有効にしておきます。

が、私のは動きませんでした。他になにかしらやらないと行けないようです。

別の方法として、GvrEditorEmulatorと同じようにゲーム実行中に

Shift+マウス移動 でポインターを動かすことができます。

GvrControllerPointer

ヒエラルキーでメインカメラの下層に配置することになっています。

画面上にコントローラーオブジェクトを表示します。

コントローラーの見た目を変更することもできます。

いろいろ方法があります。

1.コントローラープレハブそのものを変更する。

2.GvrControllerPointerの中にControllerVisual (3Dオブジェクト)があるので、これをお好みの3Dオブジェクトに変更する。

私はとりあえず、デフォルトで行きます。ゲームの場合は剣とか杖とかにするとカッコ良くなるでしょう。

このなかのGvr Arm Modelが若干くせもので、持っているポインターとVR上では結構ずれています。気持ち悪いので、微調整しましょう。デフォルトでは近すぎてポインター本体を見ることも困難なので、少し離しました。

スクリプト:Summon.cs

任意の3Dオブジェクトを任意の座標に召喚するスクリプトを作成しました。

インスペクタ上で 召喚したい3Dオブジェクトと召喚したい位置を定義します。

召喚したい位置については、Daydreamコントローラーの指し示す方向に定義しました。次項を参考にしてください。

召喚する位置の設定

Daydreamコントローラーの指し示す方向に定義します。

ヒエラルキーにGvrControllerPointer > Laser > reticle  がありますので、このreticleをSummon.csスクリプトのsummonPositionに代入しましょう。

ヒエラルキーからドロップインします。

以上です。では、ビルドしてヘッドセットをかぶってみましょう。

創造神になった気分にしばらく浸れます\(^o^)/

VR:重力で落下し、床でバウンドするボールを作成する

Keita_Nakamoriです。

物理エンジンを使ってみます。

重力で落下し、床でバウンドするボールを作ってみました。

コンポーネントの追加

3Dオブジェクトのスフィアを作成し、インスペクタパネルにスフィアコライダ(球状の衝突定義)とリジッドボディを追加します。

コライダ(衝突)と 反発係数の定義

スフィアコライダのマテリアルにはスタンダードアセットのBauncyをいれて、Bauncyの反発係数を0.8に修正し、ちょっとづつ跳ねなくなるようにしました。

半径Radiusは0.5をいれました。これはお好みのサイズにします。

リジッドボディで重力の定義

リジッドボディでは重力の使用にチェックを入れます。

今回は質量と抵抗の値はデフォルトにしました。

VR:目視カーソルの作り方

Keita_Nakamoriです。

視線を対象に合わせるときに、補助的なカーソルを目の前に表示させたいと思います。

ヒエラルキーには一人称視点のプレハブとして作っておいたMe My Self Eye と その下の カメラオブジェクトであるMainCamera があります。

今回はさらにMainCameraの下にキャンバスオブジェクトとしてReticle Cursorを作成し、さらにその下にRaw Imageを入れます。

このRaw Imageの中に、スタンダードアセットのテクスチャのcursor_grabをアタッチします。

かんたんですね。

VR:UI Canvasを使ってみる

keita_nakamoriです。

何かしらのテキスト情報をVR空間上に表示させておきたい時に、ユーザーインターフェースとしてCanvasというものを利用できます。

  1. ヒエラルキーにUI>CanvasをCreateしましょう。
  2. Canvasの下にUI>Imageを入れましょう。白くします。
  3. もうひとつ、Canvasの下にUI>Textを入れましょう。文字を書きます。

では、調整をしていきます。

Canvasの調整

初期値はとんでもなく巨大なので、小さくしましょう。

Imageの調整

アンカーはストレッチにしておきましょう。

カラーは若干透明にしておくとカッコいいです。

Textの調整

こちらもストレッチしておきましょう。

テキストに任意の文字を書けば完成です。

VR:パーティクルシステムとエフェクト

keita_nakamoriです。

前回、レイの使い方を学んだので、今回はレイ対象にパーティクルシステムを適用してみようと思います。

レイで対象を検知したときにパーティクルシステムを適用しながらカウントダウンし、さらにカウントダウンが終わったらオブジェクトExplosion.prefabで爆発エフェクトをかけるという手順です。

KillTarget スクリプト

物騒なスクリプト名ですが、やっていきましょう。

Targetを設定する。

爆破したいオブジェクトをGameControllerのインスペクターにドラッグしましょう。

後述しますが、パーティクルシステムとKillEffectも合わせてドラッグすると最終的に下記のようになります。

パーティクルシステムを設定する。

ヒエラルキー>Create>Effects>Particle Systemと開くとParticle Systemが作成されるので、それをGameControllerのインスペクターにドラッグしましょう。

killEffectを設定する。

Standerd Asset>Particle Prefabs>ExplosionをGameControllerのインスペクターにドラッグしましょう。

 

VR:レイキャスト

keita_nakamoriです。視線と地面オブジェクトとの交点を検出するスクリプトを書いていきましょう。

ポイントは下記スクリプトのコメントへメモっておきました。

LookMoveTo スクリプト

当該スクリプトは、前回やったWalkTargetと同様にWalkTarget2というオブジェクトをAIThirdPersonControllerが追跡するように、walkTarget2へアタッチします。

よって、名称もLookMoveToという追跡対象っぽいスクリプト名にします。

 

VR:AIThirdPersonContllor.prefabをランダムに動かす

keita_nakamoriです。

standerdAssetsのAIThirdPersonContllor.prefabの使い方を学習する過程で、C#スクリプトの書き方、変数をインスペクターパネルから操作する方法について学んでいきます。

手順

  1. AIThirdPersonContllor.prefabをシーンに適当に配置します。
  2. 追跡目標Targetを変数として持っているので、Empty Objectを新規生成しTargetとしてアタッチします。
  3. Empty Objectの名称をwalkTargetに変更しましょう。
  4. C#スクリプト RandomPosition.csを新規作成し、walkTargetにアタッチしましょう。
  5. 以降、RandomPosition.csの中身を作っていきます。

RandomPosition.cs スクリプト作成の考え方

  1. SetRandomPosition()を作成:walkTargetのtransform.positionにランダム生成した座標を代入することで、追跡目標Targetの位置を時間変化させます。
  2. RePositionWithDelay()を作成:上記SetRandomPosition()を実行するとともに、位置変更のインターバルを設定します。
  3. Start ()を作成:上記RePositionWithDelay()をコルーチンとしてゲーム開始とともに呼び出します。
  4. あとで、位置変更インターバルをインスペクターパネルから微調整できるように、時間をパブリック定義しておきます。public float waitingTime = 5.0f;
  5. void update();メソドは今回必要ないので消しておきましょう。

 

仮想空間VR:操作パネルとボタン#3

やっていきましょう 3回目です。

操作対象を設置する

  1. Standard Assets の中にパーティクルシステムとして放水ホースがあるのでシーンに適当に追加します。 Assets/Standard Assets/ParticleSystems/Prefabs/Hose.prefab
  2. InspectorからHoseを有効にします。(なぜか無効になっている)
  3. play on awakeはOFFにしておきます。
  4. Hose(script)とSimple Mouse Rotator(script)はOFFにしておきましょう。今回は使いません。
  5. Hoseの子要素にWaterShowerがあります。これが放水のON/OFFをつかさどっています。
  6. StarButtonのInspector>Button(Script)にOnclik()したときの動作を決める項目があります。プラスボタンを押して項目を増やし、WaterShawerを入れます。
  7. ParticleSystem.Playを選択します。これでボタンを押すとWaterShaweが実行されるようになりました。

こんどはStopボタンです。

違うのは、ParticleSystem.playでなくてParticleSystem.Stopにします。

まとめ

スタートボタンをマウスでクリックすると Button(script)のOn Click()関数が実行され、WaterShower(Script)を呼び出し、ParticleSystem.Play()関数が実行され、放水される。という流れになります。

次回

視線を向けた先のボタンがハイライトするようにスクリプトを書いていきます。

圧倒的かずまなぶ(‘ω’)ノ

仮想空間VR:操作パネルとボタン #2

圧倒的かずまなぶです。(; ・`д・´)

2回目やっていきましょう。

ボタンのあるダッシュボードを作成

DefaultCanvasプレハブをシーンに追加して、名前をDashboardにします。

Dashboardの子要素にUI>Row Imageを作り、これにダッシュボード的なテクスチャを張りましょう。(Image と RawImage は何が違うのか)

DashboardのInspectorを いじって、イイ感じの位置にしましょう。水平目線よりも、下において、コッチに向けるように回転させるとイイ感じになります。

  1. Pos : 0,0,0
  2. width , hight : 140 , 105
  3. scale :  4.5 , 4.5 ,4.5

Start ボタン と Stopボタンを配置する

  1. UI>ButtonをDashboardの子要素に追加する
  2. 名前をStartButtonに変更する。
  3. Posをイイ感じの場所にする。
  4. width,hight : 60,60
  5. Scale : 1
  6. Image(script)のSourceImageにButtonAcceleratorUpSpriteというStandard Assetsのスプライトを入れる。(スプライトとは)

次はStopボタンです。

スプライトだけ違うものを入れます。ButtonAcceleratorOverSprite.png

スイッチングの対応

目線のRayがダッシュボードのどこを見ているかわかるように。衝突検知用の見えない壁をつけておきます。あとで、目で爆発させるのと同様に、目でスイッチングできるようにスクリプトを書いていきます。

Dashboardの子要素にplaneを追加して、そのMesh RendererをOFFにして透明にします。Mesh ColliderはONにして衝突だけ検知できるようにします。

次回は操作対象のオブジェクトを作成します。

圧倒的かずまなぶ(‘ω’)ノ