自定义package文件结构
unity对自定义package的文件夹结构有一定的要求,开发者需要遵循这些要求制作。详细参考Package layout。
主要如下:
- package.json:package的清单文件,是必须的。以键值对的形式定义了一系列详细信息。其中name和version字段是必须的,name字段定义了唯一标识,字段里面的值不能带有大写英文字母,name字段也不需要和playersettings里面的package name相同。version定义了当前的版本,开发者习惯一次更新package将版本号会加一次。其他的字段和详细写法参考 Package manifest
- README.md 以md的形式记录的使用手册说明文档
- CHANGELOG.md package的版本更新记录,记录每次更新的内容
- Editor文件夹 所有只在编辑器下运行的脚本放在这个文件夹下,习惯放一个asmdef文件将这个文件夹下面的脚本文件打入一个程序集。asmdef文件详细参考Assembly definition and packages文件的命名不规范不会造成什么问题,也不需要和playersettings里面的package name相同,只是推荐命名按照上述链接进行。
- Runtime文件夹 在unity打出的程序中运行的脚本放在这个文件夹下,习惯放一个asmdef文件将这个文件夹下面的脚本文件打入一个程序集。
asmdef 文件能将它所在的文件夹及其子文件夹的脚本打到一个独立的程序集中,表象上就是这些个脚本打到了独立的 dll 中了。asmdef 文件的优势:
- 更短的编译时间
- 把"internal"访问修饰符用到了极致(要知道以往的源代码插件,因为与用户脚本编译在了同一个程序集, 所以它的 Internal 修饰符并没起到应有的作用,暴露了太多,就是一个掩耳盗铃的迪米特法则罢)
- 允许使用 unsafe code
- .dll 文件可以指定特定的程序集引用。
Demo
创建一个UnityManagerPackage工程
如图是,我制作的一个自定义的UnityManagerPackage文件结构。
RotateMe代码如下:
using UnityEngine;
public class RotateMe : MonoBehaviour
{
public float angularVelocity = 10;
void Update ()
{
var rot = Quaternion.AngleAxis (angularVelocity * Time.deltaTime, Vector3.up);
transform.localRotation = rot * transform.localRotation;
}
}
package.json文件如下:
{
"name": "com.coffee.rotate-me",
"displayName": "Rotate Me",
"description": "Rotate the object!",
"version": "1.0.0",
"unity": "2018.3",
"license": "MIT",
"dependencies": {
}
}
CHANGELOG.md,LICENSE.md,README.md皆为空。
RotateMe_Demo.scene为演示场景,用于测试。
将RotateMe文件夹保存到任意位置,我这里保存到桌面。
导入UnityManagerPackage
创建一个新的Untiy项目,打开Package Manager面板,引入刚刚的RotateMe。如图:
点击打开,稍等,可以在工程的Packages文件夹下看见RotateMe已经引入成功,即可在该新项目里使用RotateMe,如图所示:
打开项目工程的Packages/manifest.json文件,会看到com.coffee.rotate-me引入的路径信息。
{
"dependencies": {
"com.coffee.rotate-me": "file:C:/Users/17190/Desktop/RotateMe",
"com.unity.collab-proxy": "1.3.9",
"com.unity.ide.rider": "2.0.7",
"com.unity.ide.visualstudio": "2.0.5",
"com.unity.ide.vscode": "1.2.3",
"com.unity.test-framework": "1.1.20",
"com.unity.textmeshpro": "3.0.1",
"com.unity.timeline": "1.4.5",
"com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
"com.unity.modules.animation": "1.0.0",
"com.unity.modules.assetbundle": "1.0.0",
"com.unity.modules.audio": "1.0.0",
"com.unity.modules.cloth": "1.0.0",
"com.unity.modules.director": "1.0.0",
"com.unity.modules.imageconversion": "1.0.0",
"com.unity.modules.imgui": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0",
"com.unity.modules.particlesystem": "1.0.0",
"com.unity.modules.physics": "1.0.0",
"com.unity.modules.physics2d": "1.0.0",
"com.unity.modules.screencapture": "1.0.0",
"com.unity.modules.terrain": "1.0.0",
"com.unity.modules.terrainphysics": "1.0.0",
"com.unity.modules.tilemap": "1.0.0",
"com.unity.modules.ui": "1.0.0",
"com.unity.modules.uielements": "1.0.0",
"com.unity.modules.umbra": "1.0.0",
"com.unity.modules.unityanalytics": "1.0.0",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
"com.unity.modules.unitywebrequestaudio": "1.0.0",
"com.unity.modules.unitywebrequesttexture": "1.0.0",
"com.unity.modules.unitywebrequestwww": "1.0.0",
"com.unity.modules.vehicles": "1.0.0",
"com.unity.modules.video": "1.0.0",
"com.unity.modules.vr": "1.0.0",
"com.unity.modules.wind": "1.0.0",
"com.unity.modules.xr": "1.0.0"
}
}