Trình quản lý gói Unity

Unity là một nền tảng đã tồn tại khá lâu và không ngừng phát triển. Tuy nhiên, khi làm việc với nhiều dự án cùng lúc, bạn vẫn có thể gặp khó khăn khi sử dụng các nguồn chung (.cs), thư viện (.dll) và các nội dung khác (hình ảnh, âm thanh, mô hình, prefab). Trong bài viết này, chúng tôi sẽ nói về trải nghiệm của chúng tôi với giải pháp gốc cho vấn đề như vậy đối với Unity.

Trình quản lý gói Unity

Phương pháp phân phối tài nguyên được chia sẻ

Có nhiều cách để sử dụng tài nguyên dùng chung cho các dự án khác nhau, nhưng mỗi cách tiếp cận đều có ưu và nhược điểm.

1. Sao chép - chúng tôi sao chép tài nguyên giữa các dự án “bằng tay”.

Ưu điểm:

  • Thích hợp cho mọi loại tài nguyên.
  • Không có vấn đề phụ thuộc.
  • Không có vấn đề gì với GUID nội dung.

Nhược điểm:

  • Kho lưu trữ khổng lồ.
  • Không có khả năng phiên bản.
  • Khó theo dõi các thay đổi đối với tài nguyên được chia sẻ.
  • Khó cập nhật tài nguyên được chia sẻ.

2. Mô-đun con Git - phân phối các tài nguyên được chia sẻ thông qua các mô-đun con bên ngoài.

Ưu điểm:

  • Bạn có thể làm việc với các nguồn.
  • Bạn có thể phân phối tài sản.
  • Không có vấn đề phụ thuộc.

Nhược điểm:

  • Yêu cầu kinh nghiệm Git.
  • Git không thân thiện lắm với các tệp nhị phân - bạn sẽ phải kết nối LFS.
  • Kiểm soát truy cập cho các kho lưu trữ.
  • Khó khăn trong việc nâng cấp và hạ cấp phiên bản.
  • Có thể xảy ra xung đột GUID và Unity không có hành vi rõ ràng nào để giải quyết chúng.

3. NuGet - phân phối thư viện dùng chung thông qua các gói NuGet.

Ưu điểm:

  • Làm việc thuận tiện với các dự án không phụ thuộc vào Unity.
  • Phiên bản thuận tiện và giải quyết phụ thuộc.

Nhược điểm:

  • Unity không thể hoạt động với các gói NuGet ngay từ đầu (trên GitHub, bạn có thể tìm thấy Trình quản lý gói NuGet cho Unity để khắc phục vấn đề này, nhưng có một số sắc thái).
  • Khó khăn trong việc phân phối các loại tài sản khác.

4. Trình quản lý gói Unity - phân phối tài nguyên được chia sẻ thông qua giải pháp gốc cho Unity.

Ưu điểm:

  • Giao diện gốc để làm việc với các gói.
  • Bảo vệ chống ghi đè các tệp .meta trong các gói do xung đột GUID.
  • Khả năng phiên bản.
  • Khả năng phân phối tất cả các loại tài nguyên cho Unity.

Nhược điểm:

  • Xung đột GUID vẫn có thể xảy ra.
  • Không có tài liệu để thực hiện.

Phương pháp thứ hai có nhiều ưu điểm hơn nhược điểm. Tuy nhiên, hiện tại nó không phổ biến lắm do thiếu tài liệu và do đó chúng tôi sẽ nghiên cứu chi tiết về nó.

Trình quản lý gói Unity

Unity Package Manager (UPM) là một công cụ quản lý gói. Nó đã được thêm vào Unity 2018.1 và chỉ được sử dụng cho các gói do Unity Technologies phát triển. Tuy nhiên, bắt đầu từ phiên bản 2018.3, bạn có thể thêm các gói tùy chỉnh.

Trình quản lý gói Unity
Giao diện quản lý gói Unity

Các gói không có trong nguồn dự án (thư mục Tài sản). Chúng nằm trong một thư mục riêng %projectFolder%/Library/PackageCache và không ảnh hưởng đến dự án dưới bất kỳ hình thức nào, đề cập duy nhất của họ trong mã nguồn là trong tệp packages/manifest.json.

