現時点では、Unity
を開いて、作成したスクリプトの1つをダブルクリックすると、MonoDevelop
が開き、閉じる必要があります。団結とMonoDevelop
で私はRun >> Run with >> Unity Debugger
。
このUnityが開かれた後、Unityで再生ボタンを押すと、デバッグセッションが開始されます。しかし、一度だけ。このセッションをUnity
またはMonoDevelop
のいずれかで停止すると、この手順全体をもう一度繰り返す必要があり、非常に面倒です。 Unityを開き、Unityを閉じる必要があります(次のステップはRun >> Run with >> Unity Debugger
ユニティを開きます。ユニティがすでに開かれている場合、一度に1つのプロジェクトを開くことができるのはユニティのインスタンスが1つだけであるというエラーが表示されます)。
私が求めているのは:
Unityのオンとオフの面倒な切り替えから解放される、より良いワークフローはありますか。デバッグセッションを停止するたびに、面倒な繰り返しを行わずに通常どおりに開始しますか?
ありがとう。
MonoDevelopのデバッグメニューで「アタッチ」を使用します。そのようにして、実行中のUnityプロセスにアタッチできるはずです。 (Unityの設定で適切なオプションがオンになっていることを確認する必要がある場合があります)。
デバッグする別の方法は、次を使用することです。
Debug.LogError("foo");
または
Debug.LogWarning("foo");
もう1つの注意点は、実際にオブジェクトをログにバインドできることです。これにより、GameObjectのリストを反復処理している場合に、エディターがオブジェクトの質問を強調表示します。つまり:
Debug.LogWarning("this object broke", gameObject);
コンソールウィンドウで「エラー一時停止」をオンにすると、LogErrorが発生したときにゲームが自動的に一時停止します。ただし、エラーがスローされるたびに一時停止することに注意してください。
UnityVSは現在正式にMicrosoftの一部であり、vs 2010、12、および13のアドオンとして利用できます。さまざまなバージョンにリンクしているMSDNブログ投稿は次のとおりです。 http://blogs.msdn.com/b/visualstudio /archive/2014/07/29/visual-studio-tools-for-unity-1-9.aspx
私は常にデフォルトのスクリプトエディター(ユニティ設定->外部ツール->外部スクリプトエディター)をビジュアルスタジオに変更しました。これにより、ブレークポイントとプリプロセッサマクロを使用して、デバッグがはるかに簡単になります。デバッグを開始する場合は、Visual Studioでf5を押してユニティに接続し、通常のように再生します。ブレークポイントに達すると、VisualStudioが引き継ぎます。
他に何も変更する必要はなく、今のように開閉し続ける必要もありません。
Unityの「コンソール」ウィンドウについて知っていますか? Menu/Windows/Consoleから開くことができるはずです。デバッガーとして機能し、プリコンパイル時と実行時の両方でエラーと警告を表示します。質問を誤解した場合はお知らせください。
MonoDevelopでは、ウィンドウの上部近くに「Unityにアタッチ」というボタンがあります。シーンを再生する前にこれを行うと、MonoDevelopで設定されたブレークポイントがメインスレッドを停止します。
値を検査しようとしているだけの場合、Debug.log(message)はデータをUnityコンソールに直接出力します。
これらは両方とも、通常のプレイモードで使用できます。
最近、MicrosoftがVisual Studio用のUnityVSプラグインの作成者であるSyntaxTreeを買収したため、まもなく無料でリリースされる予定です。 UnityVSは、その生産性とVisual StudioでのUnity3Dゲームの機能またはデバッグにより、すべてのUnity3D開発者にとって必須のプラグインです。
Unity 5.5
Visual Studioツールが組み込まれているため、Unityをアタッチして、シングルクリックでデバッグを開始できます。
つまり、Edit > Preferences > External tools > External script editor > Visual studio
の後
問題がこれを適用するのに適している場合、UnityでのデバッグにDebug.Log()
を使用する最良の方法。
VisualStudioでUnityプロジェクトをデバッグできるプラグインUnityVSを使用しています。とても便利です。
UnityVSでグーグルを持っている
MS Visual Studio Communityを使用してチェックアウトし、Webサイトで提供されているUnity統合を取得することもできます。私は最近それを試しましたが、それは素晴らしいことです。利用可能な最高のIDE)の1つを使用して、ほぼ完全なデバッグ機能を利用できます。Unityと組み合わせると、デバッグ機能だけでなく、生産性が大幅に向上します。 、機能セットの観点からも。
チェックアウトしたい場合は、IDEのコミュニティバージョンへのリンクを次に示します。 https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx
ここに、私が言及したUnity統合へのリンクもあります: https://www.visualstudio.com/features/unitytools-vs
それがお役に立てば幸いです。仲間の開発者が私をMonoから変換しました。正直なところ、私はその設定に満足することはできませんでした(IDE「makeitwork」ボタンを完全に統合しない限り;) )。
私もやりたいのは、Unityエディター内で有用なデータをログに記録するためのショートカットを作成することです。たとえば、すべてのアクティブな実績の現在の状態をログに記録します。
[MenuItem("My Game/Runtime debug/Achievement states")]
public static void LogAchievementStates ()
{
foreach (AchievementState achievementState in Data.achievementStates)
{
Debug.Log ("Achievement " + achievementState.name + " is at " + achievementState.completion + "%");
}
}
エディタスクリプト内でこれを行うと、特定のアクションを実行するためのメニューボタンが表示されます。
問題は、「Unityビルドのゲーム実行可能ファイル」を起動してデバッガーをアタッチする方法だと思います。
何かのようなもの...
gccを使用してデバッグシンボルを作成し、DEBUGを有効にしてアプリケーションをビルドし、gdbを使用して実行可能プログラムを起動してデバッグします。そうすれば、IDEを使用せずにデバッグセッションを開始できます。ただし、Cではgccを使用しています... C#では、接続されたデバッガーがコードを表示するためにシンボルをデバッグする必要はなく、仮想マシン上で実行されます。
ここでこれを行う方法についてのオープンな会話があります:
https://github.com/0xd4d/dnSpy/issues/39
仮想機械語に精通していない人のための簡単なメモ。 C#は、コンパイル時に中間言語を生成します。たとえば、CPUによって直接実行されるマシンコードを生成するCとは異なります。 C#の場合、この中間言語はCommon Languageと呼ばれます(VB.NET、C#.NET、C++。NETなどのすべての.NET言語に共通であるため。この中間言語はCPUによって直接実行されるのではなく、仮想マシンによって実行されます。 CLR(Common Language Runtime)と呼ばれるアプリケーションまたはプロセスごとに1回インスタンス化されます。これは、ほとんどの場合、変数とメソッドがギバーリッシュ(難読化と呼ばれる)に置き換えられていない場合、プログラムを直接読み取ることができることを意味します。実行可能ファイルに接続されたデバッガー。
会話によると、Unityエンジンは.NET CLRを使用せず、エンジンに組み込まれた別個の(変更される可能性のある)CLRを使用します。彼らはそれを行う方法を説明していますが、Unityエディターを使用する方が安全で簡単だと思います。
Unityはとにかくエディターを中心に構築されています!たとえば、エディターコンテキスト内で、ゲームのプレイ中にパブリック変数と参照を変更できます。これは「従来の」プログラミングアプローチではありません。しかし、これは古典的なデバッグアプローチです。
最後に、プログラムのスレッドのようにオープンソースではないものがあるので、外部ツールがコードを回避する方法を見つけることができるとは思えません。たとえそれが純粋な共通言語であるとしても、それが純粋なCLである場合、エンジンに別個の(潜在的にカスタマイズされた)CLRを含める必要がないため、私は真剣に疑っています。
私の意見では、全体的な誤解は、Unityが使用している言語が正確にC#ではなく、C#のように見えるユニティバリアントであり、C#と互換性がある可能性があるという事実が原因ですが、どの程度かはわかりません。つまり、Unityでプログラミングしている「CLR」は実際にはUnityエンジンそのものです。 「CLR」は、従来のC#CLRではなく、多くのプラットフォームでのゲームのレンダリングに重点を置いています。
その他の回答について:
-MonoDevelopでは、他のIDEと同様に、ブレークポイントとプリプロセッサマクロを使用できます。
-ログを使用したテキストデバッグについて。もちろん可能ですが、これは「実際のデバッグ」が利用できない場合に行うことです。
visual Studioを試しましたか?そこで、スクリプトを統合してデバッグすることができます。
debug.log( "Message");を使用します。デバッグ用
Print()か何かidonoを置くことができます
最初に、monodevelopまたはビジュアルスタジオに存在するC#コードをUnityデバッガーにアタッチする必要があります。次に、IDE monodevelopの再生ボタンを押して、最後にUnityで再生します。
[実行]ボタン(左上の再生ボタンのように見えます)を使用して、デバッグのためにUnityエディターに接続できますが、この方法でUnityに正常に接続できない場合は、適切なプラグインが有効になっていることを確認することをお勧めしますアドインマネージャーの設定で。
Windows:ツール>アドインマネージャー> Unity> UnityのMonoSoftDebuggerサポート
OSX:Unity>アドインマネージャー> Unity> UnityのMonoSoftDebuggerサポート
(選択して[有効にする]をクリックします。)
Unityでデバグする方法は2つあります。1つは基本的にUnity内のコンソールであるLogによるもので、もう1つはVSとMonoの両方をサポートするデバッガーです。はい、あなたはまさにデバッグポイントでaやbなどの値をチェックする非常にひどいプロセスですので、ここにあなたに最適なものだけを使用するという私の意見があります私はあなたがただ知っているためにデバッグポイントを必要としないことを意味しますaとbの値はログに記録するだけです。デバッグポイントが必要な場合は、その方法をすでに知っています。
デバッグする最も簡単な方法は、Debug.log( "");を使用することです。しかし、これはパフォーマンスを犠牲にするので、どうすれば簡単にデバッグできますか?
よくここに答えがあります:
デバッグを開始するには、エディターの左端(行番号の横)にマウスを押すと、赤い点が表示されます。ブレークポイントを作成しただけです。
今のところこれは何もしませんが、Unityに移動してエディターウィンドウで再生を押すと、何か素晴らしいことが起こります…
ウィンドウの一番下で、ローカルウィンドウを開いている場合(開いていない場合は、[表示]> [ウィンドウのデバッグ]> [ローカル]に移動)、ローカルインスタンスに現在存在するすべての変数とその時点での値が表示されます。ヒットしているブレークポイント。
アプリケーションの実行を続行するには、MonoDevelopの「再生」ボタンを押すだけです。
スクリプトは実行を継続します(Unityのエディターはフリーズしなくなります)。もちろん、この場合、スクリプトは次のフレームで再びブレークポイントに到達します。したがって、MonoDevelopでブレークポイントを左クリックし、[再生]ボタンをもう一度押すだけで、ブレークポイントが再度実行されることはありません。
たとえば、それを使ってもっと多くのことができます:
ブレークポイントを使用すると、特定の条件が満たされたときにアプリケーションの実行を停止させることができます。たとえば、fSpeed変数が10に達したときの値を確認したいとします。これを行うには、MonoDevelopの「停止」ボタンを押し、ブレークポイントを右クリックして、「ブレークポイントのプロパティ」を押します。
条件を「条件が真の場合に中断」に設定し、「条件式」を「fSpeed> = 10」に設定して、[OK]を押します。
エディターをUnityに再接続し、Unityの[再生]ボタンを押します。条件が満たされると、ブレークポイントが起動してアプリケーションが停止します。
条件ブレークポイントの使用に関する注意:実行するたびに式を検証する必要があるため、パフォーマンスの問題が発生します。
これは一般的にdebug.log( "");よりも優れているはずです。これがあなたが望むものであるならば、少なくとも。