今回は音付けとUIをメインにやってみます
BGM
部屋ごとにBGMをつけようかなと思い、探しているのですがBGM探すのって大変ですね。マジで正解がわからないし、一つ一つ聞いていくの時間かかるし
そもそも私センスないと思う。
AIで画像の雰囲気からBGM提案してくれる機能ないのかな?画像から作るやつじゃなくて推薦がいいけどそういうのはなさそう。
VR彼氏
イケメンの男の部屋って何が流れているんですかね?ジャズっぽいのを探しましたが、そもそもジャズがどんなのかもよくわからなくなりました。
結局ピアノのゆっくりとした少し悲しい感じのにして、エッチな感じにしました??
ガンシュミレーター
PUBGみたいなBGMが良かったのですが、検索の仕方がよくわかりませんでした。
ホーム画面
この真っ白な空間に合う曲ってなんだろう?ここはBGMなしでもいいかな?って思ったのですが、VR空間で試してから決めてみます。
VR彼氏
写真保存
前回自撮り棒とカメラを導入したので今回はちゃんと写真が撮れるようにします。
こちらの記事のスクリプトを参考にしました。
とりあえずこのまま使うと、projectfolderのいちばん上の層にファイルが保存されます。
また何度も取るとファイルは勝手に上書きされます。ということで現在時刻をファイル名に入れて何枚も保存できるようにします。
date = System.DateTime.Now.ToString();
File.WriteAllBytes(Application.dataPath + "/../karecap"+date+".png", bytes);
これでできるかと思ったのですが・・・errorが出て保存されませんでした。
あっなるほどデフォルトだと2017/4/10みたいに日付にスラッシュが入っているのでパスがナンチャラカンチャラになっているのか!
ということでスラッシュが入らない形式にこのサイトを参考に変えました。
ToStringの後のカッコの中にMMddhhmmssと書けば良いのです!
date = System.DateTime.Now.ToString("MMddhhmmss");
無事できました。連射しても秒が違うので複数枚保存されています。
これ、配布した時にどこに保存されるんでしょうね?まあ今の所配布する予定ないので気にしません。
トリガー入力
トリガーを引いた時にこれを実行するのは案外複雑そうです。
VRTKのサンプルの002_Controller_Eventとそこについている
VRTK_ControllerEvents_ListenerExample.cs
が全てのコントローラー入力の参考になります。
まず[VRTK_Script]下のControllerオブジェクトに、
VRTK_Controller_Eventsをつけます。
ここでどの基本動作がどのボタンの操作になるかを設定できます。基本的にはいじらないほうがユーザーは楽なのかな?
詳しい説明は下のリファレンスがわかりやすいです。
次に独自スクリプトです。トリガーを引いた時に写真を撮るという場合は、
using VRTK;を書いた状態で、
void startに
if (GetComponent<VRTK_ControllerEvents>() == null){
VRTK_Logger.Error(VRTK_Logger.GetCommonMessage(VRTK_Logger.CommonMessageKeys.REQUIRED_COMPONENT_MISSING_FROM_GAMEOBJECT, "VRTK_ControllerEvents_ListenerExample", "VRTK_ControllerEvents", "the same"));
return;
}
VRTK_ControllerEventがなかった時にエラーメッセージを吐く処理と、
GetComponent<VRTK_ControllerEvents().TriggerPressed +=
new ControllerInteractionEventHandler(DoTriggerPressed);
というトリガーを深く引いた時の状態?を書き、次に
private void DoTriggerPressed(object sender, ControllerInteractionEventArgs e)
{
savePng ();
}
という関数?を書いてその中にsavePng()関数?を書きます。
その後別のところにsavePg()の中身(写真を撮る)を書いたら、トリガーを引いた時にsavePng()が実行されるのではないでしょうか。
using関数を使わないみたいです。
そしてこの独自スクリプトはさっきのコントローラーと同じ場所にくっつけます。
シャッター音
audiosource(をつけているオブジェクト)をpublicで参照して、
public AudioSource audioSource;
鳴らしたい場所で audioSource.Play (); と書けば良さそうです。
銃を撃った時も同じようにしました。
おまけ
ちょうど記事を書いている時にGoogleが3D素材サイトPolyを発表したので試しにダウンロードして見ました。
ユーザー投稿型で、利用規約も提供者によってバラバラでした。今回ダウンロードしたViveのHMDのモデルは著作者を表示したら自由に使っていい、CC-BYライセンスです。
カレピッピにかぶせて見ました。頭に大きさを合わせるのは難しいですね。
メニューボタンからホームに戻る
よくVRゲームであるメニューボタンを押して表示されたUIから「ホームに戻る」を選ぶやつをやろうと思います。
VRTKのサンプルの34番がとても参考になります。
メニューキャンバス作成
まず表示するメニュー画面を作りました。
新しいcanvasを作ってworld spaceにして、ボタンを二つ置きます。
ちなみに文字がぼやける時はCanvasのDynamic Pixels Per Unitを少し大きくすると治りました。ただ重くなるらしいです。
canvasにはVRTK_UI Canvasをつけます。これがないとコントローラーのPointerで選ぶことができません。
そして普通にボタンクリックしたら、ホーム画面に戻るようにスクリプト書いて、ボタン に付けます。
メニュー表示
次にVRでメニューを表示する方法ですが、形式としては、
・空間に固定でメニューを表示して、コントローラーのポインターで選ぶ
・頭の先にメニューを表示して、コントローラーで選ぶ
・片方のコントローラーの先に表示して、もう片方のコントローラーで選ぶ
方法が多いと思います。
今回は片方(左)のコントローラーの先に表示します。
Left Controllerの子にキャンバスを設置して、少し先に表示されるように移動します。
VR被ってなくてもシュミレーターである程度の位置はわかります。
そしてLeft Controllerにつけるスクリプトはこんな感じになります。
メニューボタンでmenucanvasをアクティブにします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRTK;
using UnityEngine.SceneManagement;
public class home : MonoBehaviour {
// Use this for initialization
void Start () {
GetComponent<VRTK_ControllerEvents>().StartMenuPressed += new ControllerInteractionEventHandler(DoStartMenuPressed);
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown (KeyCode.Space)) {////////////非VR環境用
SceneManager.LoadScene ("home");
}
}
private void DoStartMenuPressed(object sender, ControllerInteractionEventArgs e)
{
SceneManager.LoadScene ("home");
}
}
ポインターで選択
Right Controllerでポインターでメニューを選べるようにします。
メインとなるのはVRTK_UIPointerだと思います。
あとこの二つのポインターもつけて置きます。
これをメニューが表示されている時だけUI Pointerが出るようにするにはどうすればいいのでしょう。
私はここで初めて公式のリファレンスページを見ました。
今までずっと日本人の記事ばっかり見てたけど、さすがに深いところまで行くと情報がなくなってくる。公式を見るのが一番!!!
UIPointerスクリプトを使っているサンプルの番号やその詳細まで書いてくれてる!もっと早く見れば良かった。
最後に
今まで先人たちの記事を見ながら真似していっていたけど、今回の実装は結構オリジナルで頑張った部分もあり、疲れましたが達成感もありました。
公式のリファレンスを読むのが大事だということを改めて学びました。この際英語とか関係ないから。
VRTKの情報はまだ日本語ではそこまで多くないので公式を見ましょう。(過去の自分へ)
参考