Unity编辑器效率革命:50个实用技巧从入门到精通

📅 2026/8/23 3:34:12
Unity编辑器效率革命:50个实用技巧从入门到精通
1. 从“能用”到“好用”Unity编辑器效率革命刚接触Unity那会儿我总觉得这编辑器有点“笨重”。新建一个脚本得在Project窗口里右键、选择、命名然后双击打开一个可能不太顺手的代码编辑器想快速定位场景里某个特定组件得在一堆GameObject里翻来覆去地找调整一个公共变量反复在Inspector和代码窗口之间切换。这些琐碎的操作每天要重复几十上百次累积起来就是巨大的时间黑洞。后来我发现Unity编辑器本身就是一个高度可定制、充满效率工具的平台只是很多开关和技巧默认是隐藏的或者没有被系统地告知初学者。掌握它们不是让你变成什么高级特效大师而是让你把宝贵的精力和时间从重复劳动中解放出来真正聚焦在创意和逻辑实现上。今天要聊的这50个技巧就是围绕这个核心目标展开的让你的Unity工作流从“能用”变得“好用”甚至“高效”。它们覆盖了编辑器布局、脚本编写、调试、资源管理、性能预览等方方面面每一个都是我或者身边朋友在实际项目中踩过坑、尝过甜头后总结出来的。无论你是刚下载完Unity对着空荡荡的界面发呆的新手还是已经做过一两个小Demo想要提升开发节奏的进阶学习者这里都有你能立刻用上并且能显著改善体验的“硬货”。2. 驾驭编辑器你的数字工作台定制指南很多人把Unity编辑器仅仅当作一个“运行游戏”的按钮和场景摆放的窗口这大大低估了它的潜力。把它想象成你的数字工作台台面布局、工具窗口、快捷键手势都可以按照你的工作习惯重新排列和定义这才是高效的第一步。2.1 布局Layout管理与自定义为不同工种准备专属桌面Unity默认提供了几种布局比如“Default”、“Tall”、“Wide”。但最实用的是创建你自己的专属布局。比如在做UI界面时我希望Scene视图、Game视图、Hierarchy和Inspector并排显示同时Console窗口不能碍事但又要能快速查看而在编写脚本或调整Shader时我希望Project窗口和Console窗口足够大Scene视图可以暂时缩小。操作很简单调整好各个窗口的位置和大小后点击窗口右上角的“Layout”下拉框选择“Save Layout...”给它起个直观的名字比如“UI设计模式”或“代码调试模式”。下次切换工作时一键切换整个工作环境。我通常会准备三到四个布局一个用于常规场景编辑一个专注于UI一个用于性能分析这时需要把Profiler、Frame Debugger窗口放到显眼位置还有一个纯净的“脚本编写”布局只保留Project和Console。注意自定义布局文件保存在本地如果你在多台电脑上工作记得备份这个文件。路径通常在C:\Users\[你的用户名]\AppData\Roaming\Unity\[Unity版本号]\Preferences\Layouts下。2.2 窗口Window的隐藏用法与快速召唤除了常见的窗口有几个被低估的利器“Search”窗口 (CtrlK)这是全局搜索的瑞士军刀。它不仅能搜资源文件名更能搜资源内的内容。比如你想找所有使用了“Rigidbody”组件的预制体Prefab直接搜“Rigidbody”就行。你还可以通过前缀限定搜索范围比如t:material Standard搜索所有使用了Standard着色器的材质球。“Package Manager”窗口不要只在需要时才打开。定期浏览官方和第三方包像“Unity Recorder”录制视频/GIF、“Burst Compiler”高性能数学计算、“Visual Effect Graph”视觉特效这些能极大扩展你的能力边界。对于初学者我强烈建议通过Package Manager安装“2D SpriteShape”和“Cinema Machine”一个强大的相机控制系统它们比手动写代码实现类似功能要快得多。“Inspector”的调试模式在Inspector右上角有一个下拉菜单默认是“Normal”。把它切换到“Debug”。这时你会看到组件所有私有变量和内部状态这在排查“为什么这个脚本没按我预想工作”时无比有用比如查看一个协程Coroutine是否真的在运行或者一个列表List里实际包含了什么元素。2.3 快捷键肌肉记忆告别鼠标点点点记住并熟练使用快捷键是效率提升最直接的一环。下面这些是我每天必用的核心组合核心导航F在Scene视图中聚焦Frame当前选中的物体。无论物体跑多远一键拉回视野中心。Shift F同上并且让视角跟随物体移动。做角色移动调试时尤其好用。Alt 鼠标左键绕当前焦点点旋转Scene视图。Alt 鼠标中键平移Scene视图。物体操作Ctrl/Cmd D复制Duplicate选中物体。这比复制粘贴快而且能保持父子关系。Ctrl/Cmd Shift N在Hierarchy中快速创建一个空的GameObject。Q, W, E, R, T分别切换手型工具、移动、旋转、缩放、矩形工具。记住这个顺序你的左手会感谢你。代码与搜索Ctrl/Cmd ‘快速打开最近编辑过的脚本。比去Project窗口找快十倍。Ctrl/Cmd Shift F全局替换。慎用但用时真能救命。Ctrl/Cmd .当你的光标停在一个未实现的接口名或者类名上时快速生成代码桩Stub。这是Visual Studio配合Unity插件的神技。一个私人习惯我会把最常用的操作比如“Clear Console”通过Unity的“Shortcuts Manager” (Edit - Shortcuts) 设置成自己顺手的快捷键比如Ctrl Shift C。把编辑器打造成你的形状。3. 脚本编写提速从第一行代码到智能提示写脚本是Unity开发的核心但也是最容易陷入低效操作的地方。从创建、编写到调试每一步都有优化空间。3.1 脚本模板改造告别重复性开头每次新建一个C#脚本开头都是那几句using UnityEngine;和一个空的Start()、Update()方法。如果你经常写某种特定类型的脚本比如单例管理器、数据容器可以修改模板。找到Unity的脚本模板文件路径通常类似[Unity安装路径]\Editor\Data\Resources\ScriptTemplates\81-C# Script-NewBehaviourScript.cs.txt。在修改前务必备份原文件你可以把模板改成这样using UnityEngine; #SCRIPTNAME# { // 在这里写下你的类说明 void Start() { // 初始化代码写在这里 } void Update() { // 每帧更新的代码写在这里 } // 添加你自己的方法 }更高级的用法是你可以创建多个模板文件比如82-C# Script-SingletonManager.cs.txt在里面预先写好一个单例模式的骨架。然后通过一些编辑器扩展脚本将这个模板添加到右键菜单中。对于初学者我建议先从熟悉默认模板开始等有了固定模式后再考虑自定义。3.2 Inspector可视化技巧让调试和配置一目了然让脚本变量在Inspector里友好地显示能节省大量调试时间。[Header(“”)]和[Space]这是最基础的整理工具。把一堆变量分组加上说明标题和间隔Inspector会清爽很多。public float moveSpeed; [Space(10)] [Header(Attack Settings)] public int attackDamage; public float attackRange;[Range(min, max)]对于一个数值比如音量大小0-1、敌人生成间隔1-10秒用这个特性可以将其变成一个滑动条避免输入错误值。[Range(0f, 1f)] public float volume 0.5f;[SerializeField]私有变量的艺术如果你有一个变量不想被其他类随便访问设为private但又想在Inspector中调整它就用[SerializeField]。这是封装性和调试便利性的完美结合。[SerializeField] private int maxHealth 100; // 在Inspector可见可调但其他脚本不能直接修改[Tooltip(“”)]鼠标悬停在变量上时显示一段说明文字。这对于团队协作或者时间久了回顾自己代码时非常有用。[Tooltip(玩家角色的移动速度单位米/秒)] public float speed 5.0f;3.3 常用代码片段Snippet与快速注释在Visual Studio或Rider中利用代码片段可以极速输入。比如在VS里输入prop然后按两下Tab就能快速生成一个属性Property。你可以自定义更复杂的片段。但更实用的是养成快速注释的习惯。不是指//这种单行注释而是使用///的三斜杠文档注释。在你写的公共方法或类上面输入///IDE会自动生成XML注释模板。填写后当你在其他代码里调用这个方法时鼠标悬停就能看到参数说明和功能描述像使用Unity自带API一样方便。/// summary /// 让角色向目标点移动。 /// /summary /// param nametargetPosition世界坐标系中的目标位置。/param /// param namespeed移动速度。/param /// returns如果移动到达返回true。/returns public bool MoveTo(Vector3 targetPosition, float speed) { // ... 实现代码 }3.4 利用Debug.Log的进阶玩法Debug.Log是新手最好的朋友但别只会用Debug.Log(“Hello”)。标记物体Debug.Log(message, gameObject)。第二个参数传入一个GameObject。这样当你在Console中点击这条日志时Unity会自动在Hierarchy中选中并聚焦这个物体。在追踪是哪个物体发出的日志时这个功能无敌。颜色和富文本Unity的Console支持简单的富文本。你可以让重要的错误信息更醒目。Debug.Log(colorred错误/color 玩家生命值不能为负数); Debug.Log(b重要事件/b 关卡加载完成。);条件编译[Conditional]你写了很多调试日志发布游戏时不想一个个删掉又怕影响性能用Conditional特性。using System.Diagnostics; public class MyDebug { [Conditional(UNITY_EDITOR)] public static void LogEditorOnly(object message) { Debug.Log(message); } }这样MyDebug.LogEditorOnly(“xxx”)只在编辑器模式下执行发布后自动被编译器忽略。4. 场景与资源管理告别混乱的Project窗口项目做到一半发现资源满天飞找个贴图要翻半天这是最常见的痛点。好的资源管理习惯从第一天就要养成。4.1 文件夹结构规范建立你的资源宪法不要把所有东西都扔在Assets根目录下。一个清晰的结构是团队协作和个人项目维护的基石。我推荐的核心结构如下Assets/ ├── _Project可选放项目设置、通用脚本等 ├── Art美术资源 │ ├── Textures │ ├── Materials │ ├── Models │ ├── Sprites │ └── UI ├── Audio │ ├── Music │ └── SFX ├── Prefabs预制体可以再分子文件夹如Characters, Props, UI ├── Scenes场景文件按关卡或功能分文件夹 │ ├── Level01 │ ├── Level02 │ └── System (如StartMenu, LoadingScreen) ├── Scripts脚本 │ ├── Runtime游戏运行时逻辑 │ │ ├── Characters │ │ ├── Managers游戏管理器、单例等 │ │ └── Systems战斗系统、对话系统等 │ └── Editor编辑器扩展脚本必须放在此文件夹或其子文件夹下 └── Settings存放ScriptableObject等配置文件关键技巧在Scripts文件夹下创建Editor文件夹。所有以Editor结尾的C#脚本或者使用了UnityEditor命名空间的脚本都必须放在名为Editor的文件夹内可以在不同层级有多个。否则在项目打包Build时这些脚本会因为依赖编辑器API而报错。4.2 预制体Prefab的高效使用与嵌套预制体是Unity的原子。但用好它不止是“创建预制体”那么简单。预制体模式Prefab Mode双击一个预制体资源会进入一个独立的编辑场景。在这里做的修改会应用到该预制体的所有实例上。这是编辑预制体本体最安全的方式避免在场景中误改实例。嵌套预制体Nested PrefabsUnity现在完全支持嵌套预制体。比如一个“汽车”预制体可以由“车轮”预制体四个实例、“车身”预制体、“引擎”预制体组合而成。修改“车轮”预制体所有使用该车轮的“汽车”都会自动更新。这极大地提升了复杂物体的复用性和维护性。预制体变体Prefab Variant当你需要一个和现有预制体大部分相同、只有少量属性不同的新预制体时比如“敌人A”和“更强壮的敌人A”不要直接复制。创建原预制体的一个“变体”Variant。变体会继承父预制体的所有属性你可以只覆盖需要修改的部分。父预制体更新时变体也会继承那些未被覆盖的更新。4.3 利用标签Tags、图层Layers和搜索Search进行高效筛选标签Tags用于逻辑分类。比如“Player”、“Enemy”、“Collectible”。在代码中通过GameObject.FindWithTag()或碰撞检测时使用CompareTag()来识别。标签列表是项目共享的要规划好避免随意添加。图层Layers主要用于物理碰撞Physics Collision和相机渲染Camera Culling。在Edit - Project Settings - Physics中可以设置不同图层之间是否碰撞。这是性能优化和逻辑控制的重要手段。比如你可以设置“UI”层不和任何其他层发生物理碰撞或者让“Enemy”层只和“Player”层碰撞。结合搜索在Hierarchy或Project窗口的搜索框你可以组合使用这些属性。例如在Hierarchy中搜索t:Enemy l:EnemyLayer可以找到所有打了“Enemy”标签并且位于“EnemyLayer”图层上的物体。搜索ref:*.prefab可以快速找到场景中所有预制体实例。4.4 资源导入设置Import Settings预设当你从网上下载一堆贴图或模型一个一个设置导入参数如纹理类型、压缩格式、模型缩放非常繁琐。使用**预设Preset**功能。首先手动配置好一个资源的导入设置在Inspector底部然后点击“Preset”按钮一个小书签图标选择“Save Current to Preset...”。给它起个名字比如“Standard Texture (RGB)”。以后对于任何同类型的资源你都可以在Project窗口中选中它们右键选择“Import Settings - Apply Preset - Standard Texture (RGB)”一键完成批量配置。对于模型、音频等资源同样适用。5. 调试与性能意识让问题无处遁形对于初学者最大的恐惧可能就是“游戏出错了但我不知道哪里错了”。掌握调试工具和建立性能意识能帮你快速定位问题并从一开始就写出更健壮的代码。5.1 Console窗口的过滤与日志管理Console窗口信息泛滥怎么办学会使用顶部的过滤按钮。Clear on Play勾选后每次点击播放之前的日志都会被清空。这能让你专注于本次运行的日志。Collapse勾选后相同的日志信息会被合并并显示一个计数。这对于那些在Update里每帧都打印的重复日志非常有用能避免刷屏。错误暂停Error Pause点击Console窗口右上角的三个点确保“Error Pause”是打开的。这样一旦有运行时错误Error或异常Exception游戏会自动在编辑器里暂停并定位到出错的那行代码。这是捕捉随机出现的运行时Bug的神器。5.2 使用断点Breakpoint进行逐行调试别再只用Debug.Log了在Visual Studio或JetBrains Rider中你可以直接在代码行号的左侧点击设置断点一个红点。然后以调试模式启动Unity在编辑器里按Play然后在VS/Rider里点击“Attach to Unity”或直接使用编辑器附带的“Open in External Editor”并启动调试。当游戏执行到断点所在行时程序会暂停你可以查看此时所有变量的值并逐行F10或逐过程F11执行代码观察程序流程。这是理解代码执行顺序、查找逻辑错误最强大的方法。一个常见问题有时断点打不上或者显示“断点当前不会被命中”。这通常是因为脚本的调试符号Debug Symbols没有正确加载。确保在Unity的Edit - Preferences - External Tools里外部脚本编辑器设置正确并且勾选了“Editor Attaching”相关选项。在VS中确保项目配置是“Debug”而不是“Release”。5.3 性能初探Profiler和Stats窗口不需要等到游戏卡顿才关心性能。从一开始就养成偶尔看一眼的习惯。Stats窗口在Game视图右上角点击“Stats”按钮。这里会显示当前帧的实时数据包括FPS帧率、CPU渲染时间、批处理次数Batches、顶点和三角面数等。这是一个快速的健康检查表。如果你的简单场景FPS都上不去那就要警惕了。Profiler窗口 (Ctrl7)这是性能分析的显微镜。点击播放后打开Profiler它会记录游戏运行每一帧的详细数据。切换到“CPU Usage”模块你可以看到每一帧CPU时间都花在了哪些函数上。通常Update、LateUpdate、渲染Camera.Render、物理Physics是消耗大头。如果你发现某个自定义脚本的Update耗时异常高那就是优化目标。给初学者的建议不要被Profiler里复杂的数据吓到。一开始你只需要关注两件事1.总体帧时间Frame Time是否在预算内比如保持60FPS意味着每帧要小于16.6ms。2. 找最耗时的那个条通常是黄色的点击它看看是哪个函数。很多时候性能问题就出在一两个不合理的操作上比如每帧都在FindGameObjectWithTag或者在Update里做复杂的物理检测。5.4 避免常见的性能陷阱知道工具后更要避免一些“性能杀手”写法在Update中调用Find、GetComponentGameObject.Find、GetComponent这类函数是比较耗时的。如果可能在Start或Awake中获取一次并缓存起来。// 避免这样 void Update() { GameObject player GameObject.Find(Player); // ... } // 应该这样 private GameObject player; void Start() { player GameObject.Find(Player); } void Update() { // 使用缓存的 player }滥用Debug.Log尤其是在Update中频繁打印日志即使在发布版本中被移除在编辑器模式下也会严重影响性能因为字符串拼接和输出本身有开销。使用前面提到的[Conditional]特性或自己封装一个日志类来控制。不合理的物理更新默认的物理更新频率Fixed Timestep是0.02秒50次/秒。对于不需要高精度物理的游戏可以在Project Settings - Time中适当调大这个值比如0.04秒能减少CPU负担。同时合理设置碰撞器的类型Box/Sphere比Mesh Collider高效得多。6. 扩展编辑器用脚本提升你的战斗力当你觉得某些重复操作很烦人时很可能Unity已经为你提供了用脚本自动化它的能力。写编辑器扩展脚本听起来高级但其实入门非常简单而且回报极高。6.1 创建自定义菜单项和快捷键最简单的编辑器扩展就是添加一个菜单项。在Assets/Scripts/Editor文件夹下必须是Editor文件夹创建一个C#脚本比如CustomMenuItems.cs。using UnityEditor; using UnityEngine; public class CustomMenuItems { // 添加一个菜单项快捷键是 CtrlShiftG (在Windows上) [MenuItem(MyTools/快速创建配置 %#g)] static void CreateConfig() { // 这里写你的逻辑比如创建一个ScriptableObject资产 Debug.Log(你点击了自定义菜单); } // 添加一个右键菜单项当在Project窗口选中资源时可用 [MenuItem(Assets/MyTools/处理选中资源)] static void ProcessSelectedAssets() { // 获取所有选中的资源 foreach (var obj in Selection.objects) { Debug.Log($处理资源: {obj.name}); } } // 验证方法可以控制菜单项是否可用灰色显示 [MenuItem(Assets/MyTools/处理选中资源, true)] static bool ValidateProcessSelectedAssets() { // 只有选中了东西时才可用 return Selection.objects.Length 0; } }%代表CtrlWindows或CmdMac#代表Shift代表Alt。[MenuItem(“路径/菜单名 快捷键”)]这个特性就是全部魔法。你可以用它来批量重命名资源、生成预设的项目结构、一键执行打包前的检查等等。6.2 自定义Inspector面板如果你写了一个复杂的脚本有很多参数默认的Inspector排列可能不够直观。你可以为这个脚本编写一个自定义的Inspector。using UnityEditor; using UnityEngine; // 你的组件脚本 public class MyComplexComponent : MonoBehaviour { public string characterName; public int level; public bool isBoss; // ... 很多其他字段 } // 对应的自定义Editor脚本必须放在Editor文件夹 [CustomEditor(typeof(MyComplexComponent))] public class MyComplexComponentEditor : Editor { public override void OnInspectorGUI() { // 绘制默认Inspector你也可以完全自定义 // DrawDefaultInspector(); // 获取目标对象 MyComplexComponent myTarget (MyComplexComponent)target; // 自定义绘制 EditorGUILayout.LabelField(角色信息, EditorStyles.boldLabel); myTarget.characterName EditorGUILayout.TextField(名字, myTarget.characterName); myTarget.level EditorGUILayout.IntField(等级, myTarget.level); EditorGUILayout.Space(); myTarget.isBoss EditorGUILayout.Toggle(是否是Boss, myTarget.isBoss); if (myTarget.isBoss) { // 只有当是Boss时才显示额外选项 EditorGUILayout.HelpBox(Boss单位会有特殊属性, MessageType.Info); // 这里可以绘制更多Boss专属字段... } // 添加一个按钮 if (GUILayout.Button(初始化角色)) { // 执行一些初始化操作 Debug.Log($初始化角色: {myTarget.characterName}); } } }这样你的组件在Inspector里看起来就更专业、更易用了。这对于制作工具给策划或美术同事使用特别有帮助。6.3 简单的资产后处理自动化资源导入如果你有一批图片需要统一设置为Sprite2D类型并生成网格或者一批模型需要统一应用某种材质可以写一个资产后处理器。using UnityEditor; using UnityEngine; public class TexturePostprocessor : AssetPostprocessor { void OnPreprocessTexture() { // 获取当前正在导入的纹理的导入器 TextureImporter importer assetImporter as TextureImporter; if (importer ! null) { // 如果纹理放在 Assets/Art/Sprites 文件夹下自动设置为Sprite string lowerCaseAssetPath importer.assetPath.ToLower(); if (lowerCaseAssetPath.Contains(/art/sprites/)) { importer.textureType TextureImporterType.Sprite; importer.mipmapEnabled false; // Sprite通常不需要Mipmap // 可以设置更多参数如压缩格式、最大尺寸等 // importer.maxTextureSize 1024; } } } }把这个脚本放在任意Editor文件夹下它就会自动生效。以后你拖入Assets/Art/Sprites的图片都会自动被设置为Sprite类型无需手动操作。7. 构建与发布前的 checklist当你完成开发准备打包Build游戏时以下这些检查点能帮你避免最后时刻的崩溃和尴尬。7.1 场景管理确保构建列表正确在File - Build Settings中“Scenes In Build”列表里的场景顺序就是游戏加载的顺序。第一个场景通常是启动画面或主菜单。务必检查所有需要打包的场景都已经被添加进来可以拖拽场景文件到列表里。场景的顺序是正确的。没有误添加测试用的、空的或未完成的场景。一个技巧是在编辑器里你可以打开Window - General - Scene窗口将常用的场景拖放到这里方便快速切换。但这和构建列表是两回事。7.2 玩家设置Player Settings关键项在Build Settings窗口点击“Player Settings...”会打开项目设置。公司名和产品名这将是你的应用名称。默认图标准备一个尺寸合适的图标推荐1024x1024 PNG。分辨率与展示对于PC游戏通常选择“Fullscreen Window”以获得更好的体验。可以取消勾选“Default Is Full Screen”让玩家自己决定。脚本后端Scripting Backend对于新项目建议使用IL2CPP而不是Mono。IL2CPP能提供更好的性能和安全性尤其是对于发布到移动端或需要防反编译的情况。但注意IL2CPP的构建时间更长。API兼容级别保持为“.NET Standard 2.1”或“.NET 4.x”通常是个安全的选择确保大部分库的兼容性。压缩方式Compression Method对于PC默认的LZ4或LZ4HC是不错的选择在压缩率和加载速度间取得平衡。7.3 清理未使用的资产与构建大小优化在构建之前进行一次构建并查看构建报告是很好的习惯。在Build Settings中点击“Build”时选择一个输出文件夹。构建完成后Unity会生成一个buildreport文件通常在同级目录下。用文本编辑器打开或者有第三方工具可以解析。更直观的方法是在构建时勾选“Build Settings”窗口底部的“Development Build”和“Autoconnect Profiler”。然后点击“Build And Run”。游戏启动后打开Profiler (Ctrl7)切换到“Memory”模块选择“Detailed”视图。在这里你可以看到纹理、网格、音频等各类资源占用的具体内存。检查是否有意外打入包体的、巨大的未使用资源。对于移动端构建大小至关重要。除了检查内存还可以在Player Settings - Publishing Settings中启用“Split Application Binary”等技术来减小初始安装包体积。7.4 最后的测试在目标平台运行永远不要假设在Unity编辑器里运行正常打包后就一定正常。一定要在目标平台比如打出一个PC包在自己的电脑上运行或者连接到真机测试移动端版本上进行一次完整的冒烟测试。检查输入键盘、鼠标、手柄、触摸是否正常响应。所有场景是否能正确加载和切换。音频是否播放正常。游戏逻辑是否和编辑器里一致有时因为帧率或时间尺度不同会导致物理或动画表现差异。退出游戏逻辑是否正常特别是移动端要处理好回到桌面或锁屏的情况。这50个技巧从编辑器操作到脚本编写从资源管理到性能调试再到最后的打包发布覆盖了一个Unity初学者从入门到做出第一个可发布作品过程中最可能遇到效率瓶颈的各个角落。它们不是深奥的理论而是即学即用的“生产力工具”。我的建议是不要试图一次性全部记住。可以先从最困扰你的两三个点开始实践比如定制一个编辑器布局或者学会使用[SerializeField]和[Range]。当你熟练运用这些技巧并感受到它们带来的流畅感后你会自然而然地想去探索更多。Unity是一个庞大的生态系统但通往高效开发的道路正是由这些看似微小的技巧一块块铺就的。最重要的是养成一种意识当你觉得某个操作重复、繁琐时停下来想一想Unity是否提供了更快捷的方式我能否用脚本让它自动化这种不断优化工作流的思维才是伴随你整个开发生涯的真正财富。