フルーツが動くようになったところで、まずはフルーツ同士がぶつかったら消す処理を実装してみましょう。ゲームでは同じフルーツがくっつくと、進化後のフルーツが生まれるのですが、その初歩段階として消えるという処理を実装します。
衝突を検出する
衝突を検出するためにスクリプトを必要とします。ある程度知識がある人にとっては少し回りくどくなるかも知れませんがお付き合いください。
なにかの当たり判定とぶつかったことを知る:スクリプト作成
まずはそもそも何かと当たった!ということを知れるようになりたいですね。これは複数のフルーツは必要としません。フルーツから見て、落下した時に床と衝突したタイミングで「床と当たった!」ということを主張できるようになるのが目的です。
- プロジェクトビューでスクリプト作成
- Assets/Scriptsフォルダを作成
- Scriptsフォルダ内で右クリックCreate>C# Script
- ファイル名は「Fruits」
- もし名前を間違えた場合、ファイルを削除してからやり直しをしてください。←ここ重要
- スクリプトファイルを次のように編集
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fruits : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other)
{
Debug.Log(other.gameObject.name);
}
}
上記スクリプトのポイント
- OnCollisionEnter2D
- これはコリジョンモード(2D)の当たり判定を持つものと衝突した瞬間に自動で呼ばれます。
- 引数のotherには相手側の当たり判定が入っています。
- gameObject.nameでぶつかった相手の名前を表示することが出来ます。
スクリプトのアタッチと動作テスト
作ったスクリプトは他のコンポーネントの様にゲームオブジェクトにくっつけることでその機能を発揮します。落下するチェリー(Fruits)にセットして動作確認を行いましょう。
- Fruitsゲームオブジェクトを選択
- インスペクターにFruitsスクリプトをセットする
- スクリプトファイルをドラッグアンドドロップでセットするのがオススメです
- 検索ボックスに[fruits]と入力して、対象のスクリプトを絞り込んで選択してもOK
- インスペクターにFruitsスクリプトをセットする
- セットが出来たら再生ボタンで実行
- Consoleビューにログが表示されたら成功
- 床に当たったタイミングでFloorが表示されるはず
なにかに触れたら消滅する処理
フルーツ同士がくっついた時に消滅する処理を作る必要がありますが、その前段階として、なにかに当たったら消えるというものを先に作ってみましょう。実際には作った処理にいくつかの条件を付与しながらゲームとしての機能を充実させていきます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fruits : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other)
{
Destroy(gameObject);
}
}
- 小文字始まりのgameObjectはスクリプトがアタッチされているゲームオブジェクト自身のことを指します。
- Destroyメソッドは引数のオブジェクトを削除します
- 注意点としては、コンポーネントを指定した場合、インスペクターから対象のスクリプトのみが剥がれるだけで、オブジェクト自体が消えなくなります。
フルーツ同士でぶつかった時に消えるようにする
ここまでの状態で、次のようなものが作れました。
- フルーツが落下するようになった
- 接触処理が作れた
- なにかにぶつかったら消滅
さすがに何とぶつかっても消えるのは節操な差すぎるので、相手側がフルーツだった場合のみ消えるようにします。
ぶつかった相手がフルーツかどうかを判断する処理
衝突した相手を判断する方法はいくつかあります。今回は、当たった相手に期待するコンポーネントが存在するかどうかを利用したいと思います。この構成の制約としては
- Fruitsスクリプトはフルーツ類にしかアタッチしない。
- 逆に言うと、Fruitsスクリプトは必須!
そして今回利用するメソッドは少し特殊で、次のような特性を持っています
- 指定したコンポーネントが取れた場合はTrueを返す、取れなかった場合はFalse
- 取得できた場合、引数のoutで指定した変数に取得したコンポーネントが入ってくる
取得したコンポーネントは後で利用します。ではスクリプトは以下!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fruits : MonoBehaviour
{
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.TryGetComponent(out Fruits otherFruits))
{
Destroy(gameObject);
}
}
}
スクリプトの簡単な解説
- other.gameObject
- 衝突して当たった相手側のゲームオブジェクト
- 床だったりフルーツだったり
- TryGetComponent
- 引数で指定するコンポーネントを持っている場合は真を、なかった場合は偽を返す
- out Fruits otherFruits
- TryGetComponentで取れた場合、otherFruitsに相手のゲームオブジェクトにくっついているFruitsスクリプトを取得できる。
- 今回の書き方だとif文の中で有効
動かしてみて確認
動作確認を行う場合、次の手順でフルーツを3つ以上にして確認するとわかりやすいです。
- すでに存在するFruitsオブジェクトを選択
- Ctrl+Dを2回行ってフルーツ(チェリー)を2個追加する。
- 位置を調整
- 複製したフルーツを上下に移動させる
- やや離れた位置関係で、縦軸は合わせる
- 再生してみて確認
- 一番下のチェリーは床に当たっても消えない
- 下2つのチェリーがぶつかったらお互いに消える
- 一番上のチェリーだけ残る
いいね!あとはチェリー同士の接触でいちごが作られたら言うことなしです。
いちごを作るには、プレファブ化が必要になるので次回はプレファブとプレファブバリアントについての設定を行いたいと思います。