Unity 如何制作和发布你的 Package

news2024/12/29 10:44:37

一、制作你的第一个 Package

Unity Package 不做过多赘述,像 URP 本质上也是一个 Package,在 Unity 中可以通过菜单栏 → Window → Package manager 来管理你当前的所有 Package

本篇文章主要介绍:如何制作并发布属于你的 Package

1.1 Package 主要包含以下内容

你的 Package 所实现的功能/提供的工具本身,其中的内容包括但不限于:

  • C# 脚本
  • 程序集 Assembly
  • 原生插件 Plugin
  • 模型、贴图、材质、音频等其他资产

除此之外,还需要添加 package 信息文件

  • 修改日志 CHANGELOG.md
  • 说明文件 README.md
  • 版权声明 LICENSE.md
  • 文档 Document~ (文件夹名后加~可使工程忽略该文件夹,文档仍是 md)

以及每个包还必须包含一个 Package 清单:package.json 文件,用于声明包体信息,包括名称、版本、依赖和仓库地址等

1.2 Package 目录结构

对于单一 Package:官方手册推荐布局样式

<root>
  ├── package.json
  ├── README.md
  ├── CHANGELOG.md
  ├── LICENSE.md
  ├── Editor
  │   ├── Unity.[YourPackageName].Editor.asmdef
  │   └── EditorExample.cs
  ├── Runtime
  │   ├── Unity.[YourPackageName].asmdef
  │   └── RuntimeExample.cs
  ├── Tests
  │   ├── Editor
  │   │   ├── Unity.[YourPackageName].Editor.Tests.asmdef
  │   │   └── EditorExampleTest.cs
  │   └── Runtime
  │        ├── Unity.[YourPackageName].Tests.asmdef
  │        └── RuntimeExampleTest.cs
  └── Documentation~
       └── [YourPackageName].md

例如 URP Package 的第一层目录如下:

如果你有多个 Package,可以再添加一层,便于管理:

例如上,其中根文件夹用你的名字(作者名字),子文件夹为每个独立的 Package

1.2.1 各个目录里应该放置哪些内容

Editor 文件夹

  • 包含一些只在编辑器中使用的功能,在这里放置的脚本将只在 Unity 编辑器环境中执行
  • 需在 Editor 文件中添加对应的 asmdef 文件

Runtime 文件夹

  • 包含在游戏运行时使用的功能,这里的脚本将在游戏运行时执行
  • 在 Runtime 文件添加对应的 Unity.TestPackage.asmdef

Tests 文件夹或其他文件夹

  • 包含你的测试场景、及其对应的材质、音效、场景等资产等。对于这部分内容,确保移除后不会影响你 package 本身的功能,实际大项目应用该 package 时,可以选择只要 Runtime 和 Editor 部分的内容

1.3 Package 信息清单文件和配置文件

1.3.1 Package 配置清单文件:package.json

每个 Package 都必须要有一个 package.json 文件,用于配置 Package 信息,在 Package 导入项目后,这些信息会在 Package Manager 窗口展示出来

必要信息

  • name:包名,需满足如下命名规范:①包名起始必须为 com.<company-name>,例如 com.happyengine-clusterlight;②需低于 50 个字符,且仅能包含小写字母、数字、连字符-、下划线_和点.
  • version:版本号,需遵守:主版本.次版本.补丁版本规则即 x.x.x

建议信息

  • displayName:在编辑器中的展示名称
  • description:简介,展示与 Package Manager 窗口中,支持 UTF-8 编码字符
  • unity:支持当前 package 的最小 Unity 版本
  • author:作者信息,可包含 name,email 和 url

其它可选信息:

  • keywords:Package Manager 搜索 API 使用的关键字数组,这可以帮助用户找到相关的包,对于公司内的仓库而言,完全可以不填
  • unityRelease:针对上面的 version,补充指明特定的 Unity 发行版本:例如 44f1
  • dependencies:当前 package 依赖的其它包名及版本,key 为包名,value 为版本,可以有多个,不支持范围语法,例如 "com.happyengine-clusterlight": "1.0.0"
  • documentationUrl:当前 package 对应的文档

