ひびのログ

日々ではないけどログを出力していくブログ

Unity に(再)入門しました

f:id:tee-talog:20180218173746p:plain

以前、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は自分のオブジェクトを参照している。
  • UpdateFixedUpdate関数があり、後者は Rigidbody のときに使うらしい?
  • GameObject.Find()GetComponent<T>()さえあればどんなオブジェクトでも取れそう。使いすぎには注意。
  • Analytics の使い方がさっぱりわからん(必要ないので調べてない)。
  • 物理演算はやっぱり荒ぶる。