見出し画像

Unityで思い通りに動かないときの確認方法|Debug.Log・DrawLine・DrawRayの使い方

Unityでゲームを作っていると、

「コードを書いたのに動かない」
「当たり判定が反応しない」
「変数の値が思った通りにならない」
「どこで処理が止まっているのか分からない」

ということがよくあります。
このようなときに役立つのが、Debug です。

特に、Debug.Log を使うと、処理が呼ばれているか、変数に何が入っているかをConsoleに表示して確認することができます。
今回は、Unity初心者向けに

・Debug.Logの基本
・Consoleウィンドウの見方
・文字と変数を一緒に表示する方法
・Debug.LogWarningとDebug.LogError
・Debug.DrawLineとDebug.DrawRay

について解説します。



1.はじめに

Unity初心者のうちは、エラーが出たときや思った通りに動かないときに、どこを見ればよいか分からなくなることがあります。

たとえば、

・Startが呼ばれていないのか
・Updateは動いているのか
・if文の中に入っているのか
・当たり判定が呼ばれているのか
・変数の値が正しく変わっているのか

こういったことは、画面を見ているだけでは分かりにくいです。
そこで使うのが、Debug.Logです。
Debug.Logを使うと、Consoleにメッセージを表示できます。

Debug.Log("ここまで来ました");

このように書いておくと、その処理が実行されたときにConsoleに文字が表示されます。


2.Consoleウィンドウを開く方法

Debug.Logで表示した内容は、UnityのConsoleウィンドウに表示されます。Consoleが表示されていない場合は、Unity上部のメニュー、もしくは「controlキー」+「shiftキー」+「Cキー」で開きます。

Window
→ General
→ Console

Consoleには、ログや警告、エラーが表示されます。
コードが思った通りに動かないときは、まずConsoleを見る習慣をつけておくとよいです。


3.Debug.Logとは

Debug.Logは、Consoleにメッセージを表示するための命令です。

Debug.Log("Hello Unity");

このコードが実行されると、Consoleに

Hello Unity

と表示されます。

たとえば、Startが呼ばれているか確認したい場合は、次のように書きます。

void Start()
{
    Debug.Log("Startが呼ばれました");
}

ゲームを再生したときにConsoleに表示されれば、Startが正しく呼ばれていることが分かります。


まずは「ここまで来た」を表示してみる

初心者にとって一番分かりやすい使い方は、処理が通っているかを確認することです。

void Start()
{
    Debug.Log("ここまで来た");
}

たとえば、ボタンを押したときの処理が動いているか確認したい場合は、次のように書けます。

public void PushButton()
{
    Debug.Log("ボタンが押されました");
}

このログが出れば、ボタンの処理は呼ばれています。
ログが出なければ、ボタンの設定や関数の指定が間違っている可能性があります。

このように、Debug.Logを使うと、

  • 処理が呼ばれていないのか

  • 処理は呼ばれているけど、その後が間違っているのか

を切り分けることができます。


Debug.Logの中に文字を書く

Debug.Logのかっこの中には、表示したい文字を書きます。
文字を書くときは、ダブルクォーテーション " で囲みます。

Debug.Log("プレイヤーがジャンプしました");

このように、文字は必ず " で囲みます。

日本語でも英語でも、文字として表示したい場合は " で囲む必要があります。


変数の中身を表示する

Debug.Logでは、変数の中身も表示することができます。
たとえば、HPを確認したい場合は次のように書きます。

int hp = 100;

void Start()
{
    Debug.Log(hp);
}

この場合、Consoleには

100

と表示されます。
ただし、数字だけ表示されると、あとから見たときに何の数字か分かりにくいので、文字と一緒に表示することが多いです。


+ で結合する方法

Debug.Log("現在のHP:" + hp);

このように書くと、Consoleには次のように表示されます。

現在のHP:100

上のように文字と変数を一緒に表示するときは、+ を使ってつなげることができます。
複数の変数を表示することもできます。

Debug.Log("HP:" + hp + " / スコア:" + score);

この書き方は分かりやすく、初心者にも使いやすいです。
ただし、表示する変数が増えると、少し読みにくくなることがあります。


$ を使って書く方法

C#では、文字の前に $ を付けることで、文字の中に変数を埋め込むことができます。

Debug.Log($"現在のHP:{hp}");

この書き方では、変数を { } の中に書きます。
たとえば、

int hp = 100;
int score = 50;

void Start()
{
    Debug.Log($"HP:{hp} / スコア:{score}");
}

Consoleには、次のように表示されます。

HP:100 / スコア:50

+でつなげる書き方と比べると、文章の中にそのまま変数を入れられるので、見た目が分かりやすくなります。


+ で結合する方法と$を使う方法の違い

どちらの書き方でも、Consoleに表示する結果は同じです。

Debug.Log("現在のHP:" + hp);
Debug.Log($"現在のHP:{hp}");

どちらも、Consoleには次のように表示されます。

現在のHP:100

使い慣れないうちは、まず + でつなげる方法を覚えておくとよいです。
慣れてきたら、$"文字{変数}" の書き方も使ってみましょう。

個人的には、変数が1つだけなら + でも充分で、わかりやすいと思います。変数が複数ある場合は、$を使った方が見やすくなると思います。


活用例1:if文に入っているか確認する

Debug.Logは、if文の確認にもよく使います。
たとえば、HPが0以下になったらゲームオーバーにしたい場合を考えます。

if (hp <= 0)
{
    Debug.Log("HPが0以下になりました");
}

このログが出れば、if文の条件が成立していることが分かります。
逆に、HPが0以下になっているはずなのにログが出ない場合は、

・hpの値が思った通りに減っていない
・条件式が間違っている
・そもそもこの処理が呼ばれていない

といった原因が考えられます。
変数の値も一緒に表示すると、さらに分かりやすくなります。

Debug.Log($"現在のHP:{hp}");

if (hp <= 0)
{
    Debug.Log("ゲームオーバー処理に入りました");
}

活用例2:当たり判定の実行を確認する

Unity初心者がよくつまずくのが、当たり判定です。
OnTriggerEnterやOnCollisionEnterが反応しないときは、まずログを入れて確認します。

void OnTriggerEnter(Collider other)
{
    Debug.Log("何かが入りました");
}

このログが出れば、OnTriggerEnterは呼ばれています。
さらに、何に触れたのかを確認したい場合は、other.nameを表示します。

void OnTriggerEnter(Collider other)
{
    Debug.Log("触れた相手:" + other.name);
}

または、$を使って次のように書けます。

void OnTriggerEnter(Collider other)
{
    Debug.Log($"触れた相手:{other.name}");
}

タグを確認したい場合は、次のように書きます。

void OnTriggerEnter(Collider other)
{
    Debug.Log($"触れた相手のタグ:{other.tag}");

    if (other.CompareTag("Player"))
    {
        Debug.Log("Playerに触れました");
    }
}

このようにすると、

・当たり判定が呼ばれているか
・何のオブジェクトに触れたのか
・タグが正しく設定されているか

を確認することができます。


4.Debug.LogWarningとは

Debug.LogWarningは、Consoleに警告を表示するための命令です。

Debug.LogWarning("HPが少なくなっています");

通常のログより目立つ形で表示されます。

エラーではないけれど、注意して確認したい場合に使います。

たとえば、HPが少なくなったときに警告を出すことができます。

if (hp <= 10)
{
    Debug.LogWarning($"HPが少なくなっています:{hp}");
}

5.Debug.LogErrorとは

Debug.LogErrorは、Consoleにエラーとして表示するための命令です。

Debug.LogError("Playerが見つかりません");

たとえば、必要なオブジェクトが見つからなかったときに使えます。

if (player == null)
{
    Debug.LogError("Playerオブジェクトが設定されていません");
}

nullが原因でエラーになりそうな場所では、事前に確認しておくと原因を見つけやすくなります。

if (target == null)
{
    Debug.LogError("targetがnullです");
    return;
}

このように return を入れておくと、targetがない状態で次の処理に進むのを防ぐこともできます。


6.Debug.DrawLineとは

Debug.DrawLineは、Sceneビューに線を表示するための命令です。

Debug.DrawLine(transform.position, target.position, Color.red);

DrawLineでは、線の開始地点と終了地点を指定します。

Debug.DrawLine(開始位置, 終了位置, 色);

たとえば、自分の位置からターゲットの位置まで線を引く場合は、次のように書けます。

public Transform target;

void Update()
{
    Debug.DrawLine(transform.position, target.position, Color.red);
}

これは、敵からプレイヤーへの方向を確認したいときなどに便利です。

注意点として、Debug.DrawLineの線は、基本的にGameビューではなくSceneビューで確認します。


7.Debug.DrawRayとは

Debug.DrawRayも、Sceneビューに線を表示する命令です。
DrawLineとの違いは、指定の仕方です。
DrawLineは、開始位置と終了位置を指定します。

Debug.DrawLine(start, end, Color.red);

一方、DrawRayは、開始位置と方向を指定します。

Debug.DrawRay(start, direction, Color.blue);

たとえば、オブジェクトの前方向に線を出したい場合は、次のように書けます。

void Update()
{
    Debug.DrawRay(transform.position, transform.forward * 5f, Color.blue);
}

この例では、オブジェクトの位置から前方向に5の長さの線を表示します。

Raycastを使っているときは、Debug.DrawRayを使うと、どの方向に判定を飛ばしているのか確認しやすくなります。

void Update()
{
    Vector3 direction = transform.forward;

    if (Physics.Raycast(transform.position, direction, out RaycastHit hit, 5f))
    {
        Debug.Log($"当たった相手:{hit.collider.name}");
    }

    Debug.DrawRay(transform.position, direction * 5f, Color.green);
}

このようにすると、Raycastの方向をSceneビューで確認できます。


8.よく使うDebugのまとめ

今回紹介したDebugの使い方をまとめると、次のようになります。

Debug.Log
→ 通常の確認に使う

Debug.LogWarning
→ 注意として表示したいときに使う

Debug.LogError
→ エラーとして目立たせたいときに使う

Debug.DrawLine
→ 開始位置と終了位置を指定してSceneビューに線を表示する

Debug.DrawRay
→ 開始位置と方向を指定してSceneビューに線を表示する

文字と変数を一緒に表示する場合は、次の2つの書き方があります。

Debug.Log("現在のHP:" + hp);
Debug.Log($"現在のHP:{hp}");

どちらも同じように表示できます。

初心者のうちは、まず + でつなげる方法を覚え、慣れてきたら $"文字{変数}" の書き方も使ってみましょう。


9.まとめ

今回は、Unityで思った通りに動かないときの確認方法として、Debugの使い方を紹介しました。

ゲーム制作では、コードを書いてすぐに思った通り動くとは限りません。
そのようなときに大切なのは、いきなり原因を決めつけるのではなく、

処理が呼ばれているか
変数の値は正しいか
if文の中に入っているか
当たり判定は反応しているか
Rayの向きは合っているか

を一つずつ確認することです。

Debug.Logを使えば、Consoleで処理や変数の状態を確認できます。Debug.DrawLineやDebug.DrawRayを使えば、Sceneビューで方向や線を見える形で確認できます。

初心者のうちは、エラーを直すことよりも、まず今、何が起きているのかを確認することが大切です。
そのための基本として、Debugの使い方を覚えておきましょう。


次回は、

・Consoleウィンドウの便利な使い方
・ログ、警告、エラーの違い
・ClearやCollapseの使い方
・エラーをクリックして場所を確認する方法
・初心者がよく見るエラーの例

について解説します。


こちらはUnity初心者向けの記事をテーマ別にまとめています。

▼ Unity初心者向け記事まとめはこちら


こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。


ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。



いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!