今日は昼から飲んだくれ、夕方頃帰ってベッドにぶっ倒れ、22時頃に目を覚ましてからの作業。良い休日であった。
3月12日
今日やったことは以下。
- スタート時の挙動を一部追加
- デバッグ用の FPS カウンターを追加
スタート時の挙動を一部追加
ヘッドセットを被ってもらってる間に、その揺れで壁にぶつかってゲームオーバしたのでは面白くありません。そのためユーザー操作でゲームをスタートできる機構を追加します。
仕組みとしては、ゲームスタート時に棒を動かすスクリプトを一時的に無効化し、ユーザー操作で再度有効化できるようにします。
まず、昨日の BarController.cs の Start メソッドに次の1行を追加します。
1 |
enabled = false; |
これで、ゲーム開始時に、棒を動かすスクリプト自分自身を一時的に無効化できます。ちなみに、正式には this.enabled と書くのですが、this(スクリプト自身)は省略できる仕組みになっています。
次に、メインカメラ(プレーヤー)から再度有効化する仕組みを作ります。
仕組みとしては、ユーザーが棒を注視した際に棒を動かせるようにします。見ることで棒を掴む、というようなイメージです。
これには Raycast という機能を使用します。
Raycast は、ある地点から特定の方向へ無限に直線(Ray)を伸ばし、ぶつかった物(コライダー)を取得する機能です。直線の長さも指定できますが、余分なコードを省くため、今回は気にしない事にします。(と言っても2文字しか変わらないようですが)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using UnityEngine; using System.Collections; public class PlayerController : MonoBehaviour { public BarController barCon; //インスペクタから棒の制御を行うスクリプトを参照 void Update () { Ray ray = new Ray (transform.position, transform.forward); //新しい Ray を作成。カメラの位置からカメラの向いている方向へ。 RaycastHit hit; //Ray の衝突を格納するインスタンス(合ってるかしら) if (Physics.Raycast (ray, out hit)) { if (hit.collider.tag == "Bar") { barCon.enabled = true; //棒の制御を有効化 enabled = false; //一度有効になれば不要なので自分を無効化 } } } } |
以上のコードで、「Bar」というタグのついたオブジェクトが視界の中央に来た時、棒の制御を有効化できます。本当は少しの時間注視させたいんですが、それはまた今度。
あと、少しでも処理を軽量化するため、制御有効化と同時に自身を無効化しています。大した処理じゃないし問題ない程度だろうけど、モバイルだし、無駄な処理が毎フレーム走ってるのはキモチワルイので。
デバッグ用の FPS カウンターを追加
VR において、フレームレートの確保は最重要課題の一つです。最大速度を少しでも割り込めば、違和感となって乗り物酔いと同等の気持ち悪さを人に与えてしまいます。(もちろん個人差もあるし、他にも酔う要因は様々)
とは言え、何はともあれまずはフレームレートを見なければいけません。Unity には、Unity Profiler というパフォーマンス測定の機能があり、実機の状況すら確認できるスグレモノですが、少なくとも Gear VR と Galaxy S6 においては、プロファイリング自体の負荷でめちゃくちゃパフォーマンスが下がります。何も置かないまっさらのシーンでも30 FPS を割り込みます。Gear VR は60で動作する必要があるので、オハナシになりません。
自分がなにか間違えているのかもしれませんが…どうにも出来なかったので、とりあえずゲーム内に FPS 表示の仕組みを自分で実装します。
仕組みとしては、毎秒1秒間に Update 関数が実行された回数を計測します。これでほぼ確実な計測が可能なようです。
シーンにテキストを配置し、これを以下のスクリプトで毎秒更新します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using UnityEngine; using System.Collections; using UnityEngine.UI; //テキストなど UI 用の要素をいじるにはこの名前空間が必要。 public class FPSCounter : MonoBehaviour { int fps; //FPS 計測用の整数 Text tx; //表示用テキスト void Start () { StartCoroutine (Count ()); } void Update () { fps++; //変数に Update 関数の実行回数を溜めていく } IEnumerator Count () { tx = GetComponent<Text> (); //テキストコンポーネントを参照 while (true) { //無限にループさせる tx.text = "FPS: " + fps; //テキストの表示を更新 fps = 0; //FPS カウンターを0にリセット yield return new WaitForSeconds (1); //1秒待つ } } } |
これで毎秒の FPS を見られるようになりました。
この手法の問題として、毎秒更新なので重い瞬間がいつなのかわかりにくい点があります。でもまあ今は問題になっていないので完了。
“Avoid The Walls 開発日記 2” への2件のフィードバック