スポンサーリンク
UnityUnityメモ

Unity初心者向け|読みやすいコードを書く7つのコツ【例付きでわかりやすく解説】

Unity

1. はじめに|読みやすいコードがゲーム開発をラクにする

ゲームを作っていると、気づけばスクリプトがどんどん長くなって、「あれ?この処理ってなんだっけ……」と悩んでしまうこと、ありませんか?
特にUnityでの開発では、シーンやオブジェクトが増えていくにつれて、スクリプトの複雑さもどんどん増していきます。

そんなときに大切なのが、「読みやすいコードを書く力」です。
難しいテクニックを使う必要はありません。ちょっとした工夫を取り入れるだけで、スクリプトは見違えるほどスッキリします。

読みやすいコードが書けるようになると、こんなメリットがあります:

  • バグを見つけやすくなる
  • 後から修正しやすい
  • 他の人が見ても理解しやすい(チーム開発でも安心!)

この記事では、Unityでゲームを作り始めたばかりの方に向けて、「どうすればコードが読みやすくなるのか?」を実例付きでやさしく解説します。
読みやすいコードは、未来の自分へのプレゼントでもあります。今日から一緒に、“読むのが楽なコード”を目指していきましょう!




2-1. ネストは浅く!ガード節でスッキリ書こう

まず最初に意識したいのは、「ネストを深くしない」ことです。
ネストとは、ifforなどの処理が何段にも重なっている状態のこと。コードが深く入り組むと、見ただけで「うっ…」となってしまいます。

🌀 ネストが深いコードの例

void CheckAndAttack()
{
if (enemy != null)
{
if (enemy.hp > 0)
{
if (player.CanAttack())
{
enemy.TakeDamage(10);
}
}
}
}

こういうコード、最初は普通に見えるかもしれません。でも、ネストが3段にもなると、読み手は「今どこの条件だっけ?」と迷いがちです。


✅ ガード節で書き直すと…

ネストを浅くするには、「ガード節(Guard Clause)」を使うのがおすすめです。
これは、「条件に合わない場合は先に抜ける」書き方です。

void CheckAndAttack()
{
if (enemy == null) return;
if (enemy.hp <= 0) return;
if (!player.CanAttack()) return;

enemy.TakeDamage(10);
}

こちらのほうが、コードの流れが一直線でシンプルですよね。
「この関数はなにをしているのか」が、上から順に読み進めるだけで理解できます。


💡 ポイントまとめ

  • returncontinueを早めに使うことで、ネストを深くしない
  • 条件が揃わないなら「先に抜ける」スタイルで書く
  • 「ifの中にif、その中にさらにif…」を避けるだけで、読みやすさが段違い!

ネストを浅くするだけで、コードがかなりスッキリしますよ。




2-2. マジックナンバー禁止!定数化で意味を明確に

コードの中に、突然 5100 といった数値がポンっと出てくること、ありませんか?
こういった意味がわからない数字は「マジックナンバー」と呼ばれ、可読性の大敵です。

🧙‍♂️ マジックナンバーの例

if (score >= 100)
{
Debug.Log("クリア!");
}

一見シンプルですが、「100って何の意味?」と疑問に思いませんか?
この「100」がクリア条件であることをパッと見で判断できないのが問題です。


✅ 定数を使った書き方

そこでおすすめなのが、「定数(const)」を使うことです。

const int CLEAR_SCORE = 100;

if (score >= CLEAR_SCORE)
{
Debug.Log("クリア!");
}

こうすることで、コードを読む人がその数字の意味を一目で理解できるようになります。
また、あとから条件を変更したいときも、定数を1か所変えるだけで済むのも大きなメリットです。


📌 enumも便利!

状態の切り替えなどに数字を使っているなら、enum(列挙型)を使うとさらに読みやすくなります。

enum GameState
{
Title,
Playing,
GameOver
}

// 使用例
if (currentState == GameState.GameOver)
{
ShowRetryButton();
}

数値の 2 で「GameOver」を表すより、名前付きで管理した方が圧倒的にわかりやすいですよね。


💡 ポイントまとめ

  • 数字だけでは意味が伝わらない → 定数名を付けよう
  • 変更があっても、定数なら一括で修正できる
  • 状態やカテゴリには enum を活用して、意味を持たせる



2-3. 長い計算式はローカル変数で分かりやすく

コードを書いていると、「何やってるかはわかるけど…長すぎて読みにくい!」という場面に出くわします。
特に条件式や計算式が横にズラーっと並んでいるコードは、初心者にとってかなりの威圧感があります。


🌀 読みにくい計算式の例

if ((player.hp + player.defense) * 1.5f > enemy.attackPower + enemy.criticalBonus - 10)
{
player.TakeDamage();
}

