企画記事
【完全図解】超初心者でも大丈夫。話題のゲームエンジン「Unity」での3Dゲーム作成入門
●Index |
・UIと基本操作(物理エンジン) |
・物体を動かしてみる(スクリプト,入力処理) |
・インスタンスを生成する(プレファブ) |
・当たり判定と爆発処理 |
・敵の発生と文字表示 |
当たり判定の実装
なんとなく弾が出せるようになったところで,少しゲーム的な要素を加えていきましょう。まず,立方体に当たり判定をつけてみます。具体的には,
弾を発射する → 立方体に当たる → 立方体が消える
といった処理を加えます。
物理運動をする物体の衝突が発生すると,まず,「OnCollisionEnter()」という関数が呼び出されます。パラメータには,ぶつかった相手のオブジェクト情報が入っています。
ここでは,弾が当たる相手であるCube2の挙動を記入したtestScriptに追記していきます。
function OnCollisionEnter(collision : Collision)
{
if (collision.gameObject.name == "bullet(Clone)"){
Destroy(gameObject);
}
}
オブジェクト名を取得するには,「gameObject.name」を使用します。これが弾のオブジェクト名と同じであったら,自分を消去(Destroy())する処理になります。弾は,インスタンスで生成されているため,後ろに「(Clone)」が加わりますので注意してください(インスタンスのオブジェクト名は,実行中にHierarchyビューを見れば分かります)。
実行の様子:当たり判定で消去
弾だけ残るのもどうかと思いますので,弾のほうも消してやりましょう。判定部に,
Destroy(collision.gameObject.gameObject);
を追加します。これは,パラメータで渡されたオブジェクトの本体を指定して消去していることになります。
実行の様子:当たり判定で弾も消去
こういった場合,一定時間が経過したら消去するとか,なにかにぶつかったら消去するというのが一般的です。
今回は,下に消去判定用の平面を置き,そこにぶつかったら弾が消えるようにしてみます。
まず,平面を作ります。[GameObject]-[Create Other]-[Plane]を選び,できたオブジェクトは「Plane2」という名前にしておいてください。
この板の配置は,Planeの下のほうが望ましいので,つまんで適当に下げ,大きさはTransformのScaleのところを操作して,XとZで10くらいを指定しておいてください。
板がはっきり見えるのもナンですので,透明体ぽい素材に変えておきましょう。デフォルト素材では,パーティクル用のものがよさそうです。
本来の使い方とはまったく違うとは思いますが,なんとなくいい感じにはなります。
スクリプトですが,testScriptに追記します。先ほどの当たり判定条件にこの平面を加えると,判定用平面まで消えてしまいますので,別の判定部を作ります。
以下のものを,衝突判定関数内に入れておきましょう。判定相手の名前を「Plane2」にしているだけで,とくに難しくはありません。
if(collision.gameObject.name == "Plane2"){
Destroy(gameObject);
}
まとめると,ここまでのtestScriptは,以下のようになります。
function Update () {
transform.Rotate(0,1,0);
}
function OnCollisionEnter(collision : Collision)
{
if (collision.gameObject.name == "bullet(Clone)"){
Destroy(gameObject);
Destroy(collision.gameObject.gameObject);
}
if(collision.gameObject.name == "Plane2"){
Destroy(gameObject);
}
}
通常のプレイヤー視点からは見えない,ステージ外での処理ですので,たぶん,下に飛び降りないと違いが分からないと思いますが,これでちゃんと弾が消えるようになりました。
実行の様子:弾のインスタンスを消去
爆発処理:パーティクルを使う
さて,弾も立方体もパッと消えてしまうのではちょっと情緒がないと考える人は多いでしょう。普通のゲームなら爆発して消えるような処理が行われるはすです。ということで,爆発させて見ましょう。
爆発などの表現には,一般的にパーティクルが用いられます。Unityでは,パーティクルのシステムと基本的な素材が標準で用意されており,簡単に利用できます。とくに効果を確認するだけなら,物凄く簡単です。以下のムービーで確認してみてください。
まず,上のメニューから[Assets]-[Import Package]-[Particles]をすべて読み込みます。
一般的に,爆発効果などはインスタンスで扱われますのでプレファブが必要なのですが,ここで読み込んだ素材はすでにプレファブの形になっていますので,必要な場所でインスタンス化してやればすぐに使えます。
先ほどと同様,testScriptに処理を加えます。まず,先頭に,
var projectile : GameObject;
の行を追加してください。
続いて,衝突判定部に処理を加えます。
var clone : GameObject =
Instantiate(projectile, transform.position, transform.rotation) as GameObject;
yield WaitForSeconds(2);
Destroy(clone);
先ほどのインスタンス化と同様に,Hierarchyビューで「Cube2」を選択した状態でInspectorのtestScriptの部分を見ると,「Projectile None(Game Object)」という記述と,○ボタンが見えますね。
ここで○ボタンを押すと,登録されているプレファブが表示されます。パーティクル素材の追加で,どっと増えています。その中から「explosion」を選んでください。
この状態で実行すると,見事,爆発が表示されるようになります。
スクリプト部の追加説明ですが,
yield WaitForSeconds(2);
は,2秒間処理を待つといった意味の部分で,この手の処理では慣用句のようなものになっていますので覚えておいてください。
実行の様子:オブジェクトの爆発
効果音を出す
さて,ここまできたらついでに爆発音も出してみたくなりますね。さっそく追加してみましょう。
まず,爆発音の素材ですが,WAVファイルを使うのが無難なようです。今回は以前別のゲームで使ったものを流用することにします。
今回の素材(bb1.wav:ZIP形式)
まず,Unityで音声を扱うときの基本についてはスクリプトのリファレンスマニュアルなどを参照しておいてもらうのがよいのですが,最低限の処理で見ていくと,AudioSourceオブジェクトを使うことになります。
まず,音声素材のファイルを,Unity EditorのProjectビュー内にドラッグ&ドロップしてやります。これで素材が取り込まれます。スピーカーアイコンのファイルになって表示されます。そこをクリックすると,Inspectorビューで,それがどうやらAudioClipオブジェクトとして扱われているようなことが分かります。
できたオブジェクトの名前は「Bang」にしておいてください。そこに,Projectビューにある音声データをドラッグ&ドロップしてやります。これでAudioSourceオブジェクトが出来上がりました。
なお,Inspectorで見ると,「Play on Awake」という指定がありますので,そこは切っておいてください。
スクリプト部では,testScriptの先頭に,
var clip1 : AudioSource;
を入れておきます。先ほどのパーティクルと同様に,ここで音声ファイルを受け取るのだと察しがつく人もいるでしょう。
衝突判定部には,
clip1.Play();
を加えます。
先ほどと同様に,HierarchyビューからCube2を指定したうえで,Inspectorを見ると「Clip1」の部分が「None」になっています。ここでちょっと注意ですが,一度,HierarchyビューにあるBangをProjectビューにドラッグ&ドロップしてみてください。こういった方法でもプレファブを作ることができます。このBangのプレファブを,先ほどのInspectorで「None」だった部分にドラッグ&ドロップしてやります。これで指定が完了します。
この状態で実行すると,見事に効果音も鳴るように……なった人と,ならなかった人がいるかと思います。
少し(かなり)悩んだのですが,どうやら,インスタンスの消去などを行うとメモリ空間に影響が出るのか,音声再生指示の配置場所がインスタンス消去の後ろだと音が鳴らないことがあるようです。静的に配置したいところですが,Bangの指定で「Static」のチェックを行っても症状は変わりませんでした。
対症療法ではありますが,できるだけ処理の先頭部分に置くことで対応しておきましょう。確実な方策とはいえないのですが,今回はこれで済ませますのでご了承ください。
実行の様子:オブジェクトの爆発
敵キャラ(?)となりそうな立方体の処理もかなり進めてきましたが,仕上げとして,フィールドから落ちた場合に消えるようにしておきましょう。爆発などはいりませんので,testScriptで単に以下の指定を加えておいてください。
if(collision.gameObject.name == "Plane2"){
Destroy(gameObject);
}
敵単体としての設定はここまででだいたい終わりです。以降は,これをインスタンス化して処理を進めていきます。プレファブ化は,HierarchyビューにあるCube2をProjectビューにドラッグ&ドロップするだけで行えます。名前は「target」にしておいてください。
- 関連タイトル:
Unity
- この記事のURL:
キーワード