2014年09月10日

ゲーム制作の本番 (7) | ちゃんとゲームに!クリックした所にミサイルを!

前回はミサイルを整理しましたが、今回はちゃんとゲームっぽくなる様に、マウスでクリックした位置にミサイルが発射される様にして行きますよ!

まずはゲーム管理クラスを作ってみよう
また新規で、今まで無かったゲーム全体を管理するクラス、GameManager を作って、Game_root obj にくっ付けます。
Screen Shot 2014-09-08 at 3.40.29 PM.png

今後の事を見越して、隕石とミサイル、それと、HUDの各マネージャもプロパティとして保存できる様にしましょうかね。
設定後の Inspector はこんな感じ。
Screen Shot 2014-09-08 at 3.45.44 PM.png

これでひとまず準備は完了かな?
このゲーム管理クラスの Update() 関数で、それぞれのゲーム処理をさばいて行く事になります。


マウスのクリック位置を取得!あ〜、そのために、コライダGameObjectを作成、から
デバイス上で実行した時は違うはずなんですが、今製作中の動作確認なんで、一応マウスクリックだけ対応して行きますね。

実装にあたっては、この下のビデオチュートリアルを参考にしました。
英語版ですが、興味がある方は是非

で、実装内容で、レイキャストを使ってます。レイキャストって、結局、3D空間中の直線が、物体に当たったかどうかを判定するんですが、この為に、当たり判定の対象となる、当たり判定、Unity 中では Collider(コライダ) と言ってますが、その Collider の一種、Box Collider を作ります。

また、今回もせっかくなんで Unity らしく、新規の GameObject を作ってコライダをくっ付けましょう。
名前は、"InputHandler" としてます。
InputHandler_Created.png

Inspector ビューの "Add Component" から、"Box Collider" をくっ付け、サイズを設定。
今回は、X軸から、10, 20, 1 としてます。

これで、ひとまずコライダの作成は完了!


入力コライダに専用レイヤーを設定しておく。念のため
さて、レイキャストを行う際に、レイヤーなんてのも設定出来る様なので、これも設定しておこおうと思います。
ちょっとコライダはまだ謎が多いんですが、隕石とミサイルの衝突もコライダで取りたい思ってますが、このタッチ&クリック感知用のコライダはなんか役割違うし、なんか変な影響あってもいやなんで。
では新規のレイヤー作成から。

Inspector ビューの上の方、Layer の右横をクリック!
Layer2.png
して、"Add Layer" をクリック!
Screen Shot 2014-09-08 at 7.30.40 PM.png
するとこんな画面に。
Screen Shot 2014-09-08 at 7.31.07 PM.png
0〜7の8レイヤーまではデフォルトで設定されていて、8から31までの24レイヤーは独自の名前で設定できそう。
ひとまず、Layer 8 に "InputCollider" としてレイヤーを作成しますね。
Screen Shot 2014-09-08 at 7.33.03 PM.png
その後、もう一回 "InputHandler" を選択して Inspector ビューに戻って、さらに、Layer をクリックすると(説明長いわぁ〜。分かりにくいよね)...
Screen Shot 2014-09-08 at 7.33.15 PM.png
"InputHandler" レイヤーが追加されてるので、それをクリック。
これでレイヤーが設定されました!
LayersetDone.png


ようやくクリック位置からミサイル発射!
いよいよミサイルの発射!!
基本的なやり方としては、マウスのクリック位置から、画面奥に向かって Ray を Cast!
Raycast の時にチェックするレイヤーは、InputCollider のみ!

Ray が Hit したX座標にミサイルを画面下から発射!

という流れですね♪
これが、参考動画を元に書いた GameManager のスクリプトです。
Screen Shot 2014-09-09 at 12.36.54 AM.png
でわ、ちょっとずつ説明です。

if ( Input.GetMouseButtonDown(0) )
マウスが押された状態かどうかを返すので、この場合、マウスが押されたら括弧内を実行!

Ray    ray    = Camera.main.ScreenPointToRay (Input.mousePosition);
マウスの位置をカメラが映してる空間の座標系に変換してRaycast する時に使う Ray 型に整える。

RaycastHit rayhit;
Raycast の結果を保存する為の RaycastHit を作り

LayerMask    lmask    = LayerMask.NameToLayer("InputCollider");
レイヤー名からレイヤー番号をGetし

int        mask    = 1 << lmask.value;
レイヤー番号からレイヤーマスクを作り、raycast に備える。

if ( Physics.Raycast(ray.originray.directionoutrayhitMathf.Infinitymask) )
InputCollider レイヤーに当たったら、結果を rayhit 入れてもどし、括弧内を実行。

Vector3    pos = rayhit.point;
mMissileMgr.CreateNewMissile(pos);
結果から、raycast が当たったポイントをゲット!
その座標にミサイルを作成。(渡した先では、y座標は固定されてるけどね。)

で、実行画面わ.....

できましたぁ〜〜〜!!!
ちょっと、今回は裏で苦労が多かったので、感慨深いぃぃ!

        にほんブログ村 ゲームブログ×PlayNCBlogへ
 初めてみました。よかったらクリックお願いね ♪

たまには本物に触れる事も大事!
posted by やまけん at 10:15| Comment(0) | Unity | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は90日以上新しい記事の投稿がないブログに表示されております。