式が長すぎて、「えーと、これは何を比べてるんだっけ…?」と迷ってしまいますよね。


✅ ローカル変数で読みやすく分割

そんなときは、計算式をいくつかのローカル変数に分けて書くのがオススメです。

float playerPower = (player.hp + player.defense) * 1.5f;
float enemyPower = enemy.attackPower + enemy.criticalBonus - 10;

if (playerPower > enemyPower)
{
player.TakeDamage();
}

どうですか?すごく見通しが良くなりましたよね。
それぞれの式に名前が付くことで意味が明確になり、他の人が読んでも理解しやすいコードになります。


💡 ポイントまとめ

  • 長い式は分割してローカル変数に代入しよう
  • 式に名前を付ける=意味を付けること
  • ローカル変数は1回しか使わなくてもOK!読みやすさ優先でOK!



2-4. 条件式の意味は関数名で説明しよう

コードの中でif文が出てきたとき、その条件が何を表しているかすぐにわかるようにしたいですよね。

でも、こんな風に複雑な条件式がズラリと並んでいたら、どうでしょう?


🌀 読みにくい条件式の例

if (player.hp <= 0 && !player.isInvincible && !gameManager.isGameOver)
{
player.Die();
}

たしかに意味は通じますが、ひと目で「どんなときに死ぬのか」パッと理解するのは難しいですよね。
そんなときは、関数に分けて名前をつけることで、読みやすさがぐっと上がります。


✅ 関数名で「意味」を伝える

if (CanPlayerDie())
{
player.Die();
}

bool CanPlayerDie()
{
return player.hp <= 0 && !player.isInvincible && !gameManager.isGameOver;
}

こう書くと、「プレイヤーが死ぬ条件かどうか」という意図が一目で伝わるようになります。
関数名はまるで文章のように読めるのが理想です。


💡 ド・モルガンの法則ってなに?

条件を扱っているときに出てくる**「ド・モルガンの法則」**も、覚えておくと便利です。
これは、複雑な否定条件をシンプルに書き換えるためのルールです。

例:これを

if (!(isJumping || isFalling))

こう書ける

if (!isJumping && !isFalling)

両方意味は同じですが、状況によって読みやすくなる形を選べるのがポイントです。


💡 ポイントまとめ

  • 条件式は関数にして名前をつけると読みやすい
  • 関数名だけで「何を判断しているか」が伝わるようにしよう
  • 複雑な否定条件はド・モルガンの法則でスッキリ!



2-5. 配列の範囲外アクセスを防ぐには?

UnityでもC#でも、配列(やリスト)を使っているときにありがちなミスが、「存在しない要素にアクセスしてしまうこと」です。
エラーになるどころか、C++のような低レベル言語ではエラーすら出ず、予期せぬ動作になることもあります。


🌀 危ないコードの例

int[] scores = {100, 200, 300};
Debug.Log(scores[3]); // ← 存在しない!

このように、scores[3]は存在しない要素へのアクセス。Unityなら例外が出て止まりますが、気づかないまま本番に入るとバグの温床になります。


✅ 安全にアクセスする関数を用意しよう

以下のように、安全にアクセスする専用関数を作っておくと安心です。

int GetScoreSafe(int[] array, int index)
{
if (index < 0 || index >= array.Length)
{
Debug.LogWarning("配列の範囲外アクセス:" + index);
return -1; // 無効値を返す
}
return array[index];
}

これを使えば、いきなり落ちたりせず、予期しないアクセスを検知して対処することができます。


💣 assertでバグを強制的に止める方法も

「ここで配列外アクセスが起きるのは絶対におかしい!」という場合は、Debug.Assert を使って、開発中にプログラムを強制ストップさせることもできます。

Debug.Assert(index >= 0 && index < array.Length, "配列の範囲外アクセス!");

本番ではオフになりますが、テスト時に問題にすぐ気づけるので安心です。


💡 ポイントまとめ

  • 配列にアクセスする前に index が範囲内かチェックする
  • 使い回すなら 安全なアクセス関数を作るのがおすすめ
  • 開発中のミスは Debug.Assert()で早めに見つけよう



2-6. 関数は短く!機能ごとに分けて見通しを良く

関数の中に処理をどんどん詰め込んでいくと、いつの間にか100行超えの巨大関数ができあがってしまうことがあります。

たとえそれが正しく動いていたとしても、あとから読むのがとにかく大変になります。
「この処理、どこからどこまで?」と悩む時間が増えてしまい、ミスやバグの原因にもなります。


🌀 長すぎる関数の例