一个例子:

{
    "name": "com.happyengine-clusterlight",
    "version": "1.0.0",
    "displayName": "Hyychen.ClusterLight",
    "description": "移动平台实时动态多点光源方案",
    "unity": "2020.3",
    "documentationUrl": "https://blog.csdn.net/Jaihk662/article/details/137153400",
    "dependencies": {},
    "keywords": [
      "Cluster",
      "MultipleLight"
    ],
    "author": {
      "name": "Jaihk662",
      "email": "1045376785@qq.com",
      "url": "https://blog.csdn.net/Jaihk662"
    }
}

1.3.2 License 版权文件

符合法律要求 - Unity 手册

1.3.3 ChangeLog 文件

用于记录当前 package 的每一次更新内容,可以理解为是 git commit log,可以通过类似于 git 工具自动导出,一个简单的例子如下:文件名称必须为 CHANGELOG.md,且同样需要放在 package 的根目录下

# Changelog
## [1.0.0] - 2024-02-29
- ClusterLight ViewSpace 初版完成
## [2.0.0] - 2024-03-04
- 添加了一个室内场景用于测试
- ClusterLight ViewSpace 实现
## [3.0.0] - 2024-03-05
- 修改测试场景的光照及材质表现
## [4.0.0] - 2024-03-11
- 支持 WorldSpace ClusterLight
## [5.0.0] - 2024-03-26
- 支持 CPU 计算 ClusterLight,以适配不支持 ComputeShader 的手机

建议还是要有一份,除非你没有做版本管理 or 只有当前一个版本

1.3.4 Readme 文件

用于展示在你 package 主页的内容,和 Git README.md 文件作用一致,可使用 markdown 编辑器编辑,文件名称必须为 README.md

一般可以只填写注意事项,如果不想专门写的话,里面存放你功能对应的文档链接即可

二、程序集定义和包

包中的 .cs 脚本文件必须与程序集定义文件 .asmdef 关联(在同一目录下),.asmdef 等同于 .Net 生态的 C# 工程,得益于此功能,开发者可以在一个文件夹中自定义程序集。定义明晰的依赖关系,也可以确保脚本更改后,只会重新生成必需的程序集以减少编译时间

2.1 创建你当前 package,Runtime 及 Editor 下的 asmdef 文件

程序集定义 (Assembly Definition) 属性 - Unity 手册

可通过右键 → Assets > Create > Assembly Definition 菜单来创建当前默认的 asmdef 文件

对于 Editor 目录:需要将特定于 Editor 的代码存储在根 Editor 程序集定义文件中:

Editor/[YourCompany].[YourPackageName].Editor.asmdef

asmdef 文件会把其所在文件夹下的脚本打入同一个程序集中,如果一个文件夹及子文件夹中有多个 asmdef 文件,每个脚本被添加到离这个脚本最短路径的 asmdef 中去。如果你搞不清楚一个脚本究竟被包含在了哪个 asmdef 中,只需要选中这个脚本,在 Inspector 面板中就会清楚的看到

同理对于 Runtime 目录,也需要将特定于运行时的代码存储在根运行时程序集定义文件中:

Runtime/[YourCompany].[YourPackageName].Runtime.asmdef

如果你的其它目录中(例如 Test 目录)也包含 CS 脚本,则也需要配置相关的测试程序集:例如

Runtime/[YourCompany].[YourPackageName].Test.asmdef

2.2 asmdef 文件配置信息

程序集定义文件格式 - Unity 手册

只新增 asmdef 是不够的,还需要进行设置,首先是依赖关系

若一程序集内代码有对其他程序集的代码的引用,则必须在.asmdef的 Inspector 中Assembly Definition References选项下添加对该程序集文件的引用,例如你当前的 Editor 极大概率需要依赖其 Runtime asmdef

