前回はミサイルを整理しましたが、今回はちゃんとゲームっぽくなる様に、マウスでクリックした位置にミサイルが発射される様にして行きますよ!
まずはゲーム管理クラスを作ってみよう
また新規で、今まで無かったゲーム全体を管理するクラス、GameManager を作って、Game_root obj にくっ付けます。
今後の事を見越して、隕石とミサイル、それと、HUDの各マネージャもプロパティとして保存できる様にしましょうかね。
設定後の Inspector はこんな感じ。
これでひとまず準備は完了かな?
このゲーム管理クラスの Update() 関数で、それぞれのゲーム処理をさばいて行く事になります。
マウスのクリック位置を取得!あ〜、そのために、コライダGameObjectを作成、から
デバイス上で実行した時は違うはずなんですが、今製作中の動作確認なんで、一応マウスクリックだけ対応して行きますね。
実装にあたっては、この下のビデオチュートリアルを参考にしました。
英語版ですが、興味がある方は是非
で、実装内容で、レイキャストを使ってます。レイキャストって、結局、3D空間中の直線が、物体に当たったかどうかを判定するんですが、この為に、当たり判定の対象となる、当たり判定、Unity 中では Collider(コライダ) と言ってますが、その Collider の一種、Box Collider を作ります。
また、今回もせっかくなんで Unity らしく、新規の GameObject を作ってコライダをくっ付けましょう。
名前は、"InputHandler" としてます。
Inspector ビューの "Add Component" から、"Box Collider" をくっ付け、サイズを設定。
今回は、X軸から、10, 20, 1 としてます。
これで、ひとまずコライダの作成は完了!
入力コライダに専用レイヤーを設定しておく。念のため
さて、レイキャストを行う際に、レイヤーなんてのも設定出来る様なので、これも設定しておこおうと思います。
ちょっとコライダはまだ謎が多いんですが、隕石とミサイルの衝突もコライダで取りたい思ってますが、このタッチ&クリック感知用のコライダはなんか役割違うし、なんか変な影響あってもいやなんで。
では新規のレイヤー作成から。
Inspector ビューの上の方、Layer の右横をクリック!
するとこんな画面に。
0〜7の8レイヤーまではデフォルトで設定されていて、8から31までの24レイヤーは独自の名前で設定できそう。
ひとまず、Layer 8 に "InputCollider" としてレイヤーを作成しますね。
その後、もう一回 "InputHandler" を選択して Inspector ビューに戻って、さらに、Layer をクリックすると(説明長いわぁ〜。分かりにくいよね)...
"InputHandler" レイヤーが追加されてるので、それをクリック。
これでレイヤーが設定されました!
ようやくクリック位置からミサイル発射!
いよいよミサイルの発射!!
基本的なやり方としては、マウスのクリック位置から、画面奥に向かって Ray を Cast!
Raycast の時にチェックするレイヤーは、InputCollider のみ!
Ray が Hit したX座標にミサイルを画面下から発射!
という流れですね♪
これが、参考動画を元に書いた GameManager のスクリプトです。
if ( Input.GetMouseButtonDown(0) )
マウスが押された状態かどうかを返すので、この場合、マウスが押されたら括弧内を実行!
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
マウスの位置をカメラが映してる空間の座標系に変換してRaycast する時に使う Ray 型に整える。
RaycastHit rayhit;
Raycast の結果を保存する為の RaycastHit を作り
LayerMask lmask = LayerMask.NameToLayer("InputCollider");
レイヤー名からレイヤー番号をGetし
レイヤー名からレイヤー番号をGetし
int mask = 1 << lmask.value;
レイヤー番号からレイヤーマスクを作り、raycast に備える。
if ( Physics.Raycast(ray.origin, ray.direction, outrayhit, Mathf.Infinity, mask) )
InputCollider レイヤーに当たったら、結果を rayhit 入れてもどし、括弧内を実行。
Vector3 pos = rayhit.point;
mMissileMgr.CreateNewMissile(pos);
mMissileMgr.CreateNewMissile(pos);
結果から、raycast が当たったポイントをゲット!
その座標にミサイルを作成。(渡した先では、y座標は固定されてるけどね。)
で、実行画面わ.....
できましたぁ〜〜〜!!!
ちょっと、今回は裏で苦労が多かったので、感慨深いぃぃ!
たまには本物に触れる事も大事!