Trình quản lý gói Unity
Các gói trong hệ thống tập tin dự án

Nguồn gói

UPM có thể sử dụng một số nguồn gói:

1. Hệ thống tập tin.

Ưu điểm:

  • Tốc độ thực hiện.
  • Không yêu cầu công cụ của bên thứ ba.

Nhược điểm:

  • Khó khăn trong việc phiên bản.
  • Quyền truy cập chung vào hệ thống tệp là bắt buộc đối với mọi người làm việc với dự án.

2. Kho Git.

Ưu điểm:

  • Tất cả những gì bạn cần là một kho lưu trữ Git.

Nhược điểm:

  • Bạn không thể chuyển đổi giữa các phiên bản thông qua cửa sổ UPM.
  • Không hoạt động với tất cả các kho Git.

3. kho lưu trữ npm.

Ưu điểm:

  • Hỗ trợ đầy đủ chức năng UPM và được sử dụng để phân phối các gói Unity chính thức.

Nhược điểm:

  • Hiện bỏ qua tất cả các phiên bản chuỗi của gói ngoại trừ "-preview".

Dưới đây chúng ta sẽ xem xét việc triển khai UPM + npm. Gói này thuận tiện vì nó cho phép bạn làm việc với mọi loại tài nguyên và quản lý các phiên bản gói, đồng thời hỗ trợ đầy đủ giao diện UPM gốc.

Bạn có thể sử dụng nó như một kho lưu trữ npm Verdaccio. Có bản chi tiết документацияvà chỉ cần một vài lệnh để chạy nó.

thiết lập môi trường

Đầu tiên bạn cần cài đặt Node.js.

Tạo một gói

Để tạo một gói, bạn cần đặt tệp package.json, sẽ mô tả nó, vào thư mục chứa nội dung của gói này. Bạn cần phải làm như sau:

Chuyển đến thư mục dự án mà chúng tôi muốn tạo một gói.

Chạy lệnh npm init và nhập các giá trị được yêu cầu trong hộp thoại. Đối với tên, hãy chỉ định tên ở định dạng tên miền đảo ngược, ví dụ com.plarium.somepackage.
Để hiển thị tên gói một cách thuận tiện, hãy thêm thuộc tính displayName vào pack.json và điền vào.

Vì npm được định hướng theo js, ​​nên tệp chứa các thuộc tính chính và tập lệnh mà chúng tôi không cần và Unity không sử dụng. Tốt hơn là loại bỏ chúng để không làm lộn xộn mô tả gói. Tệp sẽ trông giống như thế này:

  1. Chuyển đến thư mục dự án mà chúng tôi muốn tạo một gói.
  2. Chạy lệnh npm init và nhập các giá trị được yêu cầu trong hộp thoại. Đối với tên, hãy chỉ định tên ở định dạng tên miền đảo ngược, ví dụ com.plarium.somepackage.
  3. Để hiển thị tên gói một cách thuận tiện, hãy thêm thuộc tính displayName vào pack.json và điền vào.
  4. Vì npm được định hướng theo js, ​​nên tệp chứa các thuộc tính chính và tập lệnh mà chúng tôi không cần và Unity không sử dụng. Tốt hơn là loại bỏ chúng để không làm lộn xộn mô tả gói. Tệp sẽ trông giống như thế này:
    {
     "name": "com.plarium.somepackage",
     "displayName": "Some Package",
     "version": "1.0.0",
     "description": "Some Package Description",
     "keywords": [
       "Unity",
       "UPM"
     ],
     "author": "AUTHOR",
     "license": "UNLICENSED"
    }

  5. Mở Unity và tạo tệp .meta cho pack.json (Unity không thấy nội dung không có tệp .meta, các gói cho Unity được mở ở chế độ chỉ đọc).

Gửi một gói

Để gửi gói bạn cần chạy lệnh: npm publish --registry *адрес до хранилища пакетов*.

Cài đặt và cập nhật gói thông qua Trình quản lý gói Unity

