news 2026/10/1 21:47:06

Unity 新手避坑指南:从工程规范到删除云端项目完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity 新手避坑指南:从工程规范到删除云端项目完整流程

0. 先把话说明白:为什么新手第一课往往不是写代码

刚接触 Unity 的人,十个里有八个第一周就卡在跟"写游戏"没什么关系的事情上:装了两三个版本互相打架、项目文件夹挪了个位置结果所有引用全丢、Hub 里删了项目以为万事大吉结果云端还挂着一堆构建任务在烧额度。我自己当年也是这么过来的,把编辑器装到带中文和空格的路径下,然后花了整整一个下午排查资源导入失败的问题,最后发现只是路径里多了一个空格。

这篇东西想聊两件事。前半段是 Unity 初学阶段真正该先立住的规矩,包括版本选择、项目目录的边界、脚本生命周期的常识、性能意识从第一天怎么培养;后半段是很多人问过的"云端项目怎么删",也就是 Unity 云端项目(Cloud Project)、配套仓库和构建目标的完整清理流程。关键词就三个:Unity、云端项目、删除云端项目,前两个贯穿全文,最后一个集中在第 3、第 4 章。

适合谁看:完全零基础、刚下载完 Unity Hub 准备开第一个工程的人;做了一两个月 Demo 但项目结构一团乱、想回头补基础的人;以及手上攒了一堆试验性云端项目、想彻底清理掉的人。不需要任何前置知识,但我假设你至少打开过一次编辑器,知道 Assets 面板长什么样。

先说一个反常识的结论:Unity 初学阶段最值钱的能力不是写脚本,而是"知道什么东西可以删、什么东西删了就回不来"。云端项目这块尤其典型,Hub 列表里的删除按钮和真正的删除完全是两码事,搞混一次,可能就要重建整个工程的版本历史。

1. Unity 初学阶段最该先立住的五条规矩

1.1 版本选择的逻辑:为什么我建议新手一律从 LTS 起步

Unity 的版本线大致分成两类:LTS(长期支持)和技术预览/正式新版本。新版本号看起来诱人,功能最新,教程视频也多是拿最新版录的。但我给新手的建议非常明确——除非你明确要用某个只有新版才有的特性,否则一律从当前 LTS 起步。

理由有三层。第一层是教程适配,网上大部分成熟的中文教程、插件、开源工程都围绕 LTS 打磨过,你跟着做不容易撞上"这个 API 在新版被改名了"这类破事。第二层是插件生态,很多 Asset Store 资源包的兼容区间写的是某几个 LTS 版本,新版装上去会报一堆编译错误,而新手往往分不清是插件的问题还是自己的问题。第三层是回滚成本,LTS 的补丁版本之间升级基本平滑,而跨大版本升级经常会触发 API 更新向导(API Updater),改完一堆脚本之后你自己都不知道改了什么。

这里有个非常具体的操作建议:同时只保留两个版本。一个是主力的 LTS,用来做正经项目;另一个是当前最新稳定版,用来尝鲜和看新特性。装三四个版本之后,Hub 里到处都是同名工程,你会记不清哪个工程是用哪个版本建的,打开时弹出升级提示,手一抖点了确认,工程就再也回不去了。

1.2 安装路径和模块勾选:两个看起来无关紧要、实际天天坑人的点

安装路径这件事,我踩过的坑足够写一整页。核心原则就一句:全英文、无空格、尽量短,最好放在 SSD 上。像D:\Unity\Hub和D:\Unity\Projects这种结构是最省心的。中文路径、带空格的路径、放在 OneDrive 同步目录下的路径,这三类都容易引发资源导入异常、构建失败、缓存错乱之类的玄学问题,而且报错信息往往跟真实原因差得很远,新手根本没往路径上想。

至于模块(Module)勾选,很多人装的时候一顿全选,结果硬盘被吃掉六十个 G。实际按需勾:

模块什么时候需要备注
Windows Build Support (IL2CPP)出 Windows 包默认只有 Mono,需要额外勾
Android Build Support手机、XR 设备开发要连带勾 OpenJDK、SDK、NDK
WebGL Build Support发布网页版包体大,构建慢,吃内存
iOS Build Support出 iOS 包还需要一台 Mac 做最终构建
Documentation想离线查 API体积不小,网速好的话可以不装

Android 那一行特别说明一下:必须把 OpenJDK、Android SDK、NDK 三个子项一起勾上,让 Unity 自己管理。不要图省事去用系统里已经装好的那一套,版本对不上时的报错会让你怀疑人生。做 XR 设备开发(比如 PICO 4 这类一体机)的同学,走的就是 Android 这条链,另外还要在 Package Manager 里装 XR 相关的包,这是另一个话题了。

1.3 项目目录的边界:哪些文件夹能删,哪些碰都不能碰

这是新手最容易出事的地方。一个 Unity 工程根目录下的东西大致分两类,我按"能不能进版本管理"来分类,比按功能分类实用得多:

绝对不能删、必须进版本管理的:Assets、Packages、ProjectSettings。这三个文件夹是你工程的真正本体。Assets里是资源和脚本,Packages里是依赖清单,ProjectSettings里是项目设置。丢了任何一个,工程基本等于重建。

可以随便删、会自动重建的:Library、Temp、obj、Logs、UserSettings。Library是导入缓存,删掉之后重新打开工程会全量重新导入一遍,耗时但无害。这也是为什么工程"莫名其妙坏了"的时候,第一步永远是关掉 Unity、删掉Library、重新打开——能解决相当大比例的诡异问题。

不能手动挪动的:Assets里面那些.meta文件。每个资源旁边都有一个同名的 meta 文件,里面存着 GUID 和导入设置。你在文件管理器里剪切粘贴资源、或者删掉 meta 文件,Unity 就会认为这是一个新资源,所有引用它的预制体、场景、材质全部变成 Missing。所有资源的移动、改名、删除,一律在 Unity 的 Project 窗口里做,这个习惯从第一天就要养成。

提示:在文件管理器里操作 Assets 目录是 Unity 新手最高频的"自毁行为",没有之一。哪怕你只是想给文件夹改个名,也请在编辑器里改。

1.4 第一天就配好版本管理,别等出事再补

我见过太多人第一个 Demo 做完才想起来要备份,这时候想回溯一个"昨天还能跑今天跑不了"的改动,已经没机会了。所以我的建议是:新建工程的第一件事,是配好 Force Text 序列化和 .gitignore,第二件事是提交一次。

Force Text 在 Edit → Project Settings → Editor → Asset Serialization 里,改成 Force Text。默认的 Mixed 模式会让部分资源存成二进制,Git 根本没法做差异对比,冲突了只能二选一,非常痛苦。

.gitignore至少要包含下面这些:

[Ll]ibrary/ [Tt]emp/ [Oo]bj/ [Bb]uild/ [Bb]uilds/ [Ll]ogs/ [Uu]serSettings/ .vs/ .idea/ *.csproj *.sln *.user

注意我没有把Assets、Packages、ProjectSettings放进去,它们是必须提交的。另外.meta文件也必须提交,别听某些教程说"meta 是自动生成的不用管",那是不对的。

1.5 编辑器里的一个隐藏开关:先保存场景再运行

顺手提一个救过无数人的设置。Unity 默认允许你在场景没保存的情况下点播放,运行结束之后改动会全部丢掉。新手经常遇到"我明明调好了,一停就变回去了"的困惑,就是这个原因。

在 Edit → Project Settings → Editor 里找到"Enter Play Mode Options",或者更简单粗暴的做法——养成一个肌肉记忆:每次点播放键之前先按 Ctrl+S。同样的道理也适用于预制体的编辑,在预制体编辑模式里改完一定要点一下返回箭头,不然改动可能没被应用。

2. 脚本与场景阶段:新手最常撞上的三类问题

2.1 生命周期搞不清,就会出现"为啥我的变量是空的"

MonoBehaviour 的生命周期顺序,新手至少要记住这几个主干:Awake→OnEnable→Start→ 每帧的Update→ 每帧固定步长的FixedUpdate→ 每帧最后的LateUpdate→OnDisable→OnDestroy。

为什么顺序重要?举两个最典型的场景。第一,如果你在Awake里访问另一个脚本的公开变量,而那个变量是在对方Start里赋值的,你拿到的就是 null,然后报 NullReferenceException。第二,摄像机跟随必须写在LateUpdate里,因为角色的位置在Update里改完之后,LateUpdate才执行,摄像机跟的位置才是这一帧最终的位置;写在Update里就会出现摄像机和角色轻微抖动,跑得越快抖得越明显。

FixedUpdate和Update的区别也值得说清:所有物理相关的操作(Rigidbody 的力、速度、射线检测的时序敏感部分)写在FixedUpdate,因为物理引擎是按固定步长推进的,默认 0.02 秒一次。而输入读取、动画触发、UI 逻辑这些写在Update。

还有一个新手高频问题:同一个脚本被挂了两次。表现是Update里的逻辑跑了两遍,比如伤害翻倍、物体位移速度变成两倍。遇到"效果好像乘以了 N"的情况,先检查 Hierarchy 里是不是同一个组件挂了多个实例。

2.2 获取组件的三种写法,性能和可读性差得很远

新手最常写的代码大概长这样:

void Update() { GetComponent<Rigidbody>().AddForce(Vector3.up); GameObject.Find("Player").transform.position = Vector3.zero; }

这段代码能跑,但问题不小。GetComponent内部要做一次组件查找,放在Update里等于每帧查一次;GameObject.Find更狠,它要遍历整个场景的层级,是 Unity 里出了名的慢操作。正确做法是在Awake或Start里查一次然后缓存到字段:

private Rigidbody _rb; private Transform _playerTf; void Awake() { _rb = GetComponent<Rigidbody>(); } void Start() { _playerTf = GameObject.Find("Player").transform; } void Update() { _rb.AddForce(Vector3.up); _playerTf.position = Vector3.zero; }

如果不想用Find,最稳的做法是给字段加[SerializeField],然后直接在 Inspector 里拖引用。这样既不依赖名字(改名不会断),也不依赖层级路径,还能在编辑器里一眼看出引用有没有丢。

2.3 性能意识从第一批资源开始培养,别等卡了再优化

很多人觉得性能优化是进阶话题,跟新手无关。我的看法相反:优化不是让你一开始就写极致代码,而是让你别养成必然要返工的习惯。几个从第一天就该注意的点:

UI 的显示隐藏方式。这个问题在社区被讨论过无数次:SetActive(false)、改localScale、还是把 UI 移出摄像机范围?结论是分场景的。SetActive(false)会让整个 GameObject 从渲染和逻辑里彻底移除,最省资源,但每次开关会触发一次层级变化和组件的OnEnable/OnDisable,如果你在Update里频繁开关它,反而更贵。localScale = Vector3.zero保留了对象,但渲染器还会参与剔除计算,实际上并不省多少。移出相机范围是最"取巧"的做法,对象还在跑逻辑,只是看不见。

我的经验是:低频开关(打开背包、切换面板)用 SetActive,高频开关(每帧闪烁的效果)才考虑改 localScale 或调 CanvasGroup 的 alpha。真正需要连续的显隐过渡,用 CanvasGroup 的alpha+blocksRaycasts+interactable三件套,比反复 SetActive 平滑得多。

按钮点不中的问题。这也是新手非常高频的困惑——明明按钮就在那儿,点击却没反应。常见原因有四个:一是按钮上层的某个透明 Image 把射线挡住了,它的 Raycast Target 没关;二是按钮本身的 RectTransform 太小,文字溢出到了外面但点击区域只有那一个小方块;三是 Canvas 上没有 Graphic Raycaster 组件,或者场景里没有 EventSystem;四是点了但被别的 canvas 以更高的 Sorting Order 盖住了。

放大点击范围最干净的做法是在按钮下面加一个透明的 Image 作为命中区域,把它的 Color 的 alpha 设成 0,保留 Raycast Target,然后把这个 Image 的 RectTransform 拉大到你想要的范围。相比直接放大按钮本身,这种做法不会影响视觉布局,也不会被 Layout Group 重新算回去。做背包拖拽那种交互时,思路也是一样的:实现IBeginDragHandler、IDragHandler、IEndDragHandler三个接口,拖动时把CanvasGroup.blocksRaycasts设成 false 让射线穿过被拖物体,松手时再设回 true,否则永远检测不到"放到了哪个格子里"。

Draw Call 和合批的直觉。你不需要现在就学会看 Frame Debugger,但要知道两件事:同一个材质、同一个图集的物体更容易被合批;场景里成百上千个独立材质的物体一定会卡。所以在做第一个场景时,草地、地砖、墙体这类重复元素尽量用同一个材质加不同 UV,而不是每块砖一个材质。

2.4 平台相关的小开关,早点知道少走弯路

有两个东西新手迟早会碰到。一个是宏定义(Scripting Define Symbols),在 Player Settings → Other Settings 里。它的用处是让不同平台走不同代码分支,比如只在编辑器里打印日志、只在 Android 上调用某个原生能力。常用的内置宏有UNITY_EDITOR、UNITY_ANDROID、UNITY_IOS、UNITY_WEBGL,写起来很直观:

#if UNITY_EDITOR Debug.Log("只在编辑器里生效"); #endif

另一个是分辨率适配。Canvas Scaler 的 UI Scale Mode 选 Scale With Screen Size,Reference Resolution 填你的设计稿尺寸(常见 1920x1080),Match 值横屏项目往 Width 偏、竖屏往 Height 偏。Player Settings 里的 Default Screen Width/Height 只决定打包后启动时的初始窗口大小,不影响适配逻辑,这两个概念别搞混。

顺便说一个坑:构建出来的GameAssembly.dll是 IL2CPP 后端的运行时产物,属于构建输出,千万不要把它拖进 Assets 目录。它跟工程本身没有关系,放进去只会让工程变大、打包时多一份无用资源。同理,构建输出目录(Build/Builds)也应该排除在版本管理之外。

3. Unity 云端项目到底是个什么东西

3.1 云端项目、仓库、构建任务,是三层不同的东西

很多新手把"云端项目"当成一个整体,其实它至少包含三层:

第一层是项目本体。你在 Unity Hub 的 Projects 页面里能看到一个 Cloud 分区,里面列的就是你账号下关联的云端项目。它本质上是一个项目容器,记录了项目名称、所属组织、成员权限、关联的仓库地址等等。

第二层是版本控制仓库。云端项目通常会绑定一个 Unity Version Control(原来的名字叫 Plastic SCM)仓库,你的提交记录、分支、变更集都在这里。仓库可以是空的,也可以有几百个变更集。

第三层是构建目标(Build Target)和构建历史。如果你开过 Build Automation,云端会按你配置的目标平台定期拉代码、跑构建、产出安装包。这一层是最容易被忽略的——构建任务会持续消耗你的额度,删了项目本体但没管构建目标,额度照样烧。

把这三层分清楚,"删除云端项目"这个操作才有意义。因为你会发现,Hub 上那个删除按钮、网页控制台上的删除按钮,管的是不同的层。

3.2 什么情况下才真的需要删云端项目

不是所有"看着碍眼"的云端项目都值得删。我按处理成本从低到高排一下:

只是不想在 Hub 里看到它。这种情况不要删,只要把 Hub 里同步到本地的云端项目移除列表就行,云端一切照旧。

只是网页控制台里列表太长。可以先归档(Archive),归档后不在活跃列表里显示,但数据和仓库都还在,需要的时候能恢复。这是最稳妥的选择。

试验性质的项目,做完就废弃。这种才是真正适合删的。删之前确认:没有还需要的提交记录、没有挂在里面的构建任务、没有别人还在协作。如果是团队项目,删除前一定要跟成员打招呼。

额度快用完了,想清一批。这时候重点不是删项目,而是先关掉所有构建目标和自动构建计划。构建不是白跑的,关掉之后额度立刻就不烧了,项目本身留着也不占多少。

我自己的习惯是:试验项目一律先归档,过一两个月确认完全用不到再删。删除有恢复期,但恢复期过了就真的没了,多等两个月的成本远低于误删一个还有用的仓库。

3.3 删除前的检查清单

在你点下任何一个删除按钮之前,把这几条过一遍:

  • 本地是不是有完整的工程副本?没有的话先完整复制一份到另一个目录。
  • 本地工程的版本控制是不是已经断开?还连着的话,删除云端仓库后本地会一直弹登录窗口。
  • 有没有别的成员在这个项目里?有的话先确认。
  • 有没有正在跑的构建任务?去 Build Automation 页面看一眼。
  • 有没有关联的付费额度或者席位?删之前把席位释放掉。
  • 项目名称和 ID 记下来了吗?如果你打算以后重建一个同名项目,记下 ID 能帮你区分。

注意:删除是不可逆操作的最后一步。Unity 云端项目删除后通常有一段恢复窗口,窗口期内可以在控制台里恢复,超过窗口期就找不回来了。具体天数随官方策略调整,别把恢复期当成保险。

4. 最新版 Unity 里删除云端项目的完整实操

4.1 Hub 里的操作:分清"移除列表"和"删除项目"

打开 Unity Hub,左侧切到 Projects,找到 Cloud 分类。在较新的 Hub 版本里,项目卡片右上角有一个三点菜单,展开之后会看到类似 "Remove from list" 和 "Open in Cloud Dashboard" 之类的选项。

关键就在这里:"Remove from list" 只是把这条记录从你本机 Hub 的列表里去掉,云端项目、仓库、构建全部原封不动。下次你在网页控制台里登录,它还在那儿;如果你在 Hub 里重新同步云端项目,它又会出现。很多人以为点了这个就是删了,然后过几天发现额度还在降,一脸懵。

所以正确的姿势是:Hub 只用来做"清理本机列表"这件事,真正的删除去网页控制台。如果你在 Hub 的菜单里确实看到了带删除语义的选项(不同版本命名不一样,有的叫 Delete,有的叫 Remove project),点它的时候也留意一下弹窗里的文字描述,它会告诉你这是本地移除还是云端删除。看弹窗描述,不要凭按钮名字猜。

4.2 网页控制台:真正的删除在这里

真正的删除流程走浏览器。整体路径大致是这样(界面随版本变化,但层级逻辑是稳定的):

  1. 用你的账号登录 Unity Cloud 控制台。
  2. 顶部或左侧切换到你要操作的组织(Organization)。注意这一步很关键,如果你有多个组织,在错的组织里找半天也找不到项目。
  3. 进入 Projects 列表,找到目标项目,点进去。
  4. 在项目的 General / Settings 页面里,往下翻到底部,会有一个危险操作区域(Danger Zone 或类似命名)。
  5. 点击 Delete project,系统一般会让你手动输入项目名称来二次确认。
  6. 确认后项目进入删除状态,在恢复窗口期内可以在控制台的已删除列表里找到并恢复。

权限问题值得单独说一句:如果这个区域里没有删除按钮,或者按钮是灰的,八成是你的角色权限不够。云端项目的删除一般需要组织所有者(Owner)或具备管理权限的角色。如果你只是被邀请进来的成员,看不到删除入口是正常的,需要找项目创建者操作。

4.3 顺手清理仓库和构建目标,这一步最容易被漏掉

删完项目本体,别急着关页面。回到组织层面的菜单,检查两处:

第一处是版本控制仓库。在组织的版本控制/仓库列表里,看看还有没有跟这个项目同名的仓库残留。有些情况下项目删了,仓库还独立存在,尤其是你当初手动创建仓库再关联到项目的那种。

第二处是构建目标(Build Targets)。在 Build Automation 里,看看有没有属于这个项目的构建配置。构建配置会按计划自动触发,只要它还在,就会消耗你的构建时长额度。我见过有人删了项目本体,但构建配置还挂在组织上,每个晚上自动跑一次,最后额度莫名其妙就没了。

另外还有一个不太显眼的东西:团队成员席位。如果这个项目是你唯一的项目,删完之后可以考虑把不需要的席位释放掉,这直接影响账单。

4.4 用 REST API 批量清理(适合攒了几十个试验项目的情况)

Hub 和网页控制台适合删一两个,如果你攒了几十上百个试验项目,一个个点会点到手软。这种情况可以走 Unity Cloud 的 REST API。

整体思路分两步:先拿一个服务账号的凭据(在组织的 Service Accounts 里创建,给它项目管理的权限),再带着这个凭据去调删除接口。模板长这样,具体路径和参数请以官方最新的 API 文档为准,接口版本迭代比较频繁:

# 示意模板,端点路径随官方版本变化,务必查文档确认 curl -X DELETE \ -H "Authorization: Bearer <SERVICE_ACCOUNT_TOKEN>" \ -H "Content-Type: application/json" \ "https://<官方API域名>/v1/organizations/<ORG_ID>/projects/<PROJECT_ID>"

写脚本的时候有几个我踩过的坑值得分享。第一,先做一次 GET 列表,把要删的项目 ID 全部导出来存成文件,不要边查边删,中间断一次你就不知道删到哪儿了。第二,加限速,短时间发太多请求会被限流,建议每个请求之间至少间隔一秒。第三,先拿一个废弃项目试跑,确认接口行为和权限都对,再跑全量。第四,服务账号的密钥不要提交到 Git,用环境变量传。

还有个更保守的做法:不要真删,改成归档。如果 API 支持改项目状态的接口,把项目标成归档,效果上跟删掉差不多,但心里踏实。等你哪天确定不需要了,再统一下手删。

4.5 删完之后,本机上的残留怎么处理

云端删了,本地工程通常还在磁盘上,而且还能正常打开。这时候有两种处理方式。

如果你想继续用这个工程:打开 Unity Hub,用 "Add project from disk"(或 Open → Add project from disk)把本地目录重新加进来。加进来之后它就是一个纯粹的本地工程了,跟云端没有任何关系。如果之前是连着版本控制的,可能需要在编辑器里断开版本控制连接,或者在工程目录里清理掉相关的配置,否则 Unity 会一直尝试连接已经消失的远端。

如果你想彻底清掉:直接删本地目录。但注意,Unity 工程的Library目录可能有几 GB,删之前确认里面没有你忘了提交的改动。最稳的检查方式是打开工程看一眼场景能不能正常加载、控制台有没有报错。

还有一个隐藏残留是 Hub 里的缓存条目。云端项目删完之后,Hub 的列表里可能还留着一条打不开的记录,点刷新或者重新登录账号通常就消掉了。

5. 常见问题速查与踩坑记录

5.1 问题速查表

现象大概率原因处理方式
Hub 里删了,网页端还在只做了本地列表移除去网页控制台删项目本体
网页端删了,Hub 里还显示本地缓存未刷新重新登录账号或刷新列表
找不到删除入口权限不足找组织所有者操作
提示有构建任务在运行构建配置未清理先停用或删除构建目标
删完额度还在掉构建计划仍在触发检查 Build Automation 的定时配置
本地工程打不开了Library 缓存与版本不匹配删 Library 重新打开
控制台一堆 Missing 引用meta 文件被破坏或误删从版本管理回滚,别硬修
脚本效果翻倍同一组件挂了多次检查 Hierarchy 里的重复实例
按钮点不中射线被遮挡或区域太小关掉上层 Raycast Target,加透明命中区
摄像机跟随时抖动写在 Update 里改到 LateUpdate

5.2 三个我印象最深的坑

坑一:把 Hub 的移除当成了删除。这是我最想提醒的一条。当时我在整理账号里的试验项目,Hub 里一顿移除列表,干干净净,心情舒畅。两周后收到额度提醒,进去一看,那些"已删除"的项目全都活得好好的,还有一个每天定时跑构建。教训就是:任何删除操作,都要在源头(网页控制台)确认一次。

坑二:在文件管理器里整理资源。工程做到一半觉得 Assets 下面太乱,就在资源管理器里建文件夹、拖文件、改名字。回到 Unity,整个场景一片洋红,预制体上的引用全部丢失。原因是 meta 文件和资源文件的对应关系被破坏了。修复方式只能是从版本管理回滚,如果没有版本管理,那就只能一个个重新拖引用。从那之后我的原则是:Unity 工程里的任何文件操作,都在 Unity 里做。

坑三:用新版本打开老工程还顺手保存了。打开时弹了个升级提示,我想着升就升吧,点了确认,编辑器开始转换资源,转完之后一堆插件报错,回不去了。正确做法是:升级前先把整个工程目录复制一份出来,在副本上试。如果非要在原工程上升级,至少保证有一次可用的提交。

5.3 关于 WebGL 和一些平台特有的小提醒

如果你打算把工程发布成网页版,有两个细节新手特别容易卡住。一是压缩格式(Compression Format),构建出来的.wasm、.data这些文件如果服务器没有正确的 MIME 类型映射,浏览器会直接拒绝加载;部署到 IIS 这类服务器上的时候,需要手动给这些扩展名配上 application/wasm 之类的类型。二是 WebGL 对多线程和部分 API 有支持限制,某些插件在 WebGL 平台上直接用不了,选插件前先确认平台兼容性。

另外顺嘴提一句,构建产物目录不要放在Assets里面。有人图方便把 Build 输出到 Assets 下面的子目录,结果 Unity 把构建出的资源又当成工程资源导入一遍,工程体积暴涨、打包时间翻倍,而且每次构建都在跟自己的上一次产物较劲。

6. 最后分享几条我自己一直在用的习惯

第一,每个工程根目录放一个 README,写上用的 Unity 版本号、依赖的插件版本、启动场景名。三个月后你回来改这个工程,这三条信息能省你半小时。

第二,试验项目一律用带日期的命名,比如test_shader_20240315。这样你在云端控制台里一眼就能看出哪些是废案,批量清理的时候不用一个个点进去看。

第三,云端项目每季度清一次,流程固定:先在控制台看哪些超过 90 天没动过,能归档的归档,确定不要的先停构建、再删仓库、最后删项目,删完在本地留一份完整的工程备份压缩包。这套流程走下来,一次也就十几分钟,比年底攒一堆再手忙脚乱强太多。

第四,遇到"删不掉"的情况,先怀疑权限,再怀疑缓存,最后才怀疑是 Bug。云端的各类控制台界面状态更新有时候会滞后,刷新一下、退出重登一下,能解决的比想象中多。

第五,也是我最想强调的一条:在 Unity 里,所有"批量操作"之前先备份,所有"删除"之前先归档。这两句话听起来像废话,但我每次偷懒跳过它们的时候,基本都会付出几倍的时间代价。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 21:45:38

OWASP ZAP 从安装到实战:Web 漏洞扫描与自动化集成指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 21:44:33

Attention时序预测实战:从数据准备到部署避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 21:41:49

std::optional 完全指南:别再用 -1 和 nullptr 表达「没有值」

用 -1 表示「没找到」、用 nullptr 表示「没配置」&#xff0c;这类约定在 C 里活了几十年&#xff0c;代价是每个调用方都得记住「-1 是特殊值」并且每次都记得判断。C17 的 std::optional<T> 把这件事变成类型系统的一部分&#xff1a;函数的返回值类型直接写着「可能没…

作者头像 李华
网站建设 2026/10/1 21:41:33

基于Python与深度学习的垃圾分类系统源码实战:从训练到部署

简介&#xff1a;这是一套面向高校学生与初学者的垃圾分类深度学习实战项目源码&#xff0c;基于Python与主流深度学习框架实现&#xff0c;可直接用于毕业设计、期末大作业或课程设计场景。项目已通过教师指导与验收&#xff0c;属于高分完整方案&#xff0c;对零基础读者也较…

作者头像 李华
网站建设 2026/10/1 21:41:33

Work Agent长程任务深度解读:AI自主执行复杂工作的底层机制

AI的交互范式正在发生持续迁移。早期大模型只能完成单轮问答&#xff0c;用户给出一句指令&#xff0c;模型返回一段文本&#xff0c;任务在单次交互后便终止。随后多轮对话形态出现&#xff0c;AI可以记住上下文&#xff0c;在一轮轮对话里承接用户的补充要求&#xff0c;但整…

作者头像 李华