- 落下するオブジェクトを追加したい。
- 当たり判定をするプログラムを知りたい。
この記事はこんな方に向けて書いています。
こんにちはマナビヤです♪
前回はUnityでオブジェクトを動かす方法について説明しました。
前回の記事はこちら↓

今回作っていくゲームは「落ちげー」なので、左右によけるキャラクターのほかに落下してくるオブジェクトが必要になります。
そこで今回は、「落下するオブジェクト」の追加と「当たり判定」を勉強していきましょう。
今回もわかりやすく写真を多めに説明していきますね。
Unityで落下物を追加する方法
それでは早速Unityで落下物を追加する方法について説明します。
といっても設置方法については前回説明したキャラクターのオブジェクトと同じ方法になるので、おさらいのような感じで」聞いてください。
まずはデスクトップから「Unityhub」をクリックしてください。
するとこのように前回セーブしておいたプロジェクトの「test1」が画面にあるはずです。
それではここを選んでクリックしてください。

すると前回までのゲーム開発画面があらわれました。
前回は背景とオッサンのオブジェクトを設置してオッサンを動かすプログラムをアタッチしましたね。
今回はさらに上から落下してくる「岩」のオブジェクトを追加していきましょう。

このようにあらかじめ用意しておいた岩のオブジェクトをファイルからプロジェクト欄にドラッグ&ドロップしていきます。
ここまでは前回と同じ方法なので誰でも簡単にできると思います。

するとこのようにプロジェクト欄に「iwa」オブジェクトが追加されたのがわかると思います。
個人的にこんな感じで感覚的にわかるのがUnityの良いところだと思いますね。
オブジェクトを動かすプログラムは確かに難しい部分もありますが、物体の配置などを簡単に決められるのはかなりの利点に感じます。
Unityが出てくる以前にはこういう配置なんかもきっとコードで書かれていたんだろうな…

それではプロジェクト欄のiwaをScene上に設置していきます。
プロジェクト欄のiwaをドラッグ&ドロップしてScene上に移動させます。
しかし、このように背景の裏に岩のオブジェクトが隠れてしまいました。

岩を背景の前に置きたいので、青丸で囲んだ「Order in Layer」の数字を0から1に書き換えてください。
前回も説明しましたがLayerは一番奥が0で数字が増えるほど手前になります。
1に変えるとこのように岩が出てきました。
しかし、これでは岩が大きすぎますね(笑)

岩オブジェクトの位置とサイズを変更するため右側の青枠の部分を調整します。
数字を変えると位置や大きさが変わるのが目で見て分かるので色々触って丁度いいところを探してみてください。

これで岩オブジェクトの設置は完了したので、一旦「▶」ボタンを押してゲームを実行してみましょう。
ゲームを実行するとこのような画面になります。
オッサンは今まで通り左右に動きますが岩はずっと上に浮かんだままですね。
これではまだゲームとは言えません。

岩オブジェクトを落下させる
それではこの岩オブジェクトを落下するようにしていきます。
プログラムを作っていくのでプロジェクト欄から「右クリック」→「Create」→「C♯Script」の順番でスクリプトを作成してください。
これの名前は「iwaControl」と名付けました。
名前は何でもいいですが分かりやすい名前をつけましょう。

スクリプトをクリックするとこのようにUnityの骨組みがすでに書かれたソースがVisual Studioで開かれます。
これに「岩が落下する」コードを書いていきましょう。

この青枠で囲んだ部分が新たに書き足したプログラムです。
transform.Translate ( 0, -0.1f, 0) ;
これは、y軸にフレームごとに-0.1ずつ移動していくという意味です。
これだけで岩が落下するプログラムを書けましたが、これだけでは画面から消えた場合でもずっと下に落下し続けます。
これを何とかするため「画面から消えた場合に岩オブジェクトを破壊する」プログラムを付け足します。
if(transform.position.y < -5.0f)
{
Destroy(gameObject);
}
これは、「もし岩のy座標が-5.0より小さくなった時、岩のオブジェクトを破壊する」という意味です。

それではこのスクリプトをセーブしてiwaオブジェクトにアタッチしていきます。
プロジェクト欄の「iwaControl」スクリプトをドラッグして「iwa」オブジェクトにドロップしてください。

ちゃんとアタッチできているか確認するため「iwa」オブジェクトをクリックして右側の青枠部分に「iwaControl」スクリプトがアタッチされているかチェックしてください。

ここまでできたら一旦「▶」ボタンでゲームを実行してみましょう。
このようにちゃんと岩が下に落下しましたね。
しかし、このままだと岩とオッサンが当たってもすり抜けるだけですね。
ていうかこの画像では岩がオッサンのヘアースタイルみたいになっています。
今流行りの「ロックアフロヘアー」でしょうか(そんな髪型は無い)

当たり判定をする
これではちょっとまずいので岩とオッサンが当たった時の処理「当たり判定」を追加していきます。
先ほど作成した「iwaControl」スクリプトに追加していきますので、これを再びクリックしてください。

当たり判定を追加するには以下のプログラム内の青い印のついた部分を書き加えます。
このプログラムでは岩オブジェクトの他にオッサンオブジェクトも対応させる必要があるのでまずプレーヤーオブジェクトの宣言である
GameObject player;
そして「oyaji」オブジェクトを代入する処理
this.player = GameObject.Find(“oyaji”);
の一文が追加されます。
そして下の「当たり判定」のプログラムでは岩の半径とオッサンの半径が一定の距離より小さくなった場合に岩を破壊するコードが書かれています。
Vector2 p1 = transform.position; //岩の中心座標
(コード上には「矢」と書いてありますが「岩」の間違いです)
Vector2 p2 = this.player.transform.position; //オッサンの中心座標
Vector2 dir = p1-p2 ; // 岩とオッサンの距離
Vector2というのは2Dの座標をいれる変数で、まずは岩とオッサンの中心座標を格納し、座標どうしの距離も入れていきます。
float d = dir.magunitude; //dに座標の距離を代入
float r1 = 0.5f; //r1に岩の半径0.5を代入
float r2 = 1.7f; //r 2 にオッサンの半径1.7を代入
岩の半径とオッサンの半径はオブジェクトのサイズによって変わるのでゲーム画面で実行しながら微調整してください。
if ( d < r1 + r2 ){
Destroy(gameObject);
}
これは「もし岩とオッサンの距離が岩とオッサンの半径の合計よりも小さくなった場合に岩を破壊する」というコードになります。

それではこのスクリプトを保存して「iwa」オブジェクトにアタッチします。
それが終わったら早速「▶」ボタンで実行してみましょう。
するとこのように岩が落下した後…

オッサンとぶつかった時点で岩が消滅します。
これで「当たり判定」の処理が完了しました。

今回はここまでです。
次回は岩をランダムに生成していく方法について説明します。
それでは今回も最後までありがとうございました。
完成ゲーム「オヤジGET!」はこちら
参考書籍
Unityの教科書 Unity2019完全対応版 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)
- 作者:北村 愛実
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2019/06/28
- メディア: 単行本
コメント