統一包管理器

Unity 是一個已經存在很長時間並且不斷發展的平台。 但是,當同時處理多個項目時,您在使用通用源 (.cs)、庫 (.dll) 和其他資源(圖像、聲音、模型、預製件)時仍然會遇到困難。 在本文中,我們將討論針對 Unity 此類問題的本機解決方案的經驗。

統一包管理器

共享資源分配方式

對於不同的項目使用共享資源的方法不止一種,但每種方法都有其優點和缺點。

1. 複製 - 我們“手動”在項目之間複製資源。

優點:

  • 適用於各種資源。
  • 沒有依賴性問題。
  • 資產 GUID 沒有問題。

缺點:

  • 巨大的存儲庫。
  • 沒有版本控制選項。
  • 難以跟踪共享資源的更改。
  • 難以更新共享資源。

2. Git 子模塊 - 通過外部子模塊分配共享資源。

優點:

  • 您可以使用來源。
  • 您可以分配資產。
  • 沒有依賴性問題。

缺點:

  • 需要 Git 技能。
  • Git 對二進製文件不太友好 - 你必須包含 LFS。
  • 存儲庫的訪問控制。
  • 升級、降級困難。
  • GUID 衝突是可能的,並且 Unity 沒有明確的行為來解決它們。

3. NuGet - 通過 NuGet 包分發共享庫。

優點:

  • 方便地處理不依賴於 Unity 的項目。
  • 方便的版本控制和依賴性解析。

缺點:

  • Unity 無法使用開箱即用的 NuGet 包(在 GitHub 上,您可以找到適用於 Unity 的 NuGet 包管理器,它修復了此問題,但存在一些細微差別)。
  • 分配其他類型資產的困難。

4. Unity 套件管理器 - 透過 Unity 的本機解決方案分配共用資源。

優點:

  • 用於處理包的本機接口。
  • 防止在 GUID 衝突的情況下覆蓋包中的 .meta 文件。
  • 版本控制能力。
  • 能夠為 Unity 分發所有類型的資源。

缺點:

  • GUID 衝突仍然可能發生。
  • 沒有實施文檔。

後一種方法優點多於缺點。 然而,由於缺乏文檔,它現在還不是很流行,因此我們將詳細討論它。

統一包管理器

Unity Package Manager(以下簡稱UPM)是一個包管理工具。 它是在 Unity 2018.1 中添加的,僅用於 Unity Technologies 開發的軟件包。 但是,從版本 2018.3 開始,可以添加自定義包。

統一包管理器
Unity 包管理器界面

包最終不會出現在項目源(Assets 目錄)中。 它們位於單獨的目錄中。 %projectFolder%/Library/PackageCache 並且不會以任何方式影響項目,它們在源代碼中唯一提及的是在文件中 packages/manifest.json.

統一包管理器
項目文件系統中的包

包來源

UPM 可以使用多種包源:

1、文件系統。

優點:

  • 實施速度。
  • 不需要第三方工具。

缺點:

  • 版本控制的複雜性。
  • 參與該項目的每個人都需要對文件系統進行共享訪問。

2.Git 存儲庫。

優點:

  • 您所需要的只是一個 Git 存儲庫。

缺點:

  • 您無法通過 UPM 窗口在版本之間切換。
  • 不適用於所有 Git 存儲庫。

3.npm 存儲庫。

優點:

  • 完全支持UPM功能並用於分發官方Unity包。

缺點:

  • 目前忽略除“-preview”之外的所有字符串版本的包。

下面我們將看看 UPM + npm 的實現。 該捆綁包很方便,因為它允許您使用任何類型的資源並管理包版本,並且還完全支持本機 UPM 界面。

作為 npm 存儲庫,您可以使用 韋爾達喬。 它有詳細的 文件,並且實際上需要幾個命令來運行它。

環境設置

首先你需要安裝 的node.js.

創建一個包

要創建包,您需要將文件 package.json,它將描述它,到包含此包內容的目錄。 您需要執行以下操作:

進入我們要打包的項目目錄。