如果想要将已经预编译好的程序集(dll)关联到 assembly definition file 中,需要勾选上面的 Override References 后再添加对应的 dll

同时对于不同平台的代码,根据代码作用在.asmdef文件的Platforms选项下选定程序集运行平台,例如对于 Editor 的 asmdef 而言,其必然只会在 Editor 下生效,Unity 仅在包含的平台上编译或引用此程序集

如果你的 Runtime 逻辑不区分平台,则保持默认设置 Any Platform

Package 中部分代码想要选择性的参与编译,可以通过在 Assembly Definition File 中 的 Version Define 自定义宏,并选择宏开启的条件,条件一般为:

  1. 在特定的程序集存在的情况下启用宏(图中 Resource 展开选择即可)
  2. 在特定版本的程序集存在的情况下启用宏,如对版本不做限制,输入0.0.0 或留空即可

当然还要注意

  1. 直接在界面中选择 package 可能只能选择当前已经存在的 package,这明显是不科学的,因为启用该宏的 package 可能不存在,此时需要你用文本打开 asmdef 文件直接编辑
  2. 如果确信程序集存在且版本正确,但是宏未启用,请为插件重新生成 vs 项目,具体方式为 Edit → Preferences → External Tools → Regenerate project files

其他一些不是特别重要的配置信息大部分情况下都可以保持默认,例如 Define Constraints,有特殊需求可以直接参考前面 2.1 提供的官方文档的链接

三、发布 or 获取你的 package

3.1 使用本地的 package

注意,用于开发 package 的工程,和你实际安装 package 的工程不能是同一个!也就是 Asset 下和 Packages 下不能出现相同的两份代码,不然会出现重复加载问题。如果想要测试下载你自己开发的 package,可以启用一个空项目

如果你前面对 package 的设置没有问题,就可以测试添加自己的 package 了

  1. 开启一个空项目,或者打开一个正常研发的项目(例如 ROMeta)
  2. 通过 Window → PackageManager 尝试添加你的 package,或者直接修改 Packages 根目录下的 manifset.json 文件

最后进入游戏,检查 package 对应功能是否正确,此时你也可以通过 UPM 找到自己的 package

3.1.1 *你项目里所有的 Package,它们都在哪里

Unity 的 Package Manager - Unity 手册

可以确定的是,这些 package 不会在你的 Asset 文件里,那么它们究竟在哪呢?

你的 package 会默认存储在 library/packagecache/ 目录下,项目是直接读取这个目录的,此时如果你要修改 package 里面的内容(例如修改 URP 源码),就不行,因为 library/packagecache/ 目录更像是一个存储 cache 的地方,如果对应的 package 有更新,那么你修改的内容也会丢失,同时你的项目 git 也不会管理 library 目录

因此,如果你要修改他人的 package 源码,需要将对应的 package 目录挪到和 Assets 同级的 Packages 目录下(其它目录也可,不过需要修改 manifest.json),而非保留在原位置 (library/packagecache/)

当然你也可以放置到其它的自定义位置,只要确保不在 library、Assets 等已有规则的目录中即可,不过此时就需要修改 manifest.json 文件,重新指定其 package 位置,一个格式参考如下

"com.unity.render-pipelines.core": "file:../HappyEnginePackages/com.unity.render-pipelines.core@10.10.1",
"com.unity.render-pipelines.universal": "file:../HappyEnginePackages/com.unity.render-pipelines.universal@10.10.1",
"com.unity.textmeshpro": "file:../HappyEnginePackages/com.unity.textmeshpro@3.0.6",
"com.happyengine-clusterlight": "file:../HappyEnginePackages/com.happyengine-clusterlight@5.0.0",

其对应的位置如下

当然,UPM 还有一个叫做 global cache 的地方,位置为 %LOCALAPPDATA%\Unity\cache,这个地方也会存放 Unity 的 packages 作为 unity 的所有版本所有项目的 cache,在 unity 启动的时候,它会本地启动一个 http server 并会往这个 local server 发请求,然后这个 local server 会从 manifest.json 中读取信息,从你配置的 registry 下载相关的 packages,如果发现 global cache 没有的,它会在那里放一份,如果发现有的,它就会直接从 global cache 里面拷贝一份到打开的项目

