旧称 VR イライラ棒。Avoid The Walls を作る日記です。
ゲームらしいゲームを作りたくなって、イライラ棒が簡単に作れて VR 向きで良さそうだったので挑戦中。
果てさてどこまでやれるのか…今日は1日目。
3月10日
- プラン決め
- コアとなる棒の動きを実装
- 壁にぶつかったら反応を返す
- スカイボックスの変更
プラン決め
ざっくりと作るもののプランを決める。コアな目標だけあればよくて、細かく決めてもどうせ諸々の事情が生まれて変わるし、固執すると自分を縛ってしまって歩みが遅くなるので。
下記のようなテキストファイルを作成。軽い軽い。しかし今見ると矛盾しそうな点がちらほらあるな…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
概要 囲まれたコースの中に棒を通していく。移動は視点変更に連動。 そんなにグイグイ回さなくても移動が容易かつ、ピーキー過ぎて肩こりしやすくはならないようなバランスにできるといいな。 視点変更ができること ・ボタンか何かで左、中央、右の位置を変更できる。 ・上部に遷移ボタンを置いてそいつを見つめるのがいいかも。 壁にぶつかるとやり直し ・0.7秒くらいボタンを見つめることでスタート可能になる。 ・将来的には水に囲まれてるのがバッシャーンとなるのがいいかも。 ステージはver1で3つ 1:チュートリアルになるコース 2:動くものが出てくる 3:視点移動が必要 |
コアとなる棒の動きを実装
棒がカメラ=頭の動きと連動してそれらしく動くようにします。
GearVR 想定なので(ポジトラがないので)、MainCamera の Rotation のみを取得し、これを棒の Position に反映させます。
1 2 3 4 5 6 7 8 9 10 |
Vector3 pos; Quaternion camerarotation; void Update () { pos = transform.position; camerarotation = MainCamera.transform.rotation; pos.x = camerarotation.y * 7f; pos.y = camerarotation.x * -5f; transform.position = pos; } |
Quaternion についてはまだよくわかってません。x, y, z で軸の方向を指定して、その軸で w の分だけ回すんじゃないのかしら。回転かけるときにはそれで良くても、取得するときには違うのかもしれない…とインスペクタで値を見ながら DK2 を回して思うのであった。でもとりあえずこれで狙った動きになった。
1つ注意したいのは、DK2 と Gear VR では得られる回転の軸方向が逆っぽいということ。いざビルドしてみたら、DK2 と逆に動いて??となった。そういう違いを吸収するのがUnity の仕事なのでは?(DK2 は開発機だから知らないよって事かしら?あるいは実行環境によって軸の方向を変える設定があるとか)
壁にぶつかったら反応を返す
壁を避けるゲームなので、壁にぶつかっても何も起こらないのでは楽しくありません。
将来的には要素を重ねていくにしても、とりあえず意味がわかるくらいにはしようと実装。(というより OnCollisionEnter をそういえば使ったことなかったなと思って)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public Camera MainCamera; public Color ChangeColorTo; Renderer _renderer; void Start () { _renderer = GetComponent<Renderer> (); _renderer.material.EnableKeyword ("_Color"); } void OnCollisionEnter () { _renderer.material.SetColor ("_Color", ChangeColorTo); } void OnCollisionExit () { _renderer.material.SetColor ("_Color", new Color (1, 1, 1)); } |
棒の色が変わるだけです。
スカイボックスを変更
デフォルトでも別にいいし、スカイボックスだけ変えたところで VR 的な価値は何ら向上しないわけですが、余りに素の状態なので Asset Store から適当に見繕います。ちょうど無料セールしてたのを使用。
最終的にこうなりました。
まとめ
初め Quaternion 同士を足そうとして膝にエラーを受けたり(最終的には float 4 つの構造体なんだから足せたっていいじゃんと思う)していたら2時間くらい飛びました。
そういえば Start 関数のコストなんてそんなに考えなくてもいいんだろうけど、インスペクタで参照を指定しておくのと、Start 関数で GetComponent するのってどっちがローコストなんでしょう。やっぱ前者かな。コードも短くなるし、可能なシチュエーションではそうするべきか…あんまり増えるとインスペクタの表示領域を圧迫するわけですが。
今回のスクリプトファイル全文はこちら。
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 27 28 29 30 31 32 33 |
using UnityEngine; using System.Collections; public class BarController : MonoBehaviour { public Camera MainCamera; public Color ChangeColorTo; Renderer _renderer; void Start () { _renderer = GetComponent<Renderer> (); _renderer.material.EnableKeyword ("_Color"); } void OnCollisionEnter () { _renderer.material.SetColor ("_Color", ChangeColorTo); } void OnCollisionExit () { _renderer.material.SetColor ("_Color", new Color (1, 1, 1)); } Vector3 pos; Quaternion cameraRotation; void Update () { pos = transform.position; cameraRotation = MainCamera.transform.rotation; pos.x = cameraRotation.y * 7f; pos.y = cameraRotation.x * -5f; transform.position = pos; } } |
そんなこんなで次回はこちら
“Avoid The Walls 開発日記 1” への1件のフィードバック