Unity-在 Unity 中調(diào)試 C# 代碼
使用調(diào)試器可以在應(yīng)用程序或游戲運(yùn)行的同時(shí)檢查源代碼。Unity 支持使用以下代碼編輯器來(lái)調(diào)試 C# 代碼:
Visual Studio(包含 Visual Studio Tools for Unity 插件)
Visual Studio for Mac
Jetbrains Rider
Visual Studio Code
盡管這些代碼編輯器所支持的調(diào)試器特性略有不同,但它們都提供了一些基本功能,如斷點(diǎn)、單步執(zhí)行和變量檢查。
Unity 中的托管代碼調(diào)試可以在除 WebGL 之外的所有平臺(tái)上運(yùn)行。使用 Mono 和 IL2CPP 腳本后端都是可以的。
配置代碼編輯器
Visual Studio (Windows)
Unity Editor 安裝程序包括一個(gè)選項(xiàng),允許安裝包含 Visual Studio Tools for Unity 插件的 Visual Studio。建議通過(guò)這種方式設(shè)置 Visual Studio 以便在 Unity 中執(zhí)行調(diào)試。
如果您的計(jì)算機(jī)上已經(jīng)安裝了 Visual Studio,請(qǐng)使用其?Tools?>?Extensions and Updates?菜單來(lái)查找和安裝 Visual Studio Tools for Unity 插件。
Visual Studio for Mac
Unity Editor 安裝程序包括一個(gè)選項(xiàng),允許安裝 Visual Studio for Mac。建議通過(guò)這種方式設(shè)置 Visual Studio for Mac 以便在 Unity 中執(zhí)行調(diào)試。
如果您的計(jì)算機(jī)上已經(jīng)安裝了 Visual Studio for Mac,請(qǐng)使用其 Extension Manager 來(lái)查找和安裝 Visual Studio Tools for Unity 插件。
JetBrains Rider
通過(guò)默認(rèn)方式安裝的 JetBrains Rider 可以在 Windows 或 Mac 上的 Unity 中調(diào)試代碼。請(qǐng)?jiān)L問(wèn)?JetBrains 網(wǎng)站進(jìn)行安裝。
VS Code
VS Code 要求安裝一個(gè)擴(kuò)展才能在 Unity 中調(diào)試代碼。請(qǐng)遵循此擴(kuò)展特定的說(shuō)明來(lái)安裝此擴(kuò)展。
Unity Preferences
安裝了代碼編輯器后,請(qǐng)選擇?Unity > Preferences > External Tools__,然后將?External Script Editor__ 設(shè)置為您選擇的代碼編輯器。?

在 Editor 中調(diào)試
當(dāng) Unity Editor 處于播放模式時(shí),可以調(diào)試在 Unity Editor 中運(yùn)行的腳本代碼。在嘗試調(diào)試之前,請(qǐng)確保在 Unity Preferences 中啟用了?Editor Attaching?選項(xiàng)。此選項(xiàng)會(huì)讓 Editor 采用即時(shí) (JIT) 編譯方法并借助調(diào)試信息來(lái)執(zhí)行托管代碼。
首先,進(jìn)入代碼編輯器腳本,根據(jù)調(diào)試器應(yīng)該停止的腳本代碼行位置,在該位置設(shè)置一個(gè)斷點(diǎn)。例如,在 Visual Studio 中,根據(jù)希望停止調(diào)試器的代碼行,單擊代碼左側(cè)的列(如下所示)。行號(hào)旁邊會(huì)出現(xiàn)一個(gè)紅色的圓,并會(huì)高亮顯示這一行。

接下來(lái),將代碼編輯器連接到 Unity Editor。此選項(xiàng)根據(jù)代碼編輯器而有所不同,通常是與代碼編輯器的正常調(diào)試過(guò)程不同的選項(xiàng)。在 Visual Studio 中,此選項(xiàng)如下所示:

一些代碼編輯器可能允許選擇要調(diào)試的 Unity 實(shí)例。例如,在 Visual Studio 中,__Debug > Attach Unity Debugger__ 選項(xiàng)可顯示此功能。

將代碼編輯器連接到 Unity Editor 后,回到 Unity Editor 并進(jìn)入播放模式。當(dāng)執(zhí)行斷點(diǎn)處的代碼時(shí),調(diào)試器將停止,例如:

當(dāng)代碼編輯器處于斷點(diǎn)時(shí),您可以逐步查看變量的內(nèi)容。只有在調(diào)試器中選擇了繼續(xù)選項(xiàng)或停止調(diào)試模式之后,Unity Editor 才會(huì)響應(yīng)。
在 Player 中調(diào)試
要調(diào)試在 Unity Player 中運(yùn)行的腳本代碼,請(qǐng)確保在構(gòu)建 Player 之前啟用“Development Build”和“Script Debugging”選項(xiàng)(這些選項(xiàng)位于?File > Build Settings?中)。啟用“Wait For Managed Debugger”選項(xiàng)可使 Player 等待調(diào)試器連接之后再執(zhí)行腳本代碼。

要將代碼編輯器連接到 Unity Player,請(qǐng)選擇 Player 的 IP 地址(或機(jī)器名稱)和端口。在 Visual Studio 中,“Attach To Unity”選項(xiàng)的下拉菜單如下所示:

Debug?>?Attach Unity Debugger?選項(xiàng)如下所示:

請(qǐng)確保將調(diào)試器連接到 Player,而不是連接到 Unity Editor(如果兩者都在運(yùn)行)。連接調(diào)試器后,可以繼續(xù)正常進(jìn)行調(diào)試。
在 Android 和 iOS 設(shè)備上調(diào)試
Android
調(diào)試 Android 設(shè)備上運(yùn)行的 Player 時(shí),請(qǐng)通過(guò) USB 或 TCP 連接到設(shè)備。例如,要在 Visual Studio (Windows) 中連接到 Android 設(shè)備,請(qǐng)選擇?Debug > Attach Unity Debugger?選項(xiàng)。此時(shí)將顯示運(yùn)行 Player 實(shí)例的設(shè)備列表:

在這種情況下,手機(jī)通過(guò) USB 和 Wi-Fi 連接到與運(yùn)行 Unity Editor 和 Visual Studio 的工作站所在的相同網(wǎng)絡(luò)中。
iOS
調(diào)試 iOS 設(shè)備上運(yùn)行的 Player 時(shí),請(qǐng)通過(guò) TCP 連接到設(shè)備。例如,要在 Visual Studio (Mac) 中連接到 iOS 設(shè)備,請(qǐng)選擇?Debug?>?Attach Unity Debugger?選項(xiàng)。此時(shí)將顯示運(yùn)行 Player 實(shí)例的設(shè)備列表:

