UnityUnityメモ

Unity初心者必見!ぶつかったオブジェクトと同じ大きさにする方法

Unity

1. はじめに

この記事では、プレイヤーが動かせるキューブが別のキューブにぶつかったとき、そのキューブのサイズをコピーするスクリプトを作成します。

「どうしてこんなスクリプトが必要なの?」と思う方もいるかもしれませんが、実はこの仕組みはさまざまなゲームで応用可能です。たとえば、ぶつかった敵キャラクターから能力をコピーするシステムや、オブジェクトが成長するゲームなどに活用できます。

この記事では、Unity初心者でもわかりやすいように、シーンの準備からスクリプトの作成、そして動作確認までを順を追って解説します。キーボード操作や衝突判定など、ゲームの基礎を楽しく学びながら習得しましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!



2. シーンの準備

この記事では、Unityのシーンに必要なオブジェクトを配置し、基本的な設定を行います。初心者でも簡単に進められるように、ステップごとに解説します!


① 床(Plane)の作成

まず、プレイヤーや他のオブジェクトを置くための床を作ります。

  1. ヒエラルキー(Hierarchy)ウィンドウを右クリックします。
  2. 表示されたメニューから「3D Object」→「Plane」を選択します。
  3. シーンに大きな平面が作成されます。これが床になります。

② プレイヤーのCubeを作成

次に、プレイヤーとして動かすCubeを配置します。

  1. 再びヒエラルキーウィンドウを右クリックし、「3D Object」→「Cube」を選びます。
  2. 作成されたCubeの名前を「PlayerCube」に変更しておきましょう(名前の変更はヒエラルキーウィンドウでCubeを右クリックし、「Rename」を選択するか、F2キーを押して行います)。
  3. インスペクター(Inspector)ウィンドウで「Transform」セクションを確認し、位置を次のように設定してください:
    • Position:(0, 0.5, 0)
    • Scale:(1, 1, 1)(デフォルトのままでOK)

③ PlayerCubeにRigidbodyを追加

プレイヤーが物理的に動けるようにするために、Rigidbodyを追加します。

  1. ヒエラルキーウィンドウで「PlayerCube」を選択します。
  2. インスペクターウィンドウの「Add Component」ボタンをクリックします。
  3. Rigidbody」を検索し、選択して追加します。
  4. Rigidbodyが追加されたら、以下の設定を確認してください:
    • Use Gravity: チェックあり(デフォルト)
    • Is Kinematic: チェックなし(デフォルト)

④ サイズをコピーするCubeを作成

次に、プレイヤーがぶつかってサイズをコピーする対象のCubeを作ります。

  1. 再びヒエラルキーウィンドウを右クリックし、「3D Object」→「Cube」を選択します。
  2. 作成されたCubeの名前を「Cube2」に変更します。
  3. インスペクターで以下のように設定を変更してください:
    • Position:(3, 0.5, 0)
    • Scale:(2, 2, 2)(プレイヤーCubeの2倍の大きさ)

⑤ 配置の確認

最後に、配置が正しいか確認しましょう。

  • 「PlayerCube」が床の上に置かれ、(0, 0.5, 0)の位置にあること。
  • 「Cube2」が床の上にあり、(3, 0.5, 0)の位置にあること。

シーンビューでカメラを動かして、両方のCubeと床が正しく配置されているか確認してください。


これでシーンの準備が整いました!次は、プレイヤーをキーボードで動かし、Cube2と衝突した際にサイズをコピーするスクリプトを作成していきましょう。



3. スクリプトの作成

このセクションでは、プレイヤーを矢印キーで操作し、特定のオブジェクトにぶつかった際にそのサイズをコピーするスクリプトを作成します。Unity初心者でも簡単にできるように、ステップごとに詳しく説明します。

スクリプトの作成手順

  1. 新しいスクリプトを作成する
    1. プロジェクトウィンドウで右クリックします。
    2. 「Create」→「C# Script」を選択します。
    3. スクリプトの名前を「CubeScale」に変更します。
    4. 作成したスクリプトをダブルクリックして、Visual Studio(またはお使いのコードエディタ)を開きます。
  2. スクリプトにコードを記述する Visual Studioが開いたら、以下のコードを入力してください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeScale : MonoBehaviour
{
    void Update()
    {
        // 矢印キーでプレイヤーを動かす
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(0f, 0f, 0.1f); // 上キーで前進
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(0f, 0f, -0.1f); // 下キーで後退
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(-0.1f, 0f, 0f); // 左キーで左に移動
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(0.1f, 0f, 0f); // 右キーで右に移動
        }
    }

    // ぶつかった時に呼ばれる関数
    private void OnCollisionEnter(Collision collision)
    {
        // ぶつかったオブジェクトの名前が "Cube2" だったら
        if (collision.gameObject.name == "Cube2")
        {
            // Cube2のスケールを取得して自分に適用
            this.transform.localScale = collision.gameObject.transform.localScale;
        }
    }
}

