以前、Unity に少し触れていたのですが(確か Unity4 くらいの時)、最近のVRブームを受けて(1年遅れくらいで)Unity から VR に触れたらいいなーということで、もう一回やり直してみることにしました。
Unity、すごい。
やっぱすげぇわ…… そりゃすげぇでしょ……
プロユースだもん
成果物
ブロック崩しを作成しました。 クリックでボールが飛んでブロックが消せるだけだけの超絶手抜き実装ですが、そこはご愛嬌ということで。
Unity WebGL Player | BlockEraser
調べてわかったこととかハマったところとか
ビューとか
ビューの役割とかは前にやってたときから変わってなかったので問題なし。
マウス
Input.GetMouseButtonXxxx
でマウス入力を取得する。
マウス入力を専用のクラスを作ってそこからオブジェクトを操作したかったが、Update
の中からしか操作する方法がわからず断念。
ボールを動かす
AddForce
の第4引数が未だにどういう動きをするのか理解していない。
なんとなく変数名から想像はできるが、必要になったら調べるくらいでよさそう。
ちなみに今回は最初しか使用していないので、ForceMode.Impulse
を使用。
摩擦を0、反発を1にすることで、簡単に実装できた。
変なふうにブロックとか動かすやつとかに当たると、ほぼ真横に飛んで詰んでしまうのはいただけない。縦にほぼ進まなくなったら、壁に当たった時点で若干上にAddForce
してあげるといいかもしれない。
プレイヤーを動かす
Input.mousePosition
でマウスの位置を取ってCamera.main.ScreenToWorldPoint(position)
でゲーム内座標に変換してあげる。
……だけだったはずなのに、なぜかx座標の値がずっと0のまま。
理由は、マウスの位置を取った後、z座標が設定されていないので、それを設定してからでないとゲーム内座標に変換できないらしい。
ということで最初は1f
を与えて実行してみたが、マウスに全然付いてこない。移動量が足りない。
サイトで上記のz座標に与える値が10f
だったのでそれにしてみたら移動量が上がった。
最終的に20f
にしたらいい感じについてきたが、理由はわからない。
上下とかを固定するのは、ゲーム座標に変換した後、y・z座標に固定値を入れればOK。
ブロックもろもろ
ブロックを消すのはそんなに難しくなかった。
OnCollisionEnter
はボールが跳ね返るが、OnTriggerEnter
は跳ね返らないので要注意。
ボールとの接触はタグで判定。引数のgameObject.tag
でタグが参照できるので、それをifで切り分けて処理。
複数回当たらないと消えないブロックを作ろうとして、現在あるブロックをコピー→同じ場所に配置したら、一回の接触で両方とも消えてしまった。 ちゃんと小クラスとか作って衝突処理をオーバーライドしてあげないとダメだった(今回実装していないのでできるかはわからない)。
段数によって色を変えようと思ったが、親の GameObject に Material を設定してあげることで一気に子の GameObject に適用されるなんてことはなかった。
ソース内からforeach
して設定しないとダメみたい?
できれば Material は Material でまとめておきたいので却下。
プレハブ化して配置するのがいいのかもしれない。
その他わかったこと・気付いたこと
- やり直しとかセーブとかゲームオーバーとかを作りたかった人生だった。→次回以降の課題
gameObject
は自分のオブジェクトを参照している。Update
とFixedUpdate
関数があり、後者は Rigidbody のときに使うらしい?GameObject.Find()
とGetComponent<T>()
さえあればどんなオブジェクトでも取れそう。使いすぎには注意。- Analytics の使い方がさっぱりわからん(必要ないので調べてない)。
- 物理演算はやっぱり荒ぶる。