因此,如果你某个 package 一直报错,并且和你当前的 Unity 项目无关,可以尝试删除这个目录下的对应 package,并将 library/packagecache/ 也删除后重试,定能解决问题

3.2 发布的 package 需满足的规范

依照具体项目而定

3.3 使用 UPM 发布你的 package

依照具体项目而定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1619361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将本地项目推送至gitlab仓库

1. gitlab上新建一个空白项目 gitlab上点击new project按钮&#xff0c;新建一个项目 新建空白项目 项目名称与本地新建项目名称相同&#xff0c;其余根据具体需要选择 2. 初始化本地仓库并commit项目 进入本地项目根目录下&#xff0c;右击 git bash here打开命令窗口 初始化…

8.4.2 实验2:配置Trunk

1、实验目的 通过本实验可以掌握&#xff1a; Native VLAN 的含义和配置。IEEE802.1q 封装Trunk 配置和调试方法。 2、实验拓扑 配置 Trunk 的实验拓扑如下图所示。 图8-6 配置 Trunk 的实验拓扑 3、实验步骤 3.1 在交换机S1、S2上创建 VLAN 并把端口划分到相应的VLAN中 …

ASP.NET教务管理平台-权限及公共模块设计与开发

摘 要 随着教育改革的不断深化&#xff0c;高等院校的建设与发展对国民整体素质的提高起着越来越重要的作用&#xff0c;建立一套能够适应这些改变的行政管理方案也就显得尤为重要。对于教务处来说&#xff0c;将信息技术用于校务管理中便是迫切的要求。 教务系统中的用户…

ROS 2边学边练(33)-- 写一个静态广播(C++)

前言 通过这一篇我们将了解并学习到如何广播静态坐标变换到tf2&#xff08;由tf2来转换这些坐标系&#xff09;。 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如&#xff0c;在以激光扫描仪中心的坐标系中推理激光扫描测量数据是最简单的。 这…

Ventus(承影):基于RISC V的开源GPGPU

Ventus&#xff08;承影&#xff09;&#xff1a;基于RVV的开源GPGPU 清华大学集成电路学院dsp-lab的承影RVV GPGPU设计文档。 整体目标 提供一个开源的基于RVV的GPGPU实现方案&#xff0c;并给出软件映射方案、指令集&#xff08;支持的指令及特性、添加的自定义指令&#xf…

15.接口自动化学习-Mock(挡板/测试桩)

场景&#xff1a; 新需求还未开发时&#xff0c;使用mock提早介入测试&#xff0c;等后边开发后&#xff0c;进行调试 三方接口返回效率低&#xff0c;使用mock技术走通流程 1.mock方式 &#xff08;1&#xff09;如果会写django或flask,可以写简单对应的代码 &#xff08;…

小米一面:说说MVC与设计模式的关系

前言 大家好&#xff0c;我叫阿杆&#xff0c;不叫阿轩。 先来看看面试环节吧。 面试官&#xff1a;请说说MVC模式是基于哪种设计模式的&#xff1f; 求职者&#xff1a;MVC本身不就是一种设计模式吗&#xff1f; 面试官&#xff1a;我的意思是&#xff0c;MVC是基于23中设计…

【04-提升模型性能:集成学习与超参数优化】

文章目录 前言集成学习BaggingBoosting超参数优化随机搜索贝叶斯优化总结前言 在前几篇博文中,我们已经介绍了一些机器学习的基础知识、Scikit-learn的核心工具与技巧,以及如何评估模型性能。本篇博文将重点讲解两个可以显著提升机器学习模型性能的高级策略:集成学习和超参数…

python企业员工培训考试系统django+vue

这次开发的供电公司安全生产考试系统管理员&#xff0c;教师&#xff0c;学生。管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;主观题信息管理&#xff0c;主观题回答管理&#xff0c;主观题评分管理&#xff0c;成绩信息管理&#xff0c;试卷管理…

