Unityで的当てゲームの課題に取り組む

本資料は、Unityを用いた初学者向けの的当てゲームの作成手順を解説しています。的当てゲームを通して、Unityにおける物理演算、オブジェクト生成、衝突処理、エフェクト再生の基礎を学びます。

ボール(Igaguri)はPrefabとして生成され、シーンに配置された的に向かって発射されます。本資料の手順に従うことで、初心者でもシンプルなゲームを完成させることができ、さらに発展的な課題も用意しているため、より深く学ぶことができます。

課題1: 「ボールを的に向けて発射しよう」

概要

ボール(Igaguri)をPrefabとして生成し、シーンに既に配置されている的に向かって発射します。発射後、ボールが的に衝突した際にエフェクトを再生する機能も実装します。

手順

プロジェクトの確認

シーンにはすでに的が配置されていることを確認してください。的はUnityのEditorで配置済みのオブジェクトです。
次に、Prefab化されたボールがあることを確認し、このボールを的に向けて発射します。

コードの確認

以下のコードを利用し、ボールを発射し、的に衝突した際にエフェクトが再生されることを確認します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IgaguriController : MonoBehaviour
{
    public void Shoot(Vector3 dir)
    {
        GetComponent<Rigidbody>().AddForce(dir);
    }

    void OnCollisionEnter(Collision other)
    {
        GetComponent<Rigidbody>().isKinematic = true;
        GetComponent<ParticleSystem>().Play();
    }

    void Start()
    {
        Application.targetFrameRate = 60;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class IgaguriGenerator : MonoBehaviour
{
    public GameObject igaguriPrefab;

    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            GameObject igaguri = Instantiate(igaguriPrefab);

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Vector3 worldDir = ray.direction;
            igaguri.GetComponent<IgaguriController>().Shoot(worldDir.normalized * 2000);
        }
    }
}

動作確認

ボールを発射し、的に当たった際にエフェクトが再生されることを確認します。

質問

ボールが的に当たった際に、どのようなエフェクトが再生されるか説明してください。


課題2: 「発射力を調整しよう」

概要

発射するボールの力を調整し、的に正確に当てるための最適な発射力を探ります。

手順

IgaguriGenerator クラス内の Shoot(worldDir.normalized * 2000) の2000という数値を変更し、発射力を調整します。

発射力が変化することで、ボールが的に命中するかどうか、また命中のしやすさにどのような影響があるかを確認します。

質問

発射力を変えた場合、どのようにボールの動きが変わったか観察し、説明してください。


発展課題: 「的に当たったボールの消滅」

概要

ボールが的に当たった際に、1秒後にボールが消滅する機能を追加します。これにより、連続的に的を狙ってボールを発射するゲームの流れがスムーズになります。

手順

消滅のタイミングを設定

ボールが的に当たった際、OnCollisionEnterメソッドで1秒の遅延を設定して、Destroy()メソッドを使いボールを消滅させます。

コードの追加

OnCollisionEnterメソッド内に、Destroy()メソッドを呼び出す部分を追加し、1秒後にボールが消滅するように設定します。


発展課題: 「スコアシステムの追加」

概要

ボールが的に当たった際にスコアを加算し、スコアを画面に表示するシステムを追加します。

手順

  1. ボールが的に当たった際に OnCollisionEnter メソッド内でスコアを加算し、その結果をUIに表示する仕組みを実装します。
  2. さらに、複数の的に対して異なるスコアを設定し、より高度なスコアシステムを構築します。

発展課題: 「サウンド追加」

概要

ボールが的に当たった際にサウンドを再生するシステムを追加します。命中時に異なるサウンドが再生されることで、ゲームにフィードバックを追加します。

手順

サウンドファイルの準備

衝突時に再生するサウンドファイルを用意します。

的オブジェクトにAudioSourceを追加

Unityエディタでボールオブジェクトを選択し、AudioSourceコンポーネントを追加します。

サウンド再生の実装

ボールが的に当たった際に、OnCollisionEnterメソッド内でAudioSourceを使ってサウンドを再生します。


高度な発展課題: 「的の中心に近いほど高得点にしよう」

概要

  • この発展課題では、ボールが的に当たった際に、的の中心に近いほど高得点が加算されるようにします。的の中心からの距離に基づいてスコアを算出し、命中精度に応じたスコアシステムを実装します。

手順

的の中心を取得する

  • 的の中心を特定するために、Transform.positionを利用して的オブジェクトの位置を取得します。これが的の中心とみなされます。

衝突地点からの距離を計算する

  • OnCollisionEnter()メソッド内で、ボールが的に衝突した際、衝突した位置と的の中心の位置との距離を計算します。
  • 距離は Vector3.Distance() メソッドを使用して計算します。

距離に基づいてスコアを算出する

距離が短いほど高得点を獲得する仕組みを作ります。例えば、中心に近い場合(距離が小さい場合)は高得点、遠い場合(距離が大きい場合)は低得点になるようにします。

具体的には、以下のようなスコア算出式を用います:

float maxDistance = 10.0f; // 的の中心からの最大距離(調整可能)
float distance = Vector3.Distance(collisionPoint, targetCenter);
int score = Mathf.Max(0, (int)((maxDistance - distance) * 10)); // スコアが0以上になるように

スコアを表示する

  • 計算されたスコアをUIに表示し、命中時にプレイヤーにフィードバックを与えるシステムを追加します。

サンプルコード

void OnCollisionEnter(Collision other)
{
    if (other.gameObject.CompareTag("Target"))
    {
        // 的の中心位置を取得
        Vector3 targetCenter = other.transform.position;
        // ボールが衝突した地点
        Vector3 collisionPoint = other.contacts[0].point;
        // 衝突地点と的の中心との距離を計算
        float distance = Vector3.Distance(collisionPoint, targetCenter);
        
        // スコアを距離に応じて計算
        float maxDistance = 10.0f; // 調整可能な最大距離
        int score = Mathf.Max(0, (int)((maxDistance - distance) * 10)); // 0以上のスコアに制限
        
        // スコアをUIに表示(スコア表示部分は事前に実装されていると仮定)
        Debug.Log("Score: " + score);

        // ボールの動きを止め、エフェクトを再生
        GetComponent<Rigidbody>().isKinematic = true;
        GetComponent<ParticleSystem>().Play();
    }
}

質問

  1. 的の中心に近いほどスコアが高くなる仕組みが適切に機能しているか確認し、実装上の工夫点を説明してください。
  2. maxDistance の値を調整して、スコアの変動範囲を変更してみてください。その結果を報告してください。

これにより、命中精度に基づいたスコアシステムを追加でき、的当てゲームにさらに戦略的な要素が加わります。

まとめ

本資料では、Unityを使って簡単な的当てゲームを作成する手順を紹介しました。物理エンジンの使用、オブジェクトの生成、衝突判定、エフェクトの再生など、ゲーム開発の基礎的なスキルを身につけることができます。発展課題に挑戦することで、より高度なゲーム作りにも挑戦してください。

Unity

Posted by hidepon