void UpdateCharacter()
{
// 入力を処理
// 位置を更新
// 衝突チェック
// アニメーション変更
// 状態遷移
// エフェクト再生
// サウンド再生
// デバッグ用の表示
// さらに別の条件処理...
}

これでは、1つの関数で全部をやりすぎです。
頭の中で処理の流れを追うのも一苦労ですよね。


✅ 機能ごとに関数を分けよう!

処理は、「これはこれ」「あれはあれ」と小さな関数に分けて定義しましょう。

void UpdateCharacter()
{
HandleInput();
MoveCharacter();
CheckCollision();
UpdateAnimation();
}

このように分けるだけで、全体の流れがパッと見で理解できるようになります。

そしてそれぞれの関数の中身も短くなるので、修正や機能追加がしやすくなります。


🧩 switch文も関数化しよう!

ゲームの状態管理などでよく使うswitch文も、長くなりやすいポイント。
それぞれのcaseごとに関数へ切り出すのが効果的です。

switch (gameState)
{
case GameState.Title:
ShowTitleScreen();
break;
case GameState.Playing:
RunGameplay();
break;
case GameState.GameOver:
ShowGameOver();
break;
}

**見通しが良く、保守性もアップ!**状態が増えても怖くありません。


💡 ポイントまとめ

  • 関数は 1つの目的だけに絞るのが鉄則!
  • 機能単位で分割して、全体の流れを把握しやすくする
  • switch文それぞれの処理を関数化するとベスト



3. まとめ|コードの見た目が変われば、開発効率が変わる

ここまで、Unity初心者でもすぐ実践できる「読みやすいコードの書き方」を紹介してきました。
どれも特別なスキルは必要なく、ちょっとした意識と工夫でコードがグッと見やすくなります。

改めて、今回のポイントをおさらいしておきましょう。


✅ 今すぐできる7つの読みやすくなる工夫

  1. ネストを浅くする:ガード節で早めに抜ける
  2. 定数を使う:マジックナンバーをなくそう
  3. ローカル変数で式を分割:横に長い計算式は名前付きで整理
  4. 条件式を関数にする:関数名で意図を伝える
  5. 配列の安全なアクセス:範囲外チェックで安心
  6. 関数を短く分ける:1つの役割に集中させる
  7. switch文も関数化:状態ごとに見通しよく管理

読みやすいコードにすることで、自分も他の人もスムーズに作業できるようになります。
また、バグが起きても早く見つけやすくなり、機能追加もラクになります。

つまり、**コードの読みやすさは「将来の自分を助ける最大の武器」**なんです。

今後はさらに、「良い命名」「コメントの書き方」「設計の工夫」なども意識していくと、より上級者に近づけますよ。


🛠 おすすめアセット

Editor Console Pro

Unityのコンソールがもっと使いやすくなる!
Editor Console Proは、標準のログ表示を強化してくれる超定番アセット。検索機能・フィルター・カラー分けなどが充実しており、読みやすいコードと合わせて、デバッグ効率を大幅にアップできます。

✅ 特徴

  • エラーや警告を色分け表示
  • キーワード検索&強調表示
  • 複数のログ履歴を同時に表示可能
  • 巨大なプロジェクトでもログの迷子にならない!

コードを読みやすく保つには、エラーの発見と修正もスムーズであるべき。
このアセットを導入すれば、開発中のログ確認が快適になり、「見やすさ」「修正しやすさ」の両方を強化できます。

👉 Editor Console Pro をAssetStoreで見る


あわせて読みたい

読みやすいコードを書く力をもっと伸ばしたい人や、Unityのスクリプトに自信をつけたい人におすすめの記事をピックアップしました。ぜひあわせてご覧ください!


よくある質問(FAQ)

Q
コードを関数に分けすぎると、かえって読みにくくなりませんか?
A

分け方に迷ったら、「1つの関数=1つの目的」を意識しましょう。
関数名を見ただけで「何をする処理か」がわかるようにしておけば、関数が増えても読みやすさは保てます。逆に、あいまいな名前のまま分けてしまうと読みにくくなるので、名前のつけ方がカギです。

Q
マジックナンバーって本当に使っちゃダメ?
A

小さな値(例:i < 3 などのループ内)ならOKな場面もありますが、意味を持つ数値には必ず名前をつけるようにしましょう。
「クリアスコア」「最大HP」「攻撃力の上限」など、ゲームルールに関わる値は定数で管理しておくのが安全です。

Q
初心者のうちは、とにかく動けばいいと思ってしまいます…。
A

その気持ち、よくわかります!
最初は動かすだけでも充分すごいこと。でも、読みやすさを少し意識するだけで、後からの修正やバグ修正がラクになるので、少しずつ「キレイに書く」習慣を取り入れていくのがおすすめです。未来の自分が助かります!

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク