首页 > 其他分享 >在Unity中模块化管理自定义功能和资源

在Unity中模块化管理自定义功能和资源

时间:2023-12-01 12:44:22浏览次数:37  
标签:文件 git 自定义 package 模块化 Package Unity Editor

之前在做Unity项目时,有时会遇到多个项目共用同一部分代码或资源的情况。而当被共用的部分需要更新的时候,手动复制替换非常麻烦,并且可能会有遗漏。对于这个问题,一个很好的解决办法是将可复用的文件打包为自定义包(Custom Package),使用git等版本控制工具来管理每个包的内容。

什么是Package?

在Unity中,Package可以理解为装载资源或功能的容器,可以包含如脚本、代码库、纹理、网格、动画等各种资源文件。项目中的包通过Package Manager统一管理,便捷高效。

Unity原生的许多功能集合就是以包的形式存在于项目中的,如渲染管线的核心包RP Core和管线的具体实现URP和HDRP,新版Input System,DOTS的相关功能等等,可以按需引入或移除。同样,用户也可以定义自己的Package,来实现功能或资源文件的模块化管理,这就是Custom Package。

创建一个Custom Package

Unity包本身并不能直接被打开或创建,在包的开发过程中,我们需要一个项目来作为开发的环境。在项目中创建包有两种具体做法,分别是内嵌包(Embedded Package)和本地包(Local Package),两种方法区别不是很大,这里以内嵌包为例:

第一步,给包起名字。 这里的名字是指标识符,而非在Package Manager中看到的包的标题。其命名规范与Java的包名类似,采用 顶级域名.公司或机构名.产品名 的格式书写,如 com.example.my-package,允许使用的字符仅包括小写字母,数字,连字符(-),下划线(_)和句点(.),长度尽量不超过50个字符,否则在编辑器中无法正常显示。起好名字之后,在项目的 Packages 文件夹下新建一个名称与包名相同的文件夹,并在其中创建 package.json 用来存放包的描述信息。

第二步,填写package.json。 常用的字段如下,其中仅 nameversion 字段为必填项,其余均为可选字段:

字段名 字段描述 参考示例
name (必填)包名,即第一步中的标识符 com.example.my-package
displayName 在Manager里的显示名 My Custom Package
description 描述 A util package for creating assets
version (必填)包版本 1.0.0
unity 对应Unity版本(可用unityRelease字段具体到patch) 2018.3
author 作者。可以为单字符串或json对象 Someone [email protected] (https://example.com)

其它非必填字段请参阅官方文档

第三步,填充包内容。 Package内部的文件结构也有定义好的规范,官方推荐的文件结构如下:

<package-root>
  ├── package.json
  ├── README.md
  ├── CHANGELOG.md
  ├── LICENSE.md
  ├── Third Party Notices.md
  ├── Editor
  │   ├── <company-name>.<package-name>.Editor.asmdef
  │   └── EditorExample.cs
  ├── Runtime
  │   ├── <company-name>.<package-name>.asmdef
  │   └── RuntimeExample.cs
  ├── Tests
  │   ├── Editor
  │   │   ├── <company-name>.<package-name>.Editor.Tests.asmdef
  │   │   └── EditorExampleTest.cs
  │   └── Runtime
  │        ├── <company-name>.<package-name>.Tests.asmdef
  │        └── RuntimeExampleTest.cs
  ├── Samples~
  │        ├── SampleFolder
  │        └── ...
  └── Documentation~
       └── <package-name>.md

其中常用的文件和目录有:

文件或目录名 描述
package.json 包的描述信息,见第二步
README.md 与git仓库的REAME.md相同,包含了项目的介绍和基本信息等,便于使用者了解该Package
Editor 仅在Unity Editor中使用的资源,脚本,代码库等。不包含在构建出的可执行文件中
Runtime 游戏内用到的资源及代码
Tests 测试用文件,其内部也分为Runtime和Editor两类
Samples~ 示例文件及资源,注意此文件夹以"~"结尾
Documentation~ 文档资源,注意此文件夹以"~"结尾

其中,包含C#脚本的目录需要使用 Assembly Definition(.asmdef) 来定义其所属的库,一个 .asmdef 可以管辖与其同级的文件及与其同级的文件夹下的所有文件,详见文档。另外,对于以"~"结尾的目录,Unity不会为其与其内容生成 .meta 文件。其他目录下的文件则与在 Assets 目录下的文件相同,使用 .meta 文件来辅助追踪和标识。

使用git管理Custom Package

包的内容完成并测试通过后,进入 package.json 所在的目录并打开终端,按照常规流程建立git仓库,添加并提交更改,然后push到八爪猫上的远程仓库即可。引入和更新的时候也很方便,在Package Manager界面里点左上角的加号,选择 Add from git url...,输入八爪猫的仓库地址即可。不过这里要注意地址不是仓库八爪猫主页的地址,而是带有 .git 后缀的git仓库地址,不然会提示找不到仓库。

此外,与Unity内置包的版本控制不同,从git添加的Package会有一个hash值来标识其版本,而非仅通过 package.json 中定义的版本号来判断。也就是说,如果你更新了包的内容但没有改版本号,使用这个包的项目通过Package Manager也是能够发现这个差异并且更新包中的内容的。

标签:文件,git,自定义,package,模块化,Package,Unity,Editor
From: https://www.cnblogs.com/devbobcorn/p/17869445.html

相关文章

  • Unity DOTS系列之Filter Baking Output与Prefab In Baking核心分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面Baking核心机制,方便大家上手学习掌握UnityDOTS开发。今天给大家分享的Baking机制中的FilterBakingOutput与PrefabInBaking。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发......
  • Unity DOTS Baking System与Baking World
    最近DOTS终于发布了正式的版本,我们来分享一下DOTS里面Baking阶段,BakingSystem,BakingWorld的关键概念,方便大家上手学习掌握UnityDOTS开发。Unity在Baking也是基于ECS模式开发设计的,所以Baking的时候也会有BakingSystem与BakingWorld,把Baking出来的数据放到BakingWorld里面......
  • Unity DOTS System与SystemGroup概述
    最近DOTS终于发布了正式的版本,我们来分享以下DOTS里面System关键概念,方便大家上手学习掌握UnityDOTS开发。System是迭代计算与处理World中的Entity实体的ComponentData数据的逻辑代码。System对应的代码是运行在mainthread上的。World里面所有的System通过SystemGroup来进行......
  • Unity 最新DOTS系列之《Baking与Baker的详解》
    UnityDOTSBaking与Baker详解UnityDOTSBaking与Baker详解最近DOTS终于发布了正式的版本,我们来分享一下DOTS里面Baking与Baker的关键概念,方便大家上手学习掌握UnityDOTS开发。UnityDOTS开发模式,为了让大家在”创作”游戏的时候使用原来组件方式来编辑游戏场景与资源,同......
  • 1、自定义上传组件实现动态指定action
    1、增加ynamicAction:String2、修改constuploadImgUrl=ref(props.dynamicAction||import.meta.env.VITE_APP_BASE_API+"/common/upload");//上传的图片服务器地址<el-uploadmultiple:action="uploadImgUrl"3、父组件<el-form-itemlab......
  • Golang中如何自定义时间类型进行xml、json的序列化/反序列化
    在日常开发工作中,我们进行会遇到将struct序列化json字符串以及将json字符串反序列化为struct的场景,大家也对此十分熟悉。最近工作中,遇到了需要将struct序列化xml字符串以及将xml字符串反序列化为struct的场景,对于普通类型的字段,比如int、string等类型,直接......
  • 如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件
    ​ 某讯的手游保护系统用的都是一套,在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案,其中对Dll文件的保护介绍如下,“Dll加固混淆针对Unity游戏,对Dll模块的变量名、函数名、类名进行加密混淆处理,有效提高静态分析门槛”。 通过动态分析了它的保护......
  • 如何绕过某讯手游保护系统并从内存中获取Unity3D引擎的Dll文件
    ​ 某讯的手游保护系统用的都是一套,在其官宣的手游加固功能中有一项宣传是对比较热门的Unity3d引擎的手游保护方案,其中对Dll文件的保护介绍如下,“Dll加固混淆针对Unity游戏,对Dll模块的变量名、函数名、类名进行加密混淆处理,有效提高静态分析门槛”。 通过动态分析了它的保护......
  • Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)
    ​ Unity3D导出的apk进行混淆加固、保护与优化原理(防止反编译)目录 前言:准备资料:正文:1:打包一个带有签名的apk2:对包进行反编译3:使用ipaguard来对程序进行加固 前言:对于辛辛苦苦完成的apk程序被人轻易的反编译了,那就得不偿失了,这篇文章就是解决Unity打包出来的包进......
  • Unity 文字转语音 Microsoft Interop.SpeechLib使用
    需要提前做以下设置:Unity中需要设置:Editor->ProjectSettings->Player->OtherSettings->ApiCompatibilityLevel->选择.Net4.x系统需要提前下载中文语音包Win11可以在设置->时间和语言->语音中查看已下载的语音其中HuihuiYaoyaoKangkang为中文语音......