Để thêm gói vào dự án Unity, bạn cần:

  1. Thêm vào tập tin manifest.json thông tin về nguồn gốc của các gói. Để làm điều này bạn cần thêm thuộc tính scopedRegistries và chỉ ra các phạm vi cũng như địa chỉ nguồn nơi các phạm vi cụ thể sẽ được tìm kiếm.
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. Đi tới Unity và mở cửa sổ Trình quản lý gói (làm việc với các gói tùy chỉnh không khác gì làm việc với các gói tích hợp sẵn).
  3. Chọn tất cả các gói.
  4. Tìm gói bạn cần và thêm nó.

Trình quản lý gói Unity

Làm việc với các nguồn và gỡ lỗi

Để các nguồn được kết nối với dự án, bạn cần tạo Định nghĩa hội cho gói.

Việc sử dụng các gói không giới hạn các tùy chọn gỡ lỗi của bạn. Tuy nhiên, khi làm việc với các gói trong Unity, bạn không thể truy cập IDE bằng cách nhấp vào lỗi trong bảng điều khiển nếu xảy ra lỗi trong gói. Điều này là do Unity không xem các tập lệnh dưới dạng các tệp riêng biệt, vì khi sử dụng Định nghĩa hội, chúng được thu thập vào thư viện và đưa vào dự án. Khi làm việc với các nguồn từ một dự án, việc nhấp vào IDE sẽ có sẵn.

Tập lệnh trong dự án có gói được kết nối:

Trình quản lý gói Unity
Tập lệnh từ gói có điểm dừng hoạt động:

Trình quản lý gói Unity

Sửa chữa khẩn cấp các gói

Các gói Unity được thêm vào dự án ở dạng chỉ đọc nhưng có thể được chỉnh sửa trong bộ đệm của gói. Để làm điều này bạn cần:

  1. Chuyển đến gói trong bộ đệm gói.

    Trình quản lý gói Unity

  2. Thực hiện những thay đổi cần thiết.
  3. Cập nhật phiên bản trong tập tin package.json.
  4. Gửi gói npm publish --registry *адрес до хранилища пакетов*.
  5. Cập nhật phiên bản gói thành phiên bản đã sửa thông qua giao diện UPM.

Xung đột khi nhập gói

Xung đột GUID sau đây có thể xảy ra khi nhập gói:

  1. Gói - gói. Nếu khi nhập gói, người ta phát hiện ra rằng các gói đã thêm chứa nội dung có cùng GUID thì nội dung có GUID phù hợp từ gói đã nhập sẽ không được thêm vào dự án.
  2. Một gói là một dự án. Nếu khi nhập gói, người ta phát hiện ra rằng dự án chứa nội dung có GUID phù hợp thì nội dung từ gói sẽ không được thêm vào dự án. Tuy nhiên, tài sản phụ thuộc vào chúng sẽ bắt đầu sử dụng tài sản từ dự án.

Chuyển tài sản từ dự án sang gói

Nếu bạn chuyển nội dung từ dự án sang gói trong khi Unity mở, chức năng của nó sẽ được giữ nguyên và các liên kết trong nội dung phụ thuộc sẽ bắt đầu sử dụng nội dung từ gói.

Điều quan trọng là: Khi sao chép nội dung từ dự án sang gói, xung đột “Gói - Dự án” được mô tả ở phần trên sẽ xảy ra.

Các giải pháp khả thi cho xung đột

  1. Chỉ định lại GUID bằng thuật toán riêng của chúng tôi khi nhập tất cả nội dung để loại bỏ xung đột.
  2. Thêm tất cả tài sản vào một dự án và sau đó chia chúng thành các gói.
  3. Tạo cơ sở dữ liệu chứa GUID của tất cả nội dung và tiến hành xác thực khi gửi gói.

Kết luận

UPM là một giải pháp mới để phân phối tài nguyên được chia sẻ trong Unity, đây có thể là giải pháp thay thế xứng đáng cho các phương pháp hiện có. Các khuyến nghị được mô tả trong bài viết đều dựa trên các trường hợp thực tế. Chúng tôi hy vọng bạn sẽ tìm thấy chúng hữu ích.

Nguồn: www.habr.com

Thêm một lời nhận xét