確保設(shè)備只有一個(gè)有效網(wǎng)絡(luò)接口(建議使用 Wi-Fi,關(guān)閉蜂窩數(shù)據(jù)),并確保 IDE 與設(shè)備之間沒(méi)有防火墻阻止 TCP 端口(上面截屏中端口號(hào)為 56000)。iOS 不支持通過(guò) USB 進(jìn)行調(diào)試。
調(diào)試器故障排除
調(diào)試器出現(xiàn)的大多數(shù)問(wèn)題都是由于代碼編輯器無(wú)法找到 Unity Editor 或 Player。這意味著不能正確連接調(diào)試器。因?yàn)檎{(diào)試器通過(guò) TCP 連接到 Editor 或 Player,所以連接問(wèn)題通常是由網(wǎng)絡(luò)造成的??梢圆扇∫韵聨讉€(gè)步驟來(lái)對(duì)基本連接問(wèn)題進(jìn)行故障排除。
確保將調(diào)試器連接到正確的 Unity 實(shí)例
可以將代碼編輯器連接到本地網(wǎng)絡(luò)上已啟用調(diào)試的任何 Unity Editor 或 Unity Player。連接調(diào)試器時(shí),確保連接到正確的實(shí)例。如果您知道運(yùn)行 Unity Player 的設(shè)備的 IP 地址或計(jì)算機(jī)名稱,這將有助于找到正確的實(shí)例。
驗(yàn)證與 Unity 實(shí)例的網(wǎng)絡(luò)連接
代碼編輯器在查找要調(diào)試的 Unity 實(shí)例時(shí)使用的機(jī)制與 Unity Profiler 使用的機(jī)制相同。如果代碼編輯器找不到其應(yīng)該找到的 Unity 實(shí)例,請(qǐng)嘗試將 Unity Profiler 連接到該實(shí)例。如果 Unity Profiler 也找不到該實(shí)例,有可能運(yùn)行代碼編輯器的計(jì)算機(jī)和/或運(yùn)行 Unity 實(shí)例的計(jì)算機(jī)上存在防火墻。如果有防火墻,請(qǐng)參閱下文有關(guān)防火墻設(shè)置的信息。
確保設(shè)備只有一個(gè)激活的網(wǎng)絡(luò)接口
許多設(shè)備有多個(gè)網(wǎng)絡(luò)接口。例如,手機(jī)可以同時(shí)具有激活的蜂窩連接和激活的 Wi-Fi 連接。為了使用 TCP 正確連接調(diào)試器,IDE 需要與設(shè)備上的正確接口建立網(wǎng)絡(luò)連接。例如,如果您計(jì)劃通過(guò) Wi-Fi 進(jìn)行調(diào)試,請(qǐng)確保將設(shè)備置于飛行模式以禁用所有其他接口,然后啟用 Wi-Fi。
可以通過(guò)查看 Unity Player 日志來(lái)確定 Player 要求 IDE 使用的 IP 地址。查找日志中如下所示的部分:
此消息表明 IDE 將嘗試使用 IP 地址 10.0.1.152 和端口 56000 來(lái)連接到設(shè)備。運(yùn)行 IDE 的計(jì)算機(jī)必須能訪問(wèn)此 IP 地址和端口。
檢查防火墻設(shè)置
Unity 實(shí)例通過(guò) TCP 連接與代碼編輯器進(jìn)行通信。在大多數(shù) Unity 平臺(tái)上,都是在任選的端口上進(jìn)行這種 TCP 連接。通常,您不需要知道這個(gè)端口,因?yàn)榇a編輯器應(yīng)該能自動(dòng)檢測(cè)到這個(gè)端口。如果沒(méi)有檢測(cè)到,請(qǐng)嘗試使用網(wǎng)絡(luò)分析工具來(lái)確定在運(yùn)行代碼編輯器的計(jì)算機(jī)上或者在運(yùn)行 Unity 實(shí)例的計(jì)算機(jī)或設(shè)備上,哪些端口可能被阻止。找到這些端口后,請(qǐng)確保防火墻允許訪問(wèn)運(yùn)行代碼編輯器的機(jī)器上的端口和運(yùn)行 Unity 實(shí)例的機(jī)器上的端口。
驗(yàn)證托管調(diào)試信息是否可用
如果調(diào)試器已經(jīng)連接,但斷點(diǎn)未加載,表示調(diào)試器可能無(wú)法找到代碼的托管調(diào)試信息。托管代碼調(diào)試信息存儲(chǔ)在磁盤上托管程序集(.dll 文件)旁邊名為 dll.mdb 或 .pdb 的文件中。
如果啟用了正確的偏好設(shè)置和構(gòu)建選項(xiàng)(見(jiàn)上文),Unity 會(huì)自動(dòng)生成此調(diào)試信息。但是,Unity 不能為項(xiàng)目中的托管插件生成此調(diào)試信息。如果關(guān)聯(lián)的 dll.mdb 或 .pdb 文件位于磁盤上 Unity 項(xiàng)目托管插件的旁邊,則可以從托管插件中調(diào)試代碼。
防止設(shè)備鎖定
如果用于調(diào)試應(yīng)用程序的設(shè)備有屏幕鎖,請(qǐng)務(wù)必禁用屏幕鎖。屏幕鎖會(huì)導(dǎo)致調(diào)試器斷開(kāi)連接,并阻止其重新連接。在托管代碼調(diào)試期間,最好避免鎖定屏幕。如果屏幕已經(jīng)鎖定,應(yīng)在設(shè)備上重新啟動(dòng)應(yīng)用程序,然后調(diào)試器才能再次連接。