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にして衝突だけ検知できるようにします。

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

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

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

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

操作パネルとボタンを作っていきます。ダッシュボードと呼ばれています。

少々複雑で頭が混乱してきたので、整理します。

こんな感じの操作パネル。 スタートとストップのボタン

やること

  1. UIのCanvasプレハブを作る。
  2. ボタン付きのダッシュボードを作る。
  3. 操作対象物をシーンに追加して、ボタンと接続する。
  4. ボタンを有効にするスクリプトを書く
  5. ボタンを見ているときにハイライトするスクリプトを書く
  6. ボタンがハイライトしているときだけボタンが有効になるスクリプトを書く
  7. 標準カーソルのスクリプトを流用して、ダッシュボードを見ている時だけボタンを有効にする。

DefaltCanvasプレハブを作る

UI>Canvas を作って DefaultCanvasというプレハブを作っておきます。後でいろんなUIを作るときの素材にします。

3D空間では単位がmでしたが、Canvasは別の座標系を持っているので、数値が良くわからないです。

  1. Camvasの名前をDefaultCanvasに変えます。
  2. Inspectorの設定はPos X,Y,Z =(0,0,0) で3D空間の原点。
  3. Width,Height=(640,480) にしておきます。縦横比0.75が良いようです。
  4. Scaleは(0.0135,0.0135,0.0135)にします。こうすると、3D空間(world空間という)上での1ピクセルに相当するようです。
  5. Render ModeをWorld Spaceにします。これは解りません。

 次は、Canvasの子要素ImageとTextのサイズ調整です。

  1. DefaultCanvasの子要素にImageとTextがデフォルトでくっついていいますので、Imageを選んでInspectorのAnchorをStretchにして、サイズいっぱいに引き伸ばしておきます。(まだ絵がないから何も見えませんが・・・)
  2. TextはText(Script)になんか書いて、Characterのサイズをいじって、Paragraphでセンターに寄せて、overflowにして色つけてやると、文字が書けます。
  3. DefaultCanvasに戻って、Canvas Scaler(Script)>Dynamic Pixels Per Unitを10に増やすとTextの解像度が上がり、見やすくなります。

この状態でプレハブにしましょう。

次回:ボタン付ダッシュボードを作る

次回はDefaultCanvasプレハブをシーンに追加していじっていきましょう。

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

仮想空間VR:AIThirdPersonControllerをあれこれいじってみた

こんにちは (‘ω’)ノかずまなぶ です。

わたしのVR空間にだんだんと人が集まってきました。紹介します。

アイドルのおっかけ

  1. 先日紹介しました、アイドルのおっかけです。ユニティちゃんはロコモーションなのでPCのキーボードで自由に動けるのですが、それをずっと追っかけていきます。
  2. おっかけはAIThirdPersonControllerプレハブでAICharacterControlスクリプトのTargetをWalkTargetに設定しています。
  3. walkTargetはEmptyの名前を変えただけのオブジェクトです。追跡対象であるユニティちゃんの子オブジェクトにいれています。
  4. 言い換えれば、おっかけはユニティちゃんではなく、ユニティちゃんの保有するWalkTargetオブジェクトに反応しているのです。
  5. 星白しずかのエナがいつもカビザシを見つめているような感じです。ランカ・リーのVウィルスだったり、バサラのアニマスピリチアだったりもします。解らなかったらスルーしてください。

石盤のおっかけ

  1. アイドルのおっかけを改良して、追跡対象をユニティーちゃんから、地面を這う石盤に変更した「石盤のおっかけ」です。
  2. ユニティちゃんのときは追跡対象のユニティちゃんの中にTargetを入れていましたので、今回は石盤(cylinderオブジェクト)にTargetを入れていると普通は思いますが、違います。
  3. AIThirdPersonControllerプレハブのAICharacterContorolスクリプトのTargetをWalkTarget_lookMoveToオブジェクトにし、LookMoveToスクリプトを適用しています。
  4. LookMoveToスクリプトでは、カメラ目線の始点座標とベクトルを調べ、そのベクトルの延長上に何かしらのオブジェクトがあり、それが地面(変数ground)だったら、その座標にWalkTarget_lookMoveToオブジェクトを移動させるのです。変数GroundにはInspectorパネルからGroundPlaneを適用します
  5. そして、目線によって任意に動かすことができるようになったWalkTarget_lookMoveToオブジェクトに対してはcylinderオブジェクトという実体を与えて(子にして)、目で見ることができるようにしました。
  6. ゲームを実行してみると、目線の先に常に石盤がいるかと思います。

うろちょろゾンビ

  1. ランダムに出現する見えないターゲットに向かってひたすら歩き続けます。ターゲットは5秒間隔で移動します。
  2. AIThirdPersonControllerプレハブのAICharacter ControlのTargetにWalkTarget_Randomオブジェクトを適用する。
  3. WalkTarget_RandomオブジェクトはRandomPositionスクリプトを持ちます。
  4. RandomPositionスクリプトがWalkTarget_Randomオブジェクトの座標を移動させます。

バイツァーダストの被害者

  1. 目線を合わせると、赤いパーティクルが体を包み3秒後に爆死!します。
  2. 何回でもリスポーンしますので、タイミングよくバイツァーダスト!と叫びましょう。要練習です。
  3. AIThirdPersonControllerプレハブのThirdPersonCharacterスクリプトには何もいれません。こいつは特になにかの目標に向かって移動する知能は与えていません。爆死能力だけです。AudioSourceに爆発音だけ入れましたが、機能していません。(課題です)
  4. EmptyからGameControllerを作ります。killTargetスクリプトとAudioSource爆発音をコンポーネントとして追加しました。AIThirdPersonControllerプレハブの中にGameControllerを入れておきましょう。
  5. killTargetスクリプトにはTarget , Hit Effect , Kill Effect , Time To Select , Score、といったいろいろなものをセッティングできるようにしました。
  6. killTargetスクリプトでは、カメラ目線をレイとし、レイが変数targetに当たっていたら、当たっている座標にEffiectを出し、設定時間経過後にkillEffectを出し、そのあとに新しい座標にリスポーンします。
爆死!(; ・`д・´)

仮想空間VR:ユニティちゃんをジャンプさせる

こんにちは、(; ・д・´)圧倒的かずまなぶ です。

ユニティちゃんがジャンプできないので、小一時間かけて解決した記録をUPしておきます。

走っているときにスペースキーを押すと、ジャンプするはずですが、ジャンプして、浮いた瞬間にスクリプトが止まってしまいます。Projectパネル横のConsoleパネルで確認できます。

UnityChanControlScriptWithRgidBody.csを開いて(エラーログをダブルクリックでもいけます。)

126行目

cameraObject.SendMessage("setCameraPositionJumpView"); // ジャンプ中のカメラに変更

で引っかかっているので、//でコメントアウトします。

ジャンプ中にカメラが切り替わるようですが、そんなカメラ作った覚えはないですし。

それだけ。以上 圧倒的かずまなぶ でした。(; ・д・´)