【Unity】チュートリアルの「Roll a Ball」をやってみる話 #7

記事をご覧いただき、誠に有難うございます。

投稿主の無能です。

今回は、収集するアイテムをステージに追加したいと思います。


収集するアイテムをステージに追加する

ただPlayerが転がるだけではゲーム性が無いので、収集するアイテムを追加して、アイテムを全て集めたらステージクリア、と言う条件を付けたいと思います。

では収集するアイテムを作ります。

メニュー Game Object > 3D Object > Capsule でCapsule(カプセル)オブジェクトを作成し、名前を「CollectItem」にします。

Game Object > 3D Object > CapsuleでCapsuleを選択

名前を「CollectItem」にする

CollectItemにMaterialをアタッチします。
今回は緑色にしました。

MaterialをCollectItemという名前で作成

今回は緑色

MaterialをCollectItemにアタッチする

このCollectItemをPrefab化します。

CollectItemをPrefab化

ここからPrefabsフォルダにある大元のCollectItemを操作します。

サイズの調整

まずはPositionをリセット(Positionをゼロ)にします。

Positionをリセットする

HierarchyビューのCollectItemのPositionを調整します。

HierarchyビューのCollectItemのPositionを調整

しかし、Playerに対してでかいですね…
サイズを小さくして、再度高さ(PositionのY)を調整します。
Scaleを0.3に、高さを0.5にしましたが、適宜調整してください。

Scaleを0.3に、高さを0.5にする(好みで調整する)

大体良さそうな感じですね。

良い感じの大きさになった

大元のCollectItem(PrefabsフォルダにあるCollectItem)の方を見てみます。
最初にリセットした高さになっているので、こちらも0.5に修正します。

大元のCollectItemの方も高さを0.5に修正する

Tagを付ける

続けてTagを付けます。
「CollectItem」というTagを追加して設定します。

「CollectItem」というTagを追加

Tagを設定する

これで一通りCollectItemの設定が終わったので、ステージに配置してみます。

ステージ内にCollectItemを配置する

配置する数は任意なので、自由に設置・配置してください。
今回は4つにして、配置は以下のようにします。

このように配置した





CollectItemの整理のため、「CollectItem」という名前の空のオブジェクトを追加して、その中に設置したCollectItemを入れます。


「CollectItem」という名前の空のオブジェクトを作成


設置したCollectItemを入れる

ゲームを実行してみましょう。

Gameビュー

設置したCollectItemと衝突してしまいます。

理想としては、当たり判定はそのままですり抜けたいようにしたいです。

is Triggerにチェックを入れる

大元のCollectItemの方に行って、InspectorビューのCapsule Colliderを見てみます。

InspectorビューのCapsule Collider

Capsule Colliderの「is Trigger」が正に理想通りの動きで、当たり判定の機能はそのままに、すり抜けられるようになります。
「is Trigger」にチェックを入れます。

「is Trigger」にチェックを入れる

ではゲームを実行して確認しましょう。

すり抜けるようになった

これですり抜けられるようになりましたね。

次は、このCollectItemが取得したように見えるスクリプトを書いていきます。

CollectItemスクリプトを書く

取得したように見えるという事は、PlayerがCollectItemに接触したら、Gameビューから消えれば取得したように見えますよね。

ではそのようにスクリプトを書きます。

CollectItemControllerと言う名前のスクリプトを新規作成します。
作ったスクリプトを大元のCollectItemにアタッチします。

CollectItemControllerスクリプトを新規作成

アタッチの仕方ですが、画面が切り替わってドラッグ&ドロップできませんので、違う方法でアタッチします。

大元のCollectItemのInspectorビューの下に「Add Component」ボタンがあります。

Inspectorビューの下に「Add Component」ボタンがある

このボタンを押すと、アタッチできるコンポーネントが種類別に表示されます。


この上にある検索スペースで、先程作成したCollectItemControllerスクリプトを探します。
文字の入力途中で出てきます。

検索スペースでスクリプトを検索

この出てきたスクリプトを選択(ダブルクリック)するとアタッチされます。

スクリプトがアタッチされた

ではCollectItemControllerスクリプトをVSで開きます。

当たり判定は前回やったOnCollisionEnter関数に近い関数で、OnTriggerEnter関数というものです。

Tagは今回、動かないCollectItemなので、逆に動いて当たってくるPlayerになります。
ですので、まだTagを付けていないPlayerにTagを設定する必要があります。

Unityに戻って、Playerに「Player」Tagを設定しましょう。
今回は「Player」Tagがあるので選択するだけです。

Playerに「Player」Tagを設定

ではVSに戻ってスクリプトを書きます。

今回はStart関数とUpdate関数は使わないので削除します。

OnTriggerEnter関数の中にif文を記述します。
このような記述になります。
private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player")
        {

        }
    }

このような感じになります。


if文内の処理は、Gameビューから消えるのでオブジェクトを破棄するDestroyを使います。

このような記述になります。
if (other.CompareTag("Player"))
        {
            // 自身を破棄する
            Destroy(gameObject);
        }

このようになります。


ではスクリプトを保存して、ゲームを実行してみましょう。

Gameビュー

Playerが接触するとCollectItemが消えるようになりました!

今回はここまで。

まとめ

本記事では
  • CollectItemを作成し設置した
  • CollectItemControllerスクリプトを作成し、Playerと接触すると消えるようにした
という事を行いました。

次は、ステージのクリアを作りたいと思います。

本記事もご覧頂き、誠に有難うございます。
ではまた。

コメント