運行 npm init 命令並在對話框中輸入所需的值。 對於名稱,請以反向域格式指定名稱,例如 com.plarium.somepackage。
為了方便顯示包名,在package.json中添加displayName屬性並填寫。

由於npm是面向js的,因此該文件包含我們不需要的main和scripts屬性,Unity也不會使用這些屬性。 最好將它們刪除,以免堵塞包的描述。 該文件應如下所示:

  1. 進入我們要打包的項目目錄。
  2. 運行 npm init 命令並在對話框中輸入所需的值。 對於名稱,請以反向域格式指定名稱,例如 com.plarium.somepackage。
  3. 為了方便顯示包名,在package.json中添加displayName屬性並填寫。
  4. 由於npm是面向js的,因此該文件包含我們不需要的main和scripts屬性,Unity也不會使用這些屬性。 最好將它們刪除,以免堵塞包的描述。 該文件應如下所示:
    {
     "name": "com.plarium.somepackage",
     "displayName": "Some Package",
     "version": "1.0.0",
     "description": "Some Package Description",
     "keywords": [
       "Unity",
       "UPM"
     ],
     "author": "AUTHOR",
     "license": "UNLICENSED"
    }

  5. 打開 Unity 並為 package.json 生成 .meta 文件(Unity 看不到沒有 .meta 文件的資源,Unity 包以只讀方式打開)。

發送包裹

要發送包裹,您需要運行以下命令: npm publish --registry *адрес до хранилища пакетов*.

通過 Unity 包管理器安裝和更新包

要將包添加到 Unity 項目,您需要:

  1. 寫入文件 manifest.json 有關包來源的信息。 為此,您需要添加一個屬性 scopedRegistries 並指出搜索特定範圍的範圍和源地址。
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. 轉到 Unity 並打開“包管理器”窗口(使用自定義包與使用內置包沒有什麼不同)。
  3. 選擇所有包。
  4. 找到需要的包並添加。

統一包管理器

使用源代碼和調試

為了將源連接到項目,您需要創建 裝配定義 對於包裹。

包的使用並不限制調試的可能性。 但是,在 Unity 中使用包時,如果包中發生錯誤,則無法通過單擊控制台中的錯誤來轉到 IDE。 這是因為 Unity 不會將腳本視為單獨的文件,因為在使用程序集定義時,它們會被收集到庫中並包含在項目中。 使用項目中的源時,可以通過點擊轉換到 IDE。

具有連接包的項目中的腳本:

統一包管理器
帶有工作斷點的包中的腳本:

統一包管理器

緊急修復包

添加到項目中的 Unity 包是只讀的,但可以在包緩存中進行編輯。 為此,您需要:

  1. 轉到包緩存中的包。

    統一包管理器

  2. 進行必要的更改。
  3. 更新文件中的版本 package.json.
  4. 發送包裹 npm publish --registry *адрес до хранилища пакетов*.
  5. 通過 UPM 界面將軟件包版本更新為正確的版本。

包導入衝突

導入包時,可能會出現以下GUID衝突:

  1. 包就是一個包。 如果在導入包時發現已添加的包包含具有相同 GUID 的資產,則導入包中具有匹配 GUID 的資產將不會添加到項目中。
  2. 包是一個項目。 如果在導入包時發現項目中有 GUID 匹配的資產,則該包中的資產將不會添加到項目中。 但是,依賴於它們的資產將開始使用項目中的資產。

將資產從項目轉移到包

如果在 Unity 打開時將資源從項目傳輸到包,則其功能將被保留,並且依賴資源中的鏈接將開始使用包中的資源。

這一點很重要:將資源從項目複製到包時,會出現上一節中描述的包與項目衝突。

衝突的可能解決方案

  1. 導入所有資源時根據自己的算法重新分配 GUID,以避免衝突。
  2. 將所有資產添加到一個項目中,然後將它們分離到包中。
  3. 創建一個包含所有資產的 GUID 的數據庫,並在提交包時進行驗證。

結論

UPM 是一種在 Unity 中分配共享資源的新解決方案,可以成為現有方法的一個有價值的替代方案。 文章中描述的建議是根據真實案例提出的。 我們希望您發現它們很有用。

來源: www.habr.com

添加評論