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のシーン
- ゲームを始めると、イガグリが前へ飛んでいく
- イガグリが的に当たったら、その場でピタッと止まる(刺さったように見える)
| 項目 | 内容 |
|---|---|
| Unity | Unity 6(サンプルは6000.1で作成) |
| テンプレート | Universal 3D(URP) |
| 使う素材 | igaguri.fbx(イガグリ)、target.fbx(的) |
1. 2Dから3Dへ ― 何が変わるのか
まずは、これまでの2Dと今回の3Dで、何が変わるのかを整理しておきましょう。
| 2D(これまで) | 3D(今回) | |
|---|---|---|
| 座標 | X(左右)・Y(上下) | X(左右)・Y(上下)・Z(奥行き) |
| 位置を表す型 | Vector2 | Vector3 |
| カメラ | Orthographic(遠くても同じ大きさ) | Perspective(遠くのものは小さく見える) |
| 物理 | Rigidbody2D | Rigidbody |
| 当たりの形 | BoxCollider2D、CircleCollider2D | BoxCollider、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を上にずらして板に合わせています。

3. イガグリに物理を付ける
イガグリを選び、次の2つのコンポーネントを追加します。
| コンポーネント | 設定 | 役割 |
|---|---|---|
| Rigidbody | Mass:1、Use Gravity:オン | 重力と力で動くようにする |
| SphereCollider | Radius: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 で「刺さった」ように見せる
| isKinematic | Rigidbodyの動き |
|---|---|
| false(最初の状態) | 重力や力、衝突の影響を受けて動く |
| true | 物理の影響を受けなくなり、その場に止まる |
ぶつかった瞬間に isKinematic を true にすると、イガグリは重力でも落ちず、跳ね返りもせず、その位置でピタッと止まります。その結果、的に刺さったように見えるのです。

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の矢と同じ手順です。
- Hierarchyのイガグリの名前を
igaguriPrefabに変える - 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)と、当たったときにパーティクルでトゲトゲを飛び散らせる演出を作ります。










ディスカッション
コメント一覧
まだ、コメントがありません