Remote File Explorer是一個跨平臺的遠端檔案瀏覽器,使用者通過Unity Editor就能操作執行在手機上的遊戲或是應用的的目錄檔案。比如當專案打包執行到裝置上時,可通過Remote File Explorer直接瀏覽裝置上的目錄檔案,並進行下載,上傳,刪除等操作。尤其是Unity+Lua開發環境下的除錯利器,當然,這裡的除錯不是指程式碼的逐行除錯,而是泛指定位排查問題
用武之地
在很多場景下利用Remote File Explorer都可以極大的提高開發除錯效率。例如:
- 應用真機上執行時出現異常情況,推測可能是關鍵資源丟失導致。此時可以通過本工具直接瀏覽手機上的相關檔案,檢視關鍵資源是否存在
- 通過本工具直接拉取手機上的日誌檔案或記憶體分析檔案等各類檔案,從此告別資料線
- 如果專案採用了XLua或SLua開發,在真機開發除錯時,可通過本工具直接上傳修改後的Lua程式碼,重啟應用即可生效。從而避免每修改一次程式碼就重新構建一次應用的繁瑣過程,大大提高除錯效率
接下來,將以一些具體的案例,來演示Remote File Explorer工具的使用。下面用例的程式碼都可以在Remote File Explorer Demo找到
用例1-無需重新打包修改程式碼邏輯
- 客戶端打包,啟動後,初始介面如下圖所示。其中"Hello, Wlrod"的文字故意拼寫錯誤,用來演示如何不重新打包,通過Remote File Explorer來修復此錯誤
- 在UnityEditor中,通過"Window > Remote File Explorer"開啟Remote File Explorer工具視窗,通過Stats皮膚可以檢視服務端IP
- 在客戶端輸入正確的服務端IP,然後點選Connect。連線成功後Stats皮膚的State將顯示為"Established"
- 拼寫錯誤是在這個檔案changetextcontent.lua內寫錯的,如下所示修改檔案內容(主要是將"Hello, Wlrod"拼寫修正為"Hello, World")
local obj = CS.UnityEngine.Object.FindObjectOfType(typeof(CS.Game.ChangeTextColor))
local textComponent = obj:GetComponent(typeof(CS.UnityEngine.UI.Text));
textComponent.text = "Hello, World"
- 通過Remote File Explorer工具視窗,GoTo到Application.persistentDataPath目錄。這個目錄下的Lua檔案將會被優先載入(這是工程內的Lua載入機制決定的,詳情可參考XLuaManager.cs)
- 拖拽changetextcontent.lua檔案上傳到該目錄。之後重啟客戶端,"Hello, Wlrod"的拼寫錯誤將會被修復。完整的操作流程如下所示
- 另外,利用xLua的hotfix特性,還可以修改C#程式碼的邏輯。例如,"Hello, World"文字的顏色是由C#程式碼設定的紅色,可以通過修改changetextcontent.lua檔案將文字設定為綠色,內容如下所示
local obj = CS.UnityEngine.Object.FindObjectOfType(typeof(CS.Game.ChangeTextColor))
local textComponent = obj:GetComponent(typeof(CS.UnityEngine.UI.Text));
textComponent.text = "Hello, World"
xlua.hotfix(CS.Game.ChangeTextColor, "Start", function(self)
self:GetComponent(typeof(CS.UnityEngine.UI.Text)).color = CS.UnityEngine.Color.green
xlua.hotfix(CS.Game.ChangeTextColor, "Start", nil)
end)
- 之後同樣的操作,將檔案上傳到Application.persistentDataPath目錄,重啟客戶端後,文字顏色將改變。完整的操作流程如下所示
用例2-直接拉取手機上的日誌檔案
- 如果某個固定檔案會被頻繁拉取,比如日誌檔案或是效能分析檔案。可以通過配置CustomMenuAttribute為該檔案新增一個自定義拉取操作。以拉取日誌檔案game.log為例,新增一個CustomMenuAttribute修飾的方法
using UnityEngine;
using RemoteFileExplorer.Editor;
public class TestAttribute
{
[CustomMenu("pull game log")]
public static void PullLog(ManipulatorWrapper manipulator)
{
string remoteLogPath = manipulator.GetRemotePath("Application.persistentDataPath") + "/Logs/game.log";
manipulator.Download(remoteLogPath, Application.dataPath.Replace("/Assets", "") + "/Logs/game.log"); // 將log檔案下載到本地
}
}
- 程式碼新增後,重新開啟Remote File Explorer工具視窗將出現"Custom"選單,點選該選單後會執行PullLog方法
- 連線建立成功後,通過"pull game log"操作可以一鍵拉取game.log檔案。完整的操作流程如下所示
安裝
本工具是採用Unity的包形式,可以通過Unity Package Manager直接安裝
這裡介紹兩種常用方式
- 開啟"Window > Package Manager"視窗後,單擊狀態列左側的"+"按鈕,選擇"Add package from git URL",然後在文字框中輸入本工具的git地址
https://github.com/iwiniwin/unity-remote-file-explorer.git
,單擊"Add"按鈕後完成安裝 - 或直接克隆本工具到專案的"Packages"目錄下
詳細安裝方式可以檢視使用文件,更多將本工具作為包進行安裝的方式可檢視Unity官方文件
使用
安裝本工具後,可通過"Window > Analysis > Remote File Explorer"開啟本工具視窗,將自動啟動伺服器
給專案的任意遊戲物件新增FileExplorerClient元件
如果是固定連線到某臺機器上,可直接通過Inspector皮膚在"Host"域輸入這臺機器的IP地址,然後勾選"Connect Automatically",則會在應用啟動時自動連線
如果希望應用啟動後能主動選擇連線到哪臺機器,則可在Debug模式下封裝一套簡單的UI,使開發人員能夠輸入想要連線到的IP地址。例如在自己的選單中新增一個條目或按鈕,點選後彈出輸入視窗。在成功獲取到的IP地址後,將其賦值給FileExplorerClient元件的"Host"屬性,然後呼叫FileExplorerClient元件的"StartConnect"方法開啟連線
也可以使用本工具自帶的一個簡易UI,給專案的任意遊戲物件新增FileExplorerWindow元件(此時不用再額外新增FileExplorerClient元件)
遊戲啟動後將自動開啟連線視窗
功能列表
詳細的圖文功能介紹請檢視使用文件
- 通過狀態列的"GOTO"可直接跳轉到Unity預定義的一些路徑
- 通過單擊路徑欄可開啟輸入框,以直接輸入路徑跳轉或複製當前路徑
- 右鍵所選中的資料夾或檔案支援下載
- 右鍵所選中的資料夾或檔案支援刪除
- 右鍵空白區域支援上傳資料夾或檔案
- 右鍵空白區域支援重新整理當前路徑的內容
- 支援直接從Unity Project視窗拖拽資料夾或檔案到本工具上傳
- 支援直接從系統檔案瀏覽器拖拽資料夾或檔案到本工具上傳
- 通過本工具"status"皮膚可檢視連線狀態以及已連線裝置的資訊,可用於辨別連線的是哪臺裝置
- 通過配置BeforeUploadAttribute自定義上傳時的額外操作,例如上傳lua程式碼時自動加密
- 通過配置CustomMenuAttribute自定義操作選單
連結
- Remote File Explorer https://github.com/iwiniwin/unity-remote-file-explorer
- Remote File Explorer Demo https://github.com/iwiniwin/RemoteFileExplorerDemo