Unity Custom Package 学习日志⚓︎
目前准备尝试把 Odin Toolkits
转化为 Unity Package
,从零开始学习 Custom Package
的开发。
项目开发版本定为 Unity 2021.3.45f1 LTS
,操作系统基于 MacOS 15.5
,使用 Apple Silicon
原生版本。
学习官方文档⚓︎
Unity
官方文档链接:Create Custom Packages
创建 Unity Package
有两种方式,嵌入式包(Embedded)和本地包(Local),简单来说嵌入式包是在 Unity
项目中操作,本地包可以在任意位置操作。
选择嵌入式包创建自定义包,新建一个项目,打开项目文件夹下的 Packages 文件夹,创建一个新文件夹,命名规则为反向域名法,如 'cn.yuumix.odintoolkits'
,全部小写字母。然后在文件夹中创建一个 package.json
文件,内容至少要包含:名称 Name
, 版本 Version
, 还有其他可选项,点击跳转官方清单案例。
然后可以重新进入 Unity
编辑器或者重新打开 Unity
项目,就可以在 Package Manager
中看到新的包。
接下来直接在 Packages
目录下的 Odin Toolkits
文件夹中进行代码编写,必须定义程序集,此处的文件夹名称等于 package.json
文件中定义的 displayName
值。
最后就可以上传 GitHub
进行共享包。
项目结构需要调整⚓︎
Unity Package
默认采用 Editor
和 Runtime
两个目录设计,将重新调整结构,将整个项目划分为两部分,并将不同模块也区分为两部分。现在还需要解决几个问题:
- 对于编辑器阶段的配置怎么处理?
- 对于运行时阶段的配置可以直接放到
Resources
文件夹下加载吗? - 是否还需要保留
YuumixEditor
程序集? - 怎么和
AssetStore
兼容? Packages
文件夹内的脚本是否可以引用Odin Inspector
?
解答 5⚓︎
可以直接使用 SerializedMonoBehaviour
,自定义程序集默认是可以引用 Plugins
预编译程序集的。但是被预定义程序集 Assembly-CSharp.dll
和 Assembly-CSharp-Editor.dll
引用。程序集定义官方文档
解答 4⚓︎
Unity Asset Store 可以直接上传 Packages 文件夹内的脚本,作为资产导入到项目后,依旧可以修改,不是只读的。和正常的 Assets 文件夹一样。
解答 3⚓︎
需要保留 YuumixEditor 类似的程序集。因为新生成的 Editor 程序集是引用 Runtime 的,而 Runtime 程序集还需要引用一个编辑器状态下可以使用的程序集,来发挥类似 UnityEditor 的作用。
解答 2⚓︎
Package 可以直接加载 Resources 文件夹下的资源,会直接打包。
解答 1⚓︎
编辑器的设置可以尝试使用 ScriptableSingleton 进行保存,保存在当前项目,然后设计一个图形界面去可视化设置。
项目修改需要验证的内容⚓︎
Odin Toolkits 的全局路径是否可以使用⚓︎
可以读取到 Packages 文件夹的路径。此全局路径使用 ScriptableSingleton 保存。
包的脚本 API⚓︎
使用 C# 脚本去处理 Packages,核心类是 PackageManager.Client
,相关链接:Scripting API for packages 2021
自定义包共享⚓︎
创建一个 GitHub 仓库,git clone 到本地,然后在此仓库中添加 Unity 项目,找到 Packages 文件夹,新建子文件夹,文件夹的名称通常和包名保持一致,采用反向域名规则。接下来创建 package.json 文件,并填写信息,根据 Unity 推荐结构进行项目编写。
上传到 GitHub 仓库中,Main 分支则为插件开发环境项目。如果有贡献者,可以在 Fork 项目,使用 Main 分支作为贡献者开发环境,然后提交 Pull Request。
同时仓库最好设计一个 UnityCutsomPakage 分支,或者可以新开一个 git 仓库,用于快捷拉取项目。实现 Unity Package Manager 的功能。此分支的根目录必须存在 package.json 文件,也就是移除项目其他内容,只留下自定义包内部的文件,不要包名文件夹。
注意
如果采用的是 git 直接拉取 Package,那么它将会存在 Library 文件夹,成为缓存包,无法修改。
问题 1 Library
场景文件 [无法打开 git 拉取的场景文件]
⚓︎
如果 UnityCutsomPakage 包含场景文件,那么 Unity 会将场景文件保存在 Library 文件夹中,而不是 Assets 文件夹中,此时可以打开场景文件,并进行测试吗?
嵌入式自定义包不可以使用 AssetDatabase
来获取 ScriptSingleton
文件的路径。
但是可以直接获取 ScriptableObject 的路径.
// 此方法可以获取 ScriptableObject - RootLookup 资源的正确路径,以 Packages/ 文件夹开头
public static void GetRootLookupPath()
{
var path = ScriptableObjectEditorUtil.GetAssetPath<RootLookup>();
Debug.Log("RootLookup Asset 路径为: " + path);
}
// 此方法不能获取 ScriptableSingleton - RootPathLocation 资源的路径,为 "" 空字符串
public static void LogPath()
{
Debug.Log("使用 File.GetFullPath 获取 RootPathLocation 文件路径: " + GetFilePath());
Debug.Log("使用 AssetDatabase 获取 RootPathLocation 文件路径: " + AssetDatabase.GetAssetPath(instance));
}
禁止
使用 Git 拉取后的 Package 位于 Library 文件夹中,不能进行修改。场景不能打开。如果还想要使用 Package 进行管理,则必须把所有场景相关的,需要调试的内容全部放到 Sample 中(OdinToolkits 中包含非常多的可以调试的内容,也有运行时场景调试)。全部放到 Sample 中反而会显得整个包比较小。
通常使用 git 拉取的仓库应该是不需要进行修改调试的代码库。