ダークモード
こまったときは
うまく動かないときに見るページです。ゲーム作りでは、うまくいかないのがふつうです。あわてずに、1つずつ確認していきましょう。
まずはこの3つ
- Console(コンソール)ウィンドウに赤い文字が出ていないか見る
- ▶(Play)を止めてから直す
- 直したら Ctrl+S(Macは Cmd+S)で保存する
さくいん
| こんなときは | 見るところ |
|---|---|
| Console に赤い文字が出る/▶ が押せない | コンパイルエラー |
NullReferenceException / UnassignedReferenceException | つなぎ忘れ |
| 弾が敵をすりぬける | 当たり判定が起きない |
| キーを押しても動かない・撃てない | 入力が効かない |
| モデルがピンク色 | モデルがピンク色になる |
| Play 中に変えた数字が戻った | Play 中に変えた値が戻る |
| プレハブを直したのに変わらない | プレハブの変更が反映されない |
| 画面が真っ暗・何も見えない | シーンが真っ暗・見えない |
| 日本語が □□□ になる | TextMeshPro の日本語が □ になる |
| ボタンを押してもシーンが変わらない | Build Profiles にシーンがない |
| 音が鳴らない | 音が鳴らない |
コンパイルエラーの読み方
スクリプトにまちがいがあると、Console に 赤い文字 が出ます。これを コンパイルエラー といいます。コンパイルエラーがあると ▶ を押してもゲームが始まりません。
エラーの読み方
赤い文字は、たとえばこんな形をしています。
text
Assets/_Game/Scripts/PlayerController.cs(15,10): error CS1002: ; expected| 部分 | 意味 |
|---|---|
PlayerController.cs | まちがいがあるファイル |
(15,10) | 15行目の、左から10文字目あたり |
CS1002 | エラーの種類の番号 |
; expected | 「; がありません」という意味 |
TIP
赤い文字を ダブルクリック すると、エディタでまちがいのある行が開きます。 エラーの場所は「書いてある行」か「その1つ上の行」のことが多いです。
TIP
エラーがたくさん出ていても、いちばん上のエラー から直しましょう。1つ直すと、ほかのエラーも一緒に消えることがよくあります。
よくあるコンパイルエラー
| 原因 | よく出るメッセージ | 直し方 |
|---|---|---|
| ファイル名とクラス名がちがう | No MonoBehaviour scripts in the file, or their names do not match the file name / The referenced script ... is missing | public class ○○ の ○○ とファイル名を 完全に同じ にする |
セミコロン ; 忘れ | ; expected(CS1002) | 文の終わりに ; をつける |
| 大文字・小文字のまちがい | The name 'transform' does not exist / 'Vector3' could not be found など(CS0103, CS0246) | Update と update、Vector3 と vector3 は別物。お手本と1文字ずつ見比べる |
波かっこ { } の数が合わない | } expected(CS1513)、Type or namespace definition, or end-of-file expected(CS1022) | { と } が同じ数あるか数える。エディタで { にカーソルを置くと、対になる } が光る |
using の書き忘れ | The type or namespace name 'InputAction' could not be found(CS0246) | ファイルの一番上に using UnityEngine.InputSystem; などを書く |
float に f がない | Cannot implicitly convert type 'double' to 'float'(CS0664) | 0.5 ではなく 0.5f と書く |
ファイル名とクラス名
スクリプトを作ったあとにファイル名を変えると、中の public class ○○ は変わりません。名前を変えたいときは、両方 を同じ名前に直しましょう。
NullReferenceException と UnassignedReferenceException
▶ を押したあとに、こんな赤い文字が出ることがあります。
text
UnassignedReferenceException: The variable bulletPrefab of PlayerShooter has not been assigned.
NullReferenceException: Object reference not set to an instance of an objectどちらも「中身が空っぽのものを使おうとした」という意味です。いちばん多い原因は Inspector でのつなぎ忘れ です。
| 確認すること | 直し方 |
|---|---|
| Inspector の欄が None になっていないか | Project や Hierarchy から、正しいものをドラッグしてつなぐ |
| プレハブを直したのに、シーンのほうがつながっていない | シーンに置いたオブジェクトの Inspector も確認する |
GameManager.instance が空 | シーンに GameManager オブジェクトがあり、GameManager スクリプトが付いているか |
CameraShake.instance が空 | Main Camera に CameraShake が付いているか(第19回) |
GetComponent<○○>() が空 | そのオブジェクトに ○○ コンポーネントが本当に付いているか |
FindAction("名前") が空 | アクション名のつづり(入力が効かない を見る) |
TIP
UnassignedReferenceException のメッセージには、どのスクリプトのどの変数か が書いてあります(上の例なら PlayerShooter の bulletPrefab)。その名前を Inspector でさがしましょう。
当たり判定が起きない
弾が敵をすりぬける、自機が敵にぶつかってもやられない、というときは、次の表を上から順に確認します。
| 確認すること | 正しい状態 |
|---|---|
| Rigidbody | ぶつかる どちらか(この教材では動くもの全部)に付いている。Is Kinematic ON、Use Gravity OFF |
| Collider | 親オブジェクトに Box / Sphere / Capsule Collider が付いている |
| Is Trigger | Collider の Is Trigger が ON |
| Tag | 敵は Enemy、敵の弾は EnemyBullet、自機は Player。親オブジェクト に付いているか |
| Z座標 | 自機・弾・敵の Position Z がすべて 0 になっているか |
| Collider の大きさ | Scene ビューで緑の線を見る。小さすぎたり、ずれていたりしないか |
| 関数名 | OnTriggerEnter(Collider other) のつづり。OnTriggerEnter2D や OnCollisionEnter になっていないか |
2D 用と3D 用をまぜない
この教材は 3D 物理 を使います。Rigidbody 2D や Box Collider 2D を付けると当たりません。名前に「2D」がつかないほうを使いましょう。
入力が効かない
| 原因 | 直し方 |
|---|---|
| InputSystem_Actions の Save Asset を押し忘れた | InputSystem_Actions を開いて、上の Save Asset を押す(Auto-Save に✓を入れておくと自動で保存される) |
| アクション名のつづりがちがう | コードの FindAction("Attack") と、InputSystem_Actions のアクション名が 大文字・小文字まで同じ か |
| PowerUp アクションを作るマップがちがう | Player マップの中に作る(第14回) |
| バインドがない | Attack に Keyboard の Z と Space が追加されているか(第5回) |
| Active Input Handling の設定 | Edit > Project Settings > Player > Other Settings の Active Input Handling が Input System Package (New) か Both になっているか。変えると Unity の再起動が必要 |
| Game ビューをクリックしていない | ▶ を押したあと、Game ビューを1回クリックしてからキーを押す |
モデルがピンク色になる
モデルがピンク(むらさき)色になるのは、マテリアルのシェーダーが URP に対応していない ときです。
方法1: まとめて変換する
- Window > Rendering > Render Pipeline Converter を開く
- 上のプルダウンで Built-in to URP を選ぶ
- Material Upgrade に✓を入れる
- Initialize Converters を押す
- Convert Assets を押す
方法2: 1つずつ直す
- Project でピンクになっているマテリアルを選ぶ
- Inspector の Shader を Universal Render Pipeline/Lit にする
- 色が白くなったら、Base Map の色をもう一度設定する
TIP
パーティクルがピンクのときは、マテリアルの Shader を Universal Render Pipeline/Particles/Unlit にします。
Play 中に変えた値が戻る
▶ を押している間(Play 中)に Inspector で変えた値は、Play を止めると元に戻ります。これは Unity のしくみです。
- Play 中は「お試し」と考えましょう。いい値が見つかったら、数字をメモ してから Play を止め、もう一度入力します
- Play 中は画面の色が少し変わります。設定を変える前に、Play 中でないか確認するくせをつけましょう
TIP
Edit > Preferences > Colors の Playmode tint を目立つ色にすると、Play 中かどうかがすぐわかります。
プレハブの変更が反映されない
シーンに置いたプレハブを Inspector で直しても、プレハブ本体(Project にあるもの)は変わりません。弾や敵のように Instantiate で出すものは、プレハブ本体が使われるので、変更が反映されないように見えます。
| やり方 | 手順 |
|---|---|
| シーンでの変更をプレハブに送る | Hierarchy でオブジェクトを選び、Inspector 上の Overrides → Apply All |
| プレハブを直接直す | Project でプレハブをダブルクリックして開き、直してから <(左上の矢印)で戻る |
WARNING
Inspector の Bullet Prefab などの欄には、Project にあるプレハブ をつなぎます。Hierarchy にあるオブジェクトをつなぐと、それを消したときに弾が出なくなります。
シーンが真っ暗・見えない
| 確認すること | 正しい状態 |
|---|---|
| カメラの位置 | Main Camera の Position が (0, 0, -10)、Rotation が (0, 0, 0) |
| Projection | Orthographic |
| Size | 5(小さすぎると拡大されすぎ、大きすぎると小さく見える) |
| オブジェクトの位置 | Z が 0。X が −8.9〜8.9、Y が −5〜5 の範囲にあるか |
| オブジェクトの大きさ | Scale が 0 になっていないか、小さすぎないか |
| ライト | Directional Light があり、オフ(✓なし)になっていないか |
| チェックボックス | Inspector の名前の左の✓が外れていないか(非アクティブ) |
| Game ビューと Scene ビュー | Scene ビューでは見えても、Game ビューはカメラに写るものだけ |
TIP
Hierarchy でオブジェクトをダブルクリック(または選んで F キー)すると、Scene ビューでそのオブジェクトの場所に移動できます。
TextMeshPro の日本語が □ になる
TextMeshPro は最初、英語の文字しか入っていないフォント を使っています。そのため日本語は □(とうふ)になります。
方法1: 英語で書く(おすすめ)
SCORE、LIFE、GAME OVER、START のように英語にすれば、このままで大丈夫です。この教材も英語表記を使っています。
方法2: 日本語フォントアセットを作る
- 日本語フォントファイル(例: Noto Sans JP。ライセンスを確認する)を Project に入れる
- Window > TextMeshPro > Font Asset Creator を開く
- Source Font File にフォントをドラッグする
- Character Set を Custom Characters にして、使う文字だけを入力する(または Characters from File で文字の一覧ファイルを指定)
- Atlas Resolution を大きめ(例: 4096 x 4096)にする
- Generate Font Atlas → Save で保存する
- テキストの Font Asset に、できたフォントアセットをつなぐ
先生へ
日本語フォントアセットは、先生が1つ作って配るとスムーズです。常用漢字すべてを入れるとファイルが大きくなるので、使う文字だけにするのがおすすめです。
Build Profiles にシーンがない
タイトルの START ボタンを押してもゲームが始まらない、Console に次のような文字が出る、というときです。
text
Scene 'Game' couldn't be loaded because it has not been added to the active build profile- File > Build Profiles を開く
- Scene List に
TitleとGameがあるか確認する - なければ、Project からシーンをドラッグして入れる(または Add Open Scenes)
Titleが 0番、Gameが 1番 になるように並べる
コードの SceneManager.LoadScene("Game") の名前と、シーンファイルの名前が同じかも確認しましょう。
音が鳴らない
| 確認すること | 直し方 |
|---|---|
| AudioClip がつながっているか | Inspector の Shot Sound などが None になっていないか |
| AudioSource があるか | PlayOneShot を使うオブジェクト(Player)に AudioSource が付いているか |
| Volume | AudioSource の Volume が 0 になっていないか |
| Game ビューのミュート | Game ビュー上の Mute Audio(スピーカーのボタン)がオンになっていないか |
| Audio Listener | Main Camera に Audio Listener が付いているか(ふつうは最初から付いている) |
| BGM | AudioSource の Play On Awake と Loop が ON か |
| パソコンの音量 | パソコン本体の音量やイヤホンの接続 |
それでもわからないときは
- スクリプト完成版一覧 と自分のコードを1行ずつ見比べる
- エラーの文字をそのまま先生に見せる(スクリーンショットや、Console の文字をコピーする)
- 1つ前の回の状態にもどしてやり直す(先生に聞いてください)