🗂

3Dゲームを最小コードで動かすまでのメモ(Unity)

に公開

がっつり本を書くほどではないけど、はじめての3Dを形にするまでの「最短ルート」を自分用にメモしておきます。
断定しません。
こうやったらすぐ動いた、くらいの温度感。
キーワードは「3Dゲームの作り方」。
初心者向けに寄せますが、わたし自身も毎回忘れるので、手順と失敗点を淡々と並べます。

まずはゴールを小さく:動く・拾う・終わる

最初から広いマップや派手なエフェクトを盛ると進まないので、ゴールを「動ける→アイテムを1個拾える→ゴールに触れたら終了」の3点に固定しました。
これだけでも“3Dゲームを作った”感は出ます。
難しいAIやスキルはあとで。

3Dゲームの作り方を調べると、大作っぽい言葉が並びがち。
ここでは「箱(プレイヤー)」と「球(アイテム)」「柱(ゴール)」の3種類だけで通します。
素材はデフォルトプリミティブでOK。

やってみると、3Dならではの座標(X/Zで平面、Yが高さ)と当たり判定のクセを早めに体で覚えられます。
Unityの概念も「Hierarchy=存在、Scene=配置、Inspector=設定」と割り切ると飲み込みやすかったです。

新規3Dプロジェクト:テンプレのまま触る

Unity Hub→New Project→「3D Core」。
テンプレはそのまま。
シーンに最初からあるDirectional LightとMain Cameraを残し、地面用に[Plane]、プレイヤー用に[Cube]を追加。
名前はGround/Playerにしました。

GroundはScaleを(10,1,10)くらいに拡張。
PlayerはPositionを(0,0.5,0)あたりに置くと地面にめり込みにくい。
ここで一度再生ボタンを押して“何も起きない”ことを確認します。
最初に静かな状態を知っておくと、後のバグ切り分けが楽。

操作感は最小コードで付けます。
Input Systemを導入するとスマホやパッド向けに拡張しやすいですが、まずは従来のInput.GetAxisで移動だけ出しちゃう方が早かったです。

最小の移動:Translateでまず動かす(あとで差し替え前提)

本気の3DアクションはCharacterControllerやRigidbodyが王道。
ただ、いったん「動いた」を最速で掴むなら、Translateを使った移動が手軽でした。
のちに物理系へ置き換えやすいよう、速度と入力は変数化しておきます。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
public float speed = 5f;

void Update()
{
    float x = Input.GetAxis("Horizontal");
    float z = Input.GetAxis("Vertical");
    Vector3 dir = new Vector3(x, 0, z);
    transform.Translate(dir * speed * Time.deltaTime);
}

}

この時点でWASDで箱が歩きます。
斜め移動が速くなるのが気になるならdirをnormalizedに。
物理衝突を期待する場合は、のちほどRigidbody+MovePositionに差し替える想定で進めます。

最初から完璧を狙わず、「まずは平面上で動いた」をチェックポイントにすると、3dゲーム 作り方 初心者の壁を越えやすかったです。

カメラは後追い1本:LateUpdateでチラつきを避ける

見た目の“ゲームらしさ”はカメラで大きく変わります。
最初は固定視点でもOKですが、追従にすると一気にそれっぽい。
プレイヤーの後方やや上から覗く標準的なアングルを固定で置いておき、回転はあとで。

using UnityEngine;

public class FollowCamera : MonoBehaviour
{
public Transform target;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    if (!target) return;
    transform.position = target.position + offset;
    transform.LookAt(target);
}

}

UpdateではなくLateUpdateで追従すると、プレイヤー移動後にカメラが動くため、1フレームのズレで起きる小さなガタつきが減りました。
スマホでも安定。

回転や当たり判定を伴うTPSカメラは別テーマ。
ここでは“見失わない固定カメラ”を最短で用意して、ゲームの核(移動・取得・終了)に先に着手します。

当たり判定:Triggerで拾う→UIなしでも達成感

アイテムは[Sphere]を作ってTagを「Item」に。
Sphere Colliderは「Is Trigger」をON。
Player側はOnTriggerEnterで検出し、消す+簡易スコアを数える程度に留めます。
UIは後回し。

using UnityEngine;

public class ItemPicker : MonoBehaviour
{
public int score;

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Item"))
    {
        score++;
        Destroy(other.gameObject);
    }
}

}

拾えた瞬間の体験ができれば十分。
3Dゲームの作り方ではUIから入りがちですが、UIが未整備でも「触れる→消える→数が増える」はゲーム感をちゃんと出してくれます。

なお、物理で押し合いしたい場合はTriggerではなく衝突(Collider+Rigidbody)に。
初心者のうちは「動かすオブジェクト(動力側)」にRigidbodyを付け、壁・床はColliderのみ、のパターンに寄せると混乱が少なかったです。

“終わり”を作る:ゴール柱に触れたらクリア

終わりがあると学習が進みやすいので、[Cylinder]を「Goal」タグにしてトリガー化。
触れたらシーンをリロード、あるいは簡易メッセージを出して止める。
ここでは停止で十分。

using UnityEngine;

public class Goal : MonoBehaviour
{
public GameObject finishText; // 任意。なくても可
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
if (finishText) finishText.SetActive(true);
Time.timeScale = 0f; // 簡易停止
}
}
}

Time.timeScale=0は簡易的ですが、最小の“終わり”を作るには便利でした。
ちゃんとやるならState管理やシーン遷移に進みますが、まずは達成の瞬間が見えることを優先。

この3点セット(動く・拾う・終わる)までを1時間枠で回すと、unity 3dゲーム 簡単の検索結果で見るよりも、手の内感がつきます。

ライトとマテリアル:重くしない見栄えの底上げ

Directional LightのRotationを少し傾けるだけで影ができ、立体感が出ます。
Groundにマテリアルを1枚当てて色を落ち着かせると、スクショが急に“作品”っぽくなるのでおすすめ。

ライトベイクやポストプロセスは強力ですが、最初は深追いしません。
ライティングはハマると時間が溶けるので、完成の邪魔をしない範囲で「影と色」を揃えるだけに留めました。

サイズ問題にも軽く触れておきます。
モデルを入れるときは、Import Scaleを確認して1m基準に寄せると当たり判定のズレが減りました。
3dゲーム作るサイトやアセットストアの素材は出自がバラバラなので、最初に基準合わせを一度やる、が後の幸せ。

スマホで動かす:最小のビルド確認(Android例)

ここまで来たらスマホで動かしておくと熱が続きます。
Build Settings→Android→Switch Platform。
Player Settingsで解像度をPortrait/ Landscapeどちらかに固定。
USB接続→Build And Run。
最初は時間がかかるけど、画面で箱が動いた瞬間の満足度は高い。

入力は仮のままでも、軸入力を仮想スティックに置き換える余地が見えます。
Input Systemを導入してActionに抽象化→デバイス別Bindingで広げるのが正道ですが、まずは“動作確認”を優先。

パフォーマンスはドロワブル(ピクセルフィル)で詰まることが多い印象。
平面+少数オブジェクトなら問題になりづらいです。
凝る前にProfilerで一度だけ確認して、数字の雰囲気だけ掴んでおくと安心。

最小からの差し替え:物理・段差・カメラの順で

Translate移動は段差や衝突で不自然になりがち。
完成を踏んだ後で、Rigidbody+MovePosition(FixedUpdate)に置き換えると、つまずきが減りました。
AddForceは気持ちいいけど制御が難しめ。

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class RBMove : MonoBehaviour
{
public float speed = 5f;
Rigidbody rb;

void Awake(){ rb = GetComponent<Rigidbody>(); rb.freezeRotation = true; }

void FixedUpdate()
{
    float x = Input.GetAxis("Horizontal");
    float z = Input.GetAxis("Vertical");
    Vector3 v = new Vector3(x, 0, z).normalized * speed;
    rb.MovePosition(rb.position + v * Time.fixedDeltaTime);
}

}

段差はCapsule Colliderがラク。
角に引っかかる場合は、スキン幅(Physics設定)やSlope Limit(CharacterController派)を調整。
カメラも、回転をマウス入力に割り当てると一気に“3Dっぽさ”が増しますが、酔いには注意。

最小コアが安定してから“見た目・アクション・演出”を足すと、破綻が起きにくかったです。
unity 3d アクションゲーム 作り方を眺めると多機能な例が多いけど、差し替え順を決めて一つずつ。

よく出たつまずき:原因の切り分けメモ

「床をすり抜ける」→PlayerにRigidbodyがあって、地面側にColliderがない/Is Triggerになっている。
まずは床をMeshColliderではなくBox Colliderで単純化すると安定。

「影が消えた」→ライトのModeや強度、カメラのRendering Path、品質設定の影距離。
まずはライトのRotationとShadow Typeだけ見直すと戻ることが多かったです。

「斜めが速い」→入力ベクトルをnormalized。
あるいは速度を方向と別変数に。
移動処理をUpdateとFixedUpdateで混在させたときのぶれも体感ズレの原因でした。

サンプルと比較:最小セットの良さと限界

unity 3dゲーム サンプルを触ると、プロの設計が一気に学べます。
ただ、最小セットを自分で通すと「何がわからないか」が明確になりました。
具体的には、状態管理(Game/Result/Retry)と入出力抽象化(Action)あたりが次の課題として浮きます。

チュートリアルをそのまま追うより“自分の手順”を1回書き出しておくと、次にどれを置き換えるかの地図になります。
今回のメモはまさにそれ。
unityゲーム 作り方 初心者の人にも、順番の参考になるかもです。

ちなみに、3dゲーム 作り方 スマホ視点だけで組むなら、最初からスティックUIを置いて進めるのもアリ。
今回はPC→スマホの順でしたが、目的に合わせて前後しても良さそうでした。

まとめ:まずは“動く・拾う・終わる”を1時間で

3Dゲームの作り方を学ぶとき、最初の成功体験はとても大事でした。
箱が動いて、球を拾って、柱に触れたら終わる——この3点が回ると、次の欲(ジャンプ、敵、UI、演出)にきれいにつながります。
最小コードでいいので、まずは1時間で通す。
通ったら各所を差し替えて育てる。
このループが一番続きました。

もし体系的に段階を踏みたいときは、わたしは3D基礎→入力抽象化→物理移動→カメラ→UI→ビルドの順が相性良かったです。
教材で補強するなら、必要になったタイミングでピンポイントに。
学びの負荷が小さく、完成が遠のきません。

自分の最短ルートは人それぞれ。
今回のメモが、あなたの最初の一本の“地図”になればうれしいです。
体系的にコースで進めたい場合はUnity入門の森ショップの基礎→実装の流れが、最小セットと相性よかった印象でした。

Discussion