Unity 6でIgaguriを作る① ― 3Dの世界でイガグリを飛ばして、的に刺す(PC版)

広告

これまでの4つのゲームは、すべて2Dでした。今回の「Igaguri」は、いよいよ3Dのゲームです。画面をクリックすると、その方向へイガグリ(栗のイガ)が飛んでいき、奥にある的に刺さります。

3Dと聞くと難しそうに感じるかもしれませんが、ClimbCloudで学んだ「Rigidbodyで物理を付けて、AddForceで力を加える」という考え方は、3Dでもほとんどそのまま使えます。違いは、奥行き(Z)が加わることです。

Unity 6でClimbCloudを作る① ― Rigidbody2Dで歩いて、クリックでジャンプする(PC版)

Igaguriも2回に分けて解説します。

回内容
今回(①)2Dと3Dの違い/シーンの準備/イガグリを前へ飛ばす/的に刺さって止まる
次回(②)クリックした方向へ飛ばす(Ray)/イガグリを何個も作る/当たったときのパーティクル演出

この記事で作るもの

  • 奥に的、手前にイガグリを置いた3Dのシーン
  • ゲームを始めると、イガグリが前へ飛んでいく
  • イガグリが的に当たったら、その場でピタッと止まる(刺さったように見える)
項目内容
UnityUnity 6(サンプルは6000.1で作成)
テンプレートUniversal 3D(URP)
使う素材igaguri.fbx(イガグリ)、target.fbx(的)

1. 2Dから3Dへ ― 何が変わるのか

まずは、これまでの2Dと今回の3Dで、何が変わるのかを整理しておきましょう。

2D(これまで)3D(今回)
座標X(左右)・Y(上下)X(左右)・Y(上下)・Z(奥行き)
位置を表す型Vector2Vector3
カメラOrthographic(遠くても同じ大きさ)Perspective(遠くのものは小さく見える)
物理Rigidbody2DRigidbody
当たりの形BoxCollider2D、CircleCollider2DBoxCollider、SphereCollider
ぶつかったときOnCollisionEnter2D(Collision2D)OnCollisionEnter(Collision)
画像・モデルスプライト(png)3Dモデル(fbx)

名前の最後に「2D」が付くかどうかで、2D用と3D用が分かれています。2D用と3D用は混ぜて使えない(Rigidbody2DとBoxColliderはぶつからない)ので、3Dでは「2Dが付かないほう」を使うと覚えておきましょう。

Unityの3Dでは、Zがプラスの方向が「奥」です。カメラは手前(Zがマイナス)から奥を向いていて、イガグリは奥へ向かって飛んでいきます。

2. シーンを準備する

Universal 3D のテンプレートで新しいプロジェクトを作ります。3Dのテンプレートには、最初からカメラとライト(Directional Light)が入っています。

オブジェクトPositionメモ
Main Camera(0, 1, -10)手前から奥を見る(Field of View:60)
的(target)(0, -5, 14)target.fbx をシーンにドラッグ
イガグリ(igaguri)(0, 1, -9)igaguri.fbx をシーンにドラッグ。カメラのすぐ前

教科書のサンプルでは、地面に砂漠のステージのアセットを y = -5 の位置に置いて雰囲気を出しています。地面がなくても、イガグリを飛ばして的に当てる練習はできます。

的にコライダーを付ける

的に BoxCollider を追加して、次のように設定します。

設定項目値理由
Center(0, 6.5, 0)的のモデルは足元が基準点なので、板の部分の高さまで当たりを上げる
Size(3.8, 3.8, 0.8)丸い板の大きさに合わせた、薄い箱の形

的のモデルは、足(台)の部分がPositionの基準になっています。的全体は y = -5 に置いていますが、板の中心はそこから6.5上(y = 1.5)にあるので、BoxColliderのCenterを上にずらして板に合わせています。

イラスト:2Dと3Dの違い、シーンの配置(カメラ・的・イガグリ)

3. イガグリに物理を付ける

イガグリを選び、次の2つのコンポーネントを追加します。

コンポーネント設定役割
RigidbodyMass:1、Use Gravity:オン重力と力で動くようにする
SphereColliderRadius:0.35イガグリの形に合わせた球の当たり

ここで再生すると、イガグリはその場で下に落ちていきます。重力が効いている証拠です。

4. イガグリを飛ばして、的に刺す(IgaguriController)

Create → Scripting → MonoBehaviour Script で IgaguriController を作り、イガグリに付けます。

ステップ1:前へ飛ばす

using UnityEngine;

public class IgaguriController : MonoBehaviour
{
    // 指定した方向と強さで、イガグリを飛ばす
    public void Shoot(Vector3 dir)
    {
        GetComponent<Rigidbody>().AddForce(dir);
    }

    void Start()
    {
        Application.targetFrameRate = 60;

        // 動作確認:ゲーム開始時に、前(Zの奥)へ少し上向きに飛ばす
        Shoot(new Vector3(0, 200, 2000));
    }
}

Vector3(0, 200, 2000) は、「左右に0、上に200、奥に2000」の力を表します。奥へ強く押しながら、少しだけ上にも押すので、イガグリは山なりに奥へ飛んでいきます。