命名空间:namespace

对于无名命名空间 &#xff1a;但是不能再次定义相同名称的变量 在同一文件中

Linux程序调试优化(2)—— 一次学会嵌入式Linux下程序崩溃定位

文章目录 1.gdb调试1.1 gcc 编译时不带-g1.2 gcc 编译时带-g 2.coredump栈回溯2.1 使能core文件生成2.1 借助core文件回溯堆栈 3.backtrace捕捉SIGSEGV信号4.其他工具5.总结 写程序时&#xff0c;难免碰到程序崩溃的现象&#xff0c;而如何排查这些内存崩溃问题&#xff0c;例如…

Pulsar Meetup 深圳 2024 会务介绍

“ Hi&#xff0c;各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar Meetup 深圳 2024 报名倒计时啦&#xff0c;快来报名。这里汇集了腾讯、华为和谙流科技等大量 Pulsar 大咖&#xff0c;干货多多&#xff0c;礼品多多&#xff0c;不容错过啊。 ” 活动介绍 图片 由 AscentStre…

巧用波卡生态优势,Mythical Games 引领 Web3 游戏新航向

Polkadot 对创新、安全和治理的承诺为 Mythical Games 提供了极大的发展价值。这个链上生态不仅将支持 Mythical Games 成长发展&#xff0c;还将帮助其他 Mythos 合作伙伴来壮大建设项目。 —— Mythical Games 创始人兼首席执行官 John Linden 近期 Web3 游戏行业又有新动向&…

【管理咨询宝藏86】MBB物流公司营销项目价值定位与目标客户规划报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏86】MBB物流公司营销项目价值定位与目标客户规划报告 【格式】PDF版本 【关键词】战略规划、MBB、麦肯锡 【核心观点】 - 价值定位是企业希望深…

HORROR SYSTEM

HORROR SYSTEM是一个创新的工具包,允许开发者在Unity3D中创建独特的原创恐怖游戏。 HORROR SYSTEM是一款强大而灵活的工具,旨在基于Unity3D引擎创建沉浸式第三人称恐怖游戏。 这项资产易于使用且直观,可以让任何经验水平的开发人员将他们的想法付诸实践,创造出高质量、充满…

飞行汽车飞行控制系统功能详解

飞行汽车是一种创新的交通工具&#xff0c;结合了汽车和飞机的特点。它可以在陆地上行驶&#xff0c;同时也具备在空中飞行的能力。飞行汽车的概念已经存在多年&#xff0c;并且近年来随着技术的进步和研发的深入&#xff0c;这种交通工具正在逐渐从概念走向现实。 飞行汽车的…

NLP方面知识

NLP方面知识 一 基础1.Tokenizer1.1 分词粒度&#xff1a;1.2 大模型的分词粒度1.3 各路语言模型中的tokenizer 2.Embedding layer2.1 理解Embedding矩阵 一 基础 1.Tokenizer tokenizer总体上做三件事情&#xff1a; 分词。tokenizer将字符串分为一些sub-word token string&…

学习Rust的第10天:枚举和模式匹配

今天我们来看看一个类似的概念 enums 。 Enums: We saw that in Rust, enums are data types that list possible values, giving a simple and type-safe mechanism to describe alternatives. We looked at how to create enums and use them to represent similar possibili…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台&#xff0c;供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心&#xff0c;最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

【Win】怎么下载m3u8视频\怎么通过F12开发人员工具获取视频地址\怎么下载完整的.ts格式视频

怎么下载m3u8视频&#xff1f;首先通过浏览器本地的开发人员工具&#xff0c;获取m3u8的地址&#xff0c;然后再通过第三方下载工具下载&#xff0c;此处以N_m3u8DL-CLI_v3.0.2为例 如下图的步骤&#xff0c;即可获取到视频的m3u8地址 打开N_m3u8DL-CLI_v3.0.2&#xff0c;粘贴…