コードの解説

  1. プレイヤーの移動処理
    • Update()関数内で矢印キーの入力を検知しています。
    • transform.Translateメソッドを使い、Cubeを前後左右に移動させます。
  2. 衝突時の処理
    • OnCollisionEnter()関数は、オブジェクトが他のオブジェクトにぶつかったときに呼び出されます。
    • collision.gameObject.nameでぶつかった相手の名前を取得し、それが “Cube2” なら、そのスケールをプレイヤーに適用します。

コードをすべて入力したら、「Ctrl + S」または「Command + S」でスクリプトを保存します。



4. スクリプトの適用

ここでは、作成した「CubeScale」スクリプトをプレイヤーのオブジェクトに適用する手順を説明します。


スクリプトを適用する方法

  1. プレイヤーオブジェクトを選択
    • ヒエラルキー(Hierarchy)ウィンドウで、キーボード操作で動かすCube(プレイヤーCube)をクリックします。
  2. スクリプトをドラッグ&ドロップ
    • プロジェクトウィンドウ(Project)で先ほど作成した「CubeScale」スクリプトを見つけます。
    • スクリプトをクリックして、プレイヤーCubeにドラッグ&ドロップします。
    • インスペクター(Inspector)ウィンドウを確認し、「CubeScale」スクリプトが正しく追加されていることを確認してください。



5.動作確認

設定が完了したらゲームをプレイして動作を確認しましょう!


ゲームをテストする

  1. ゲームを再生
    • Unityエディタの上部にある「Play」ボタン(▶)をクリックしてゲームを再生します。
  2. 矢印キーでプレイヤーを動かす
    • キーボードの矢印キーを使って、プレイヤーCubeを移動させます。
    • Cube2に向かって移動し、ぶつかってみましょう。
  3. サイズが変更されることを確認
    • プレイヤーCubeがCube2にぶつかると、プレイヤーCubeのサイズがCube2のサイズに変更されます。
    • 変更が確認できたら成功です!

注意点

  • ぶつかってもサイズが変わらない場合
    • 以下を確認してください:
      1. Cube2の名前が正しく設定されていますか?(インスペクターで名前が「Cube2」になっているか確認)
      2. RigidbodyがプレイヤーCubeに正しく追加されていますか?
      3. スクリプトにタイポがないか確認してください。
  • スクリプトのエラーが表示される場合
    • コンソールウィンドウにエラーメッセージが表示されることがあります。その場合は、エラー内容を確認し、スクリプトを修正してください。

これで「スクリプトの適用とテスト」の手順は完了です!次は、ゲームにアレンジを加えたり、他の機能を追加してみるのも楽しいですよ。



よくある質問

Q
Rigidbodyを追加しないとどうなりますか?
A

Rigidbodyを追加しないと、物理挙動が働かず、衝突判定が正しく機能しません。特に、OnCollisionEnterメソッドはRigidbodyが必要なため、衝突イベントが発生しなくなります。プレイヤーオブジェクトには必ずRigidbodyを追加しましょう。

Q
衝突対象のオブジェクト名が違う場合はどうすればいいですか?
A

スクリプト内のcollision.gameObject.name == "Cube2"の部分を、衝突するオブジェクトの正しい名前に変更してください。また、複数のオブジェクトに対応したい場合は、tagを使う方法もあります。その場合、衝突するオブジェクトに共通のタグを設定し、スクリプトを以下のように変更してください:

if (collision.gameObject.tag == "TargetTag")
{
this.transform.localScale = collision.gameObject.transform.localScale;
}

タグを設定するには、インスペクターで該当オブジェクトを選択し、タグ欄で適切なタグを選択または新規作成してください。

Q
スクリプトが正しく動作しない場合はどうすればいいですか?
A

スクリプトが動作しない場合、以下の点を確認してください:

  • オブジェクト名: 衝突対象のオブジェクト名がスクリプトと一致しているか確認します。
  • Rigidbody: プレイヤーオブジェクトにRigidbodyが正しく追加されているか確認します。
  • スクリプトのアタッチ: スクリプトがプレイヤーオブジェクトにドラッグ&ドロップされているか確認します。
  • コンソールのエラー: Unityのコンソールにエラーメッセージが出ていないか確認し、表示されたエラーを元にコードを修正します。

おすすめのアセット

「Runner Clash Template: Hypercasual Starter Kit」は、シンプルかつ拡張可能なハイパーカジュアルゲームの開発に最適なテンプレートです。このアセットは、エンドレスランナータイプのゲームを作成するための基本機能を提供し、カスタマイズも簡単に行えます。特に物理演算コンポーネントを使用していないため、2Dやモバイルゲームへの転用も容易です。