UnityUnityメモ

初心者向けUnityチュートリアル:SphereがCubeにぶつかると1秒後に消える仕組みを作る方法

Unity

はじめに

今回はUnityを使って、Sphere(球体)がCube(立方体)にぶつかると1秒後にCubeが消える仕組みを作ってみましょう!
この仕組みは、アクションゲームやパズルゲームなど、特定の条件でオブジェクトを削除したい場面で役立ちます。Unity初心者の方でも分かりやすく解説していくので、ぜひ一緒に学んでいきましょう!

この記事を読み終えると、以下のスキルが身につきます:

  • オブジェクト同士の衝突判定の使い方
  • 一定時間後にオブジェクトを消す方法
  • 簡単なスクリプトの書き方

早速始めてみましょう!

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




完成イメージ

ゲーム中にSphere(プレイヤー)がCubeにぶつかると、1秒後にCubeが消えます。これは、UnityのOnCollisionEnterDestroyを使って実現します。




手順

1. CubeとSphereを作成する

  1. Unityを開いて、新しいプロジェクトを作成します
  2. ヒエラルキー(Hierarchy)ウィンドウで右クリックして、「3D Object」→「Cube」を選択します。
  3. 同じように、もう一度右クリックして「3D Object」→「Sphere」を選択します。

これでシーンにCubeとSphereが配置されました!


2. Sphereにリジッドボディ(Rigidbody)を追加する

Sphereが動くようにするためにリジッドボディを追加します。

  1. ヒエラルキーウィンドウでSphereを選択
  2. インスペクターウィンドウで「Add Component」をクリックし、Rigidbodyを追加します。

3. スクリプトを作成する

SphereがCubeにぶつかったときの動きをスクリプトで制御します。

  1. プロジェクトウィンドウを右クリックして「Create」→「C# Script」を選びます。
  2. スクリプトの名前を**SphereMove**とします。
  3. 出来上がったスクリプトをSphereにドラッグ&ドロップしてアタッチします。

4. スクリプトを書き込む

以下のコードをSphereMove.csに書き込みます。

1. 変数の定義

public bool isTouched;
public float time;
public GameObject destroyObj;
  • isTouched
    • この変数は、球がキューブにぶつかったかどうかを記録するものです。
    • 最初は「ぶつかっていないよ」という意味でfalseになります。
  • time
    • キューブを消すまでのカウントダウン時間を管理します。
    • 初期値は1.0秒で、Update関数で少しずつ減らされます。
  • destroyObj
    • ぶつかったキューブを覚えておく変数です。
      例えば、ぶつかったキューブを後で削除するときに使います。

2. Start関数

void Start()
{
isTouched = false;
time = 1.0f;
}
  • Start関数はゲームが始まったときに最初に呼ばれる関数です。
  • 初期設定をする場所です。
    • isTouched = false; → 最初は「ぶつかっていないよ」と設定します。
    • time = 1.0f; → 時間を1秒にセットします。

3. OnCollisionEnter関数

void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "Cube")
{
destroyObj = other.gameObject;
isTouched = true;
}
}
  • この関数は、オブジェクト同士がぶつかったときに呼ばれます。
  • if(other.gameObject.name == "Cube")
    • ぶつかった相手が「Cube」という名前だった場合だけ処理を実行します。
    • 「Cube」と名前が一致したら:
      1. **destroyObj**にそのキューブを記録します。
      2. **isTouched = true;**で「ぶつかったよ」と記録します。

4. Update関数

void Update()
{
if(isTouched)
{
time -= Time.deltaTime;
if(time <= 0)
{
Destroy(destroyObj);
}
}

float dx = Input.GetAxis("Horizontal") * 0.1f;
float dz = Input.GetAxis("Vertical") * 0.1f;
transform.position = new Vector3(
transform.position.x + dx, 0, transform.position.z + dz
);
}
  • Update関数は毎フレーム(1秒間に何十回も)呼ばれる関数です。
    スクリプトのメイン処理がここに書かれています。
ぶつかったときの処理
  • if(isTouched)
    • 球がキューブにぶつかったらisTouchedtrueになり、この部分が動きます。
  • time -= Time.deltaTime;
    • 時間を少しずつ減らしていきます。
      Time.deltaTimeは「前のフレームから経過した時間」です。
  • if(time <= 0)
    • 時間がゼロ以下になると、Destroy(destroyObj);で記録していたキューブを削除します。
球の動き
  • Input.GetAxis("Horizontal")Input.GetAxis("Vertical")
    • キーボードの矢印キーやWASDキーを使って、球を左右・上下に動かします
    • **Horizontalは横方向(左右)、Vertical**は縦方向(上下)の動きを表します。
  • transform.position
    • 現在の球の位置を取り出して、そこにdxdzを足し込んで新しい位置を設定します。
    • **0.1f**を掛けて、移動を少しゆっくりにしています。

全体の動き

  1. ゲームが始まると、isTouchedfalseになり、カウントダウン時間が1秒に設定されます。
  2. 球(Sphere)は矢印キーやWASDキーで動かせます。
  3. 球がキューブ(Cube)にぶつかると:
    • そのキューブの情報がdestroyObjに記録されます。
    • isTouchedtrueになります。
  4. ぶつかった後、カウントダウンが始まり、1秒経つとそのキューブが消えます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SphereMove : MonoBehaviour
{
    public bool isTouched;
    public float time;
    public GameObject destroyObj;
    
    void Start()
    {
        isTouched = false;
        time = 1.0f;
    }

    void OnCollisionEnter(Collision other)
    {
        if(other.gameObject.name == "Cube")
        {
            destroyObj = other.gameObject;
            isTouched = true;
        }
    }

    void Update()
    {
        if(isTouched)
        {
            time -= Time.deltaTime;
            if(time <= 0)
            {
                Destroy(destroyObj);
            }
        }

        float dx = Input.GetAxis("Horizontal") * 0.1f;
        float dz = Input.GetAxis("Vertical") * 0.1f;
        transform.position = new Vector3(
            transform.position.x + dx, 0, transform.position.z + dz
        );
    }
}

スクリプトのポイント解説

  1. OnCollisionEnterで接触を検知
    • SphereがCubeにぶつかった瞬間に呼び出されます。
    • 接触したオブジェクト(other.gameObject)をdestroyObjに保存します。
  2. 時間の計測とオブジェクトの破壊
    • UpdateメソッドでTime.deltaTimeを使って1秒間を計測。
    • 計測が終わるとDestroyでオブジェクトを破壊します。
  3. プレイヤーの操作
    • 矢印キーでSphereを操作できるようにしています。

5. ゲームをプレイしてみる

  • Unityの「再生」ボタンをクリックしてゲームをスタート。
  • キーボードの矢印キーを使って、Sphereを動かします。
  • SphereがCubeにぶつかると、1秒後にCubeが消えます



Unityで効率的にゲーム制作を!おすすめのツール紹介

Unityでゲーム制作をしていると、「もっとスムーズに作業を進めたい!」と思うことありませんか?そんなときに活躍するのが、便利なツールやアセットです。この記事では、作業効率を劇的に上げるための方法を解説しながら、Unity初心者から上級者まで使える注目のツールをご紹介します。


PlayMakerでプログラミングをもっと簡単に!

UnityではC#を使ったプログラミングが基本ですが、PlayMakerを使えばコードを書かずにゲームのロジックを組み立てられるんです!初心者でも簡単に操作できるので、アイデアを素早く形にしたい人にピッタリなツールです。


PlayMakerの魅力的なポイント

  1. コードなしでゲーム制作が可能
    • ビジュアルスクリプティング機能を使うと、ノードをドラッグ&ドロップするだけで動作を設定できます。
    • プログラミングが苦手な人でも、複雑なロジックを直感的に作れるんです!
  2. 豊富なテンプレートでスピードアップ
    • よく使う機能やロジックが最初から用意されています。
    • 一からコードを書く手間がなくなるので、時間を大幅に節約できます。
  3. 初心者からプロまで対応
    • 初心者が学びやすいのはもちろん、上級者が細かいカスタマイズをするのにも対応しています。
  4. Unity Asset Storeで高評価
    • 世界中のゲーム開発者に愛されており、多くのレビューで高評価を獲得しています。

こんな場面でPlayMakerが大活躍!

  • プロトタイプ制作
    ゲームの基本的な動きを早く形にできます。例えば、敵の動きやアイテム取得の仕組みを数分で設定可能。
  • ミニゲーム制作
    小規模なプロジェクトを素早く完成させたいときに最適。
  • チーム開発
    プログラムに詳しくないデザイナーやアーティストでも、ゲームロジックの調整に参加できます。

購入はこちらから!

気になった方は、Unity Asset StoreのPlayMakerページをご覧ください!
ツールの導入で作業がグンと効率化し、制作の幅が広がりますよ。期間限定のセール情報が出ることもあるので、今がチャンスかもしれません!


最後に一言

Unityでのゲーム開発は、効率的なツールを使うことで驚くほどスムーズになります。PlayMakerは、これからゲーム制作を始める人にも、既にプロの開発者として活躍している人にもおすすめのアセットです。ぜひ導入して、アイデアを形にする楽しさを体験してください!



よくある質問

Q
Cubeが消えないのですが、どうすればいいですか?
A

以下のポイントを確認してください:

  • スクリプトをSphereに正しくアタッチしていますか?
  • Cubeの名前が正確に"Cube"になっていますか?
Q
Cubeを複数配置したい場合はどうしたらいいですか?
A

Cubeの名前を"Cube"以外にしたい場合、tagを使うと便利です。Cubeに共通のタグ(例: "Destroyable")を設定し、スクリプトを以下のように変更します:

if(other.gameObject.tag == "Destroyable")
Q
Cubeを消すタイミングをもっと遅くしたい場合は?
A

timeの初期値を変更してください(例: time = 3.0f;)。