Comments
Description
Transcript
講演ファイル(PDF)
Unity上級者を目指すなら 知っておくべき デバッグテクニック集 荈䊹稱➜ 名前:山村達彦 役職:フィールドエンジニア兼 エバンジェリスト 趣味:ブログ 自転車(new) ブログ:テラシュールブログ Twitter:@tsubaki_t1 • • • Unity上級者へ至る道とは? Unity上級者とは何か コードが書けて、設計もできて、3Dに対する知識もあって、 各プラットフォームの知識もあって、運営もできて UnityのAPIまわりとバッドノウハウを完璧に把握して モデルもシェーダーも作れて作曲も2D・3D・VRが出来て、経営に詳くて…英語も出来る ♳秷罏פ荚銲㔓 א♧ך չ㉏겗鍑寸ׅ䪮腉պ 問題を見つける 問題を回避する 問題を起こさず実現する չ2㉏겗גպ 「A:ああ!」 今回は所謂「バグ」を指す。 バグは「思い通りに動かない事」を指す。 • • バグとは何か? ؚغ䙼鸐✲ְזַ⹛ח 1. 操作に反応しない 2. モデルが変な動きをする 3. 入力した情報が反映されない 4. 計算結果が思ってたのと違う 5. 効果の影響範囲がおかしい 6. 通らないはずの処理が実行された 7. 操作に対して向きが変 ַֿׅדؚغכ 多分バグです。 銲㔓麦ךؚغ ؚغ⣛חيؤٔ؞ٕ،װس٦؝أ٦ا • ؚغ⣛חة٦ر • ؚغ⣛ח• 乼⡲ ؚغך04װؙٙ٦يٖ٦ؿ • ا٦؝أ٦س涸㉏ז겗 • 想定した順番で処理が通らない • 計算結果が思ってたのと違う • 変なタイミングで処理が呼ばれる • 実行順番が思ってたのと違う • 例外が出る ㉏겗ז涸ة٦ر ְזֻ׃铣鴥⯓ָ姻ךة٦ر • ָ֮铎חزحوؓ٦ؿ • ָ֮㉏겗ח瘝ـعٖف٦ٝծء • أى• 鏣㹀 乼⡲涸㉏ז겗 • 分かり難いUI表現 • 複数回入力 • 入力項目(表記)のミス • 機材の故障 ٖؿ٦يٙ٦װؙ04ח⣛㉏겗 • Unityによる問題 • OSによる問題 • プラットフォームによる問題 • • バグを直すためには? ךؚحغر然钠䩛갫 1. バグを正しく定義する 2. バグを再現する 3. バグが発生する箇所を見つけ出す 4. 問題を修正する ֻׅ㹀纏׃姻ؚغ ։ׅדؚغְծכַխ։ׅדؚغכֿ • ַׅד⹛⡲זֲ״ךוכְ⹛⡲׃• 姻 ⱄؚغ植ׅ • バグを再現させて、 再現する手順を確立する • 再現する条件は、例えば… • 特定の条件で必ず再現する • タイミングが重要 • 起動時間や回数が必要 • 負荷が高い時に起こる ؚغ穾鴥 • バグが「再現しない」状態と 「再現する」状態を比較する • 問題が無い要素は消していく • リソースを差し替える • パラメータを変えてみる • 環境を変えてみる • タイミングや負荷を変える חٕفٝءגְꤐ《ⴓ㉏겗搀ְ鿇 ٥Ⳣ椚زٝط٦هٝ؝٥زؙؑآـؔז• ♶銲 ׅفحؗأ ծל֮דךָ֮⻉㢌ח㉏겗חꥷ׃חٕفٝء • ָ֮㉏겗ח銲稆׃ַ嶊ؚٝى؎ة 然钠ך崧 乼⡲倯岀ךأ؎غرװ䱸竲然钠ׅⰅ⸂㉏ך겗 ًٓػ٦ة䊴׃剏ִגر٦㉏ךة겗 • データの参照先が間違っていて、データ差し替えても意味ないケースも ךيؚٓٗف崧然钠ׅا٦؝أ٦㉏ךس겗 04䊴׃剏ִגٕ٦ٕ㉏ך겗 穾鴥ך䩛갫 ㉏겗ワ鴟؝ך٦כسㄎְַגל ًٓػ٦כة姻ְַ׃ ㉏겗涪欰儗כ⦼ך姻ְַ׃ Ⳣ椚ך㹋遤갫殢כ姻ְַ׃ 䒭כ姻ְַ׃ ㉏겗ワ鴟؝ך٦כسㄎְַגל然钠 • ログを表示するコードを記述 • Debug.Logを使用する • 呼び出し元オブジェクトを探しやすい • コンソールをPINで表示出来る • ログを一括で停止させる 「Debug.logger.logEnabled = false;」 ًٓػ٦כة姻ְַ׃ SceneやPrefabといったメタデータ上で、 正しい項目が設定されているか。 • 参照がmissingやnull • 間違った参照、URL、キー • 想定範囲外のパラメータ • Inspectorに入力した値は、 ソースコードより優先される ًٓػ٦כة姻ְַ׃然钠 • Assertを使用する • IsNotNullでもインスタンスが無い場合 があるので注意 • Unityのシリアライズ可能な(Inspectorに 露出してる)項目の値がおかしい場合、 大体ここが問題 ַꤐ《דسٕؽأٔٔ٦כ"TTFSU ˟*T/PU/VMM؎דٝةأָٝأ剣㜥さ • $PNQPOFOU(װBNF0CKFDUכծ*T/PU/VMM؎דٝةأָ֮ٝأ㜥さָ֮կ ؝ٝه٦طٝװز٦ؒכزؙؑآـؔيٝآָٝ؎ٝةأٝأ盖椚׃ծ խ$כד撑⥂䭯דךְג׃ծⰻ鿇涸כח/VMMד撑ָ婍 ג խ⚥魦כ/VMMָ/VMMⴻהְזכד㹀ָׁ֮✲ • ؔכزؙؑآـծ *T5SVFPCKOVMM זֲ״ך䒭ؙׅحؑثד ًٓػ٦כة姻ְַ׃然钠 TestRunnerでテストを書く • プロジェクト内のパラメータを確認する 手っ取り早い方法の一つ • TestRunnerは開いてるシーンで実行 Ⳣ椚㹋遤儗ָ⦼ך姻ְַ׃然钠ׅ • Debug.LogやAssertで値を觀察する • リッチテキストで表現を切替 • 大量にある場合、ログファイルを見る • Collapseはログ出力箇所と内容で纏まる • 流れを見る場合、Collapseはoffに Ⳣ椚㹋遤儗ָ⦼ך姻ְַ׃然钠ׅ • デバッガで確認 • 処理を止めて確認 • スコープ外の値も確認可能 • ブレークポイントの条件を指定 • IL2CPP環境下では ネイティブのデバッガを使う Ⳣ椚㹋遤儗ָ⦼ך姻ְַ׃然钠ׅ • デバッガ処理中は、例外発生時に処理を止めてくれる (Error PauseをONにしてると効かなくなるので注意) • ブレイク中はUnityエディタを操作することは出来ない Ⳣ椚㹋遤儗ָ⦼ך姻ְַ׃然钠ׅ Immediateで別のAPIを呼ぶ ًٓػ٦כة姻ְַ׃然钠 • EditorUtility.InstanceIDToObject で、インスタンスIDからオブジェクトを 取得 • 正しいリソースが取れてるか確認 • DebugのPINを使用しても良い • https://gist.github.com/tsubaki/ 9610d757aecee20c48e616abff0888b3 ֽⴓְ⢪ך*٥*.(6ؚٗהؖحغر *0O(6װ%FCVH-PHלזة٦رך• 㣐ꆀ ؖحغر鴥• ㉏겗ָ穾 Ⳣ椚㹋遤儗ָ⦼ך姻ְַ׃然钠ׅ • OnGUI(IMGUI)を使用する • GUILayoutで上から順に描画 • Inspectorのデバッグモードで確認する Ⳣ椚㹋遤儗ָ⦼ך姻ְַ׃然钠ׅ • Gizmoを利用する • 影響範囲や方向等を表現 • Handle • テキストやステータスを画面に表示 • エディタ用APIなので、#ifで隔離が必要 㹋遤갫䎷כ姻ְַ׃ • スタックトレースで確認 • 処理の実行順番が表記される • SendMessage等のテキスト経由でも 表示される • 別スレッドから呼び出した場合、 スタックトレースがログに含まれない (FULLで出力した場合は見れる) 㹋遤갫䎷כ姻ְַ׃ • デバッガのステップ実行 • 1秒ずつ進める 䒭כ姻ְַ׃ • ا٦؝أ٦س然钠׃ծJG勴⟝װ،ٕ ָيؤٔ؞ 姻ְַ׃嗚鏾׃ծزأذ剅ֻ 勴⟝䒭ָ醱꧟ז㜥さծ醱侧ך銲稆ֽⴓח-PHדؖحغرװ然钠ׅ • "1*ך⢪ְ倯כ姻ְַ׃ FHչӍպךӍָ⹛זֲ״ךו⡲ַⴓַלֽזծ 姻鍑⥂鏾⳿כ✲ׅ勻ְז ⟃㢩㉏ך겗 • OSを変えた時に正しく動作する? • エンジンのバージョンでバグる? • ILが正しく出力されていない? • 影響範囲が大きいので バッドノウハウ探した方が無難な事も דؙحغس٦؍ؿכؚغך6OJUZ կׅתַ⸔הֽ㜠デ갥 バグは 「ソースコード」「データ」 「ルール」「入力」から来る 検証は「入力」「データ」「ソースコード」「ルール」が楽 検証は問題のある所を探す 「呼ばれてるか?」「値は正確?」 「想定の場所から呼ばれてる?」「処理は正確?」の穴埋め問題