飛ばす処理を Shoot というメソッドに分けて public にしているのは、次回、別のスクリプト(クリックを受け取るスクリプト)から呼び出すためです。CatEscapeで監督の DecreaseHp を呼んだのと同じ考え方です。

Unity 6でCatEscapeを作る② ― 当たり判定とHPゲージ、スクリプト同士の連携(PC版)

ステップ2:的に当たったら止める(完成)

今のままだと、イガグリは的に当たって跳ね返ってしまいます。当たった瞬間に止めて、刺さったように見せましょう。

using UnityEngine;

public class IgaguriController : MonoBehaviour
{
    // 指定した方向と強さで、イガグリを飛ばす
    public void Shoot(Vector3 dir)
    {
        GetComponent<Rigidbody>().AddForce(dir);
    }

    // 何かにぶつかった瞬間に呼ばれる
    void OnCollisionEnter(Collision collision)
    {
        // 物理の影響を受けないようにして、その場で止める
        GetComponent<Rigidbody>().isKinematic = true;
    }

    void Start()
    {
        Application.targetFrameRate = 60;

        // 動作確認:ゲーム開始時に、前(Zの奥)へ少し上向きに飛ばす
        Shoot(new Vector3(0, 200, 2000));
    }
}

OnCollisionEnter は、コライダーどうしがぶつかった瞬間にUnityが自動で呼んでくれるメソッドです。ClimbCloudの OnTriggerEnter2D と同じ仲間で、こちらは「すり抜けずにぶつかる」ときに呼ばれます。

isKinematic で「刺さった」ように見せる

isKinematicRigidbodyの動き
false(最初の状態)重力や力、衝突の影響を受けて動く
true物理の影響を受けなくなり、その場に止まる

ぶつかった瞬間に isKinematic を true にすると、イガグリは重力でも落ちず、跳ね返りもせず、その位置でピタッと止まります。その結果、的に刺さったように見えるのです。

イラスト:AddForceで飛ばし、OnCollisionEnterでisKinematicにして的に刺す流れ

5. 数字で見るイガグリの飛び方

ClimbCloudと同じように、ざっくり数字で確かめてみます。

  • AddForce の力は物理の計算1回分(標準で0.02秒)だけ加わり、イガグリの重さ(Mass)は1
  • なので、飛び出す速さは (0, 200, 2000) × 0.02 = (0, 4, 40)。奥へ秒速40、上へ秒速4
  • イガグリ(z = -9)から的(z = 14)までは23なので、約0.58秒で的に届く
  • その間に重力で少し落ちて、的に届くときの高さは約1.7。的の中心(y = 1.5)のあたりに当たる

Shoot に渡す数値を変えて、どこに当たるか試してみましょう。上の値(200)を大きくすると上のほうに、小さくすると下のほうに当たります。

6. イガグリをPrefabにしておく

次回はクリックするたびにイガグリを作るので、イガグリをPrefabにしておきます。CatEscapeの矢と同じ手順です。

  1. Hierarchyのイガグリの名前を igaguriPrefab に変える
  2. HierarchyからProjectウィンドウへドラッグ&ドロップして、Prefabを作る

シーンのイガグリは、次回まで動作確認用に残しておいて大丈夫です。

Unity 6でCatEscapeを作る① ― 猫の移動と、Prefabで矢を降らせる仕組み(PC版)

7. よくあるつまずき

イガグリが的をすり抜ける

的にBoxColliderが付いていないか、Center(0, 6.5, 0)の設定がずれていて、板の位置に当たりがありません。的を選んでSceneビューを見ると、緑色の線でコライダーの形が表示されるので、板と重なっているか確認しましょう。

ぶつかっても止まらない(OnCollisionEnter が呼ばれない)

  • メソッド名が OnCollisionEnter と正しく書けているか(OnCollisionEnter2D は2D用)
  • 引数が Collision になっているか(Collision2D ではない)
  • イガグリに付けたのが Rigidbody と SphereCollider か(2D用の Rigidbody2D などを付けていないか)

MissingComponentException が出る

MissingComponentException: There is no 'Rigidbody' attached to the "igaguri" game object, but a script is trying to access it.

イガグリにRigidbodyが付いていません。Inspectorの Add Component から Rigidbody(2Dが付かないほう)を追加しましょう。

イガグリが飛ばずに、下に落ちるだけ

Start の中で Shoot を呼んでいるか確認しましょう。スクリプトがイガグリに付いているかも確認します。

まとめ

  • 3Dでは座標にZ(奥行き)が加わり、位置や方向は Vector3 で表す
  • 物理やコライダーは「2Dが付かないほう」(Rigidbody、SphereCollider、BoxCollider)を使う
  • AddForce(new Vector3(0, 200, 2000)) で、奥へ少し上向きに飛ばせる
  • OnCollisionEnter は、ぶつかった瞬間に呼ばれる
  • isKinematic = true にすると物理の影響を受けなくなり、その場に止まる

次回は、クリックした方向へイガグリを飛ばす仕組み(Ray)と、当たったときにパーティクルでトゲトゲを飛び散らせる演出を作ります。

訪問数 2 回, 今日の訪問数 2回

広告