ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Unity新手入门:从核心概念到第一个可交互Demo的完整指南

Unity新手入门:从核心概念到第一个可交互Demo的完整指南 1. 项目概述从“初步了解”到“有效入门”“Unity 初步了解”这个标题听起来像是一个新手教程的起点但背后隐藏的其实是无数开发者从“安装完成”到“做出第一个可运行Demo”之间那段最迷茫、最容易放弃的时期。我见过太多朋友兴致勃勃地下载了Unity Hub创建了新项目面对那个默认的蓝色天空盒和孤零零的主摄像机瞬间就懵了“然后呢我该从哪里开始点第一下”这不仅仅是学习一个软件的操作而是进入一个全新的创作范式。Unity不是一个单纯的建模工具或代码编辑器它是一个实时内容创作引擎。理解这一点是“初步了解”阶段最关键的一步。这意味着你在这里所做的一切无论是拖拽一个立方体还是写一行Debug.Log其效果都是即时可见、可交互的。这种即时反馈是Unity最迷人的地方但也要求我们转变思维从“先规划再执行”的瀑布流思维转向“搭建-测试-迭代”的敏捷创作思维。所以这篇内容的目标读者就是那些刚刚打开Unity对着界面感到无从下手的绝对新手或者已经看过一些零散教程但未能形成系统认知的初学者。我将带你绕开那些华而不实的表面功能直接切入核心工作流让你在最短时间内建立起对Unity引擎运作逻辑的直观理解并能亲手搭建一个简单的、可交互的微型场景。这不是一份面面俱到的说明书而是一张为你标注了关键路径和陷阱的“新手村地图”。2. 核心概念拆解场景、游戏对象与组件在Unity里做任何事都绕不开三个最核心的概念场景Scene、游戏对象GameObject和组件Component。理解它们的关系就像理解“舞台、演员和技能”一样。2.1 场景你的整个世界舞台场景Scene是Unity中最顶级的容器它代表了一个完整的关卡、一个界面或者一个独立的测试环境。你可以把它想象成一个虚拟的舞台或一个电影片场。所有你看到、交互到的内容都存在于某个场景中。当你新建一个项目时Unity会自动创建一个名为“SampleScene”的默认场景里面包含一个主摄像机Main Camera和一个方向光Directional Light。注意养成好习惯立即将“SampleScene”改名并保存。我通常会用“MainMenu”、“Level_01”或“Test_Physics”这样有明确意义的名称。在Unity中未保存的场景名称旁边会有一个“*”号随时使用CtrlSWindows或CmdSMac保存场景能避免崩溃时功亏一篑。2.2 游戏对象舞台上的所有演员游戏对象GameObject是场景中所有实体的统称。它可以是任何东西一个角色、一把枪、一盏灯、一个看不见的触发器、甚至是一个空物体仅用于挂载脚本或组织层级。在Hierarchy层级窗口中你看到的所有条目都是游戏对象。游戏对象本身只是一个“空壳”它定义了“存在”和“变换”位置、旋转、缩放。它最初什么能力都没有就像一个没有任何技能的演员。2.3 组件赋予演员技能的剧本组件Component才是游戏对象的灵魂。你可以把组件理解为附加到游戏对象上的各种功能模块或“技能”。一个游戏对象通过添加不同的组件来获得不同的属性和能力。Transform组件这是每个游戏对象都自带的、不可删除的核心组件。它决定了对象在场景中的位置Position、旋转Rotation和缩放Scale。渲染类组件如Mesh Renderer网格渲染器用于显示3D模型、Sprite Renderer精灵渲染器用于显示2D图片。没有渲染组件物体在Game视图里就是隐形的。物理类组件如Rigidbody刚体让物体受物理引擎控制、Collider碰撞体定义物体的物理边界。脚本组件这是你编写自定义逻辑的地方。你可以创建C#脚本并将其作为组件挂载到游戏对象上从而控制对象的行为。它们的关系可以概括为场景包含游戏对象游戏对象由组件构成。你的大部分工作就是在场景中创建和排列游戏对象然后为它们添加和配置合适的组件。2.4 一个生动的类比制作一个会弹跳的球让我们通过一个具体例子来固化这个概念。目标是在场景中央创建一个会受重力下落并且碰到地面会弹跳的红色球体。创建演员游戏对象在Hierarchy窗口右键 - 3D Object - Sphere。一个名为“Sphere”的球体游戏对象就出现在了场景中和Hierarchy列表里。检查默认技能组件选中这个Sphere查看Inspector检视窗口。你会看到它已经自动附带了几个组件Transform决定它的位置。我们可以把它放在(0, 2, 0)即离地2米高。Mesh Filter告诉引擎“我这个对象长什么样”使用球体网格。Mesh Renderer负责把这个网格画出来。它下面有一个Materials属性默认使用一个白色材质。赋予物理技能添加组件为了让球有物理特性我们需要手动添加组件。在Inspector窗口最下方点击“Add Component”按钮。搜索并添加Rigidbody组件。现在这个球就受到了重力影响。如果你点击运行它会从空中坠落并穿过地面因为还没有碰撞。搜索并添加Sphere Collider组件。这是一个球形的碰撞体定义了球的物理边界。现在球下落时会与地面发生碰撞了。改变外观配置组件为了让球变成红色我们需要处理材质。一个简单的方法是在Project窗口右键 - Create - Material命名为“RedBallMat”。选中这个新材质在Inspector里点击Albedo漫反射旁边的色块将其改为红色。然后将这个材质球从Project窗口拖拽到Sphere对象的Mesh Renderer组件的Materials槽位中或者直接拖到场景里的球体上。球体瞬间变红。创建舞台和另一个演员地面用同样的方法创建一个Cube游戏对象重命名为“Ground”。通过Transform组件将其Scale修改为(10, 0.5, 10)它就变成了一个扁平厚实的地面。它也需要一个Box Collider组件来参与物理碰撞Cube默认已附带。现在点击运行按钮你会看到一个红色小球从空中落下砸在地面上然后弹跳几下最终静止。这个过程就是你通过组合游戏对象和组件在场景中创造交互逻辑的完整体现。3. 界面核心与基础工作流实操面对Unity复杂的界面新手很容易眼花缭乱。我们不需要一次性掌握所有面板只需聚焦最核心的五个窗口就能完成90%的基础工作。3.1 五大核心窗口详解Scene场景视图这是你的“导演监视器”。你可以在这里以任意角度观察和编辑你的3D或2D世界摆放物体、调整位置。操作快捷键务必牢记鼠标中键拖拽平移视图。Alt 鼠标左键拖拽围绕当前焦点旋转视图3D模式下极其常用。Alt 鼠标右键拖拽或滚动鼠标滚轮缩放视图。F键选中Hierarchy中的某个对象后按F可以快速将Scene视图聚焦到该物体上。Game游戏视图这是“最终成片”或“玩家屏幕”。它显示的是通过某个摄像机默认是Main Camera渲染出来的画面也就是游戏运行时的真实表现。你在这里看到的效果就是玩家将看到的效果。Hierarchy层级视图这是当前场景中所有游戏对象的“演员表”。它以树状结构显示对象的父子关系。父子关系是Unity组织场景的核心逻辑子对象会继承父对象的移动、旋转和缩放。例如你可以创建一个名为“Player”的空对象作为父级然后把表示身体的模型、表示武器的模型都拖拽成它的子级。这样移动“Player”所有部件会一起移动。Project项目视图这是你的“资源仓库”。它显示项目文件夹Assets目录中的所有文件脚本、模型、贴图、材质、音频、预制体等等。在这里进行的移动、重命名、删除操作会直接反映到磁盘文件上务必谨慎。Inspector检视视图这是你的“属性调整面板”。当你选中Hierarchy中的某个游戏对象或Project中的某个资源时Inspector会显示该物体所有可查看和编辑的属性和组件。你在这里修改参数比如Transform的坐标、光源的颜色强度、脚本的公开变量修改会立即生效。3.2 第一个可交互Demo创建可控角色让我们运用上述知识创建一个可以用键盘WSAD控制移动的立方体角色。准备舞台和演员新建一个场景保存为“FirstController”。创建一个Cube重命名为“Player”将其Transform的Position设为(0, 0.5, 0)。Y设为0.5是为了让立方体底部刚好贴地因为立方体默认高度为1中心点在几何中心。创建一个Plane或缩放后的Cube作为地面重命名为“Ground”。编写控制脚本创建组件在Project视图的Assets文件夹内右键 - Create - C# Script命名为“PlayerController”。双击这个脚本默认会用Visual Studio或Rider等编辑器打开。你会看到一个默认的类框架。删除Start和Update方法内的注释编写以下代码using UnityEngine; // 引入Unity引擎的核心命名空间 public class PlayerController : MonoBehaviour // 类名必须与文件名一致并继承MonoBehaviour { // 定义一个公开的浮点数变量用于控制移动速度可以在Inspector中调整 public float moveSpeed 5.0f; // Update方法在每一帧都会被调用是处理连续输入和更新的最佳位置 void Update() { // 1. 获取玩家输入 // Input.GetAxis(Horizontal) 返回一个-1到1之间的值代表水平方向A/D或左右箭头的输入强度 float moveX Input.GetAxis(Horizontal); // Input.GetAxis(Vertical) 返回一个-1到1之间的值代表垂直方向W/S或上下箭头的输入强度 float moveZ Input.GetAxis(Vertical); // 2. 根据输入和速度计算本帧应移动的方向向量 // Vector3.right 是 (1,0,0)乘以moveX表示X轴方向移动 // Vector3.forward 是 (0,0,1)乘以moveZ表示Z轴方向移动 // 在Unity的3D坐标系中X是左右Y是上下Z是前后。 Vector3 movement (Vector3.right * moveX Vector3.forward * moveZ) * moveSpeed * Time.deltaTime; // 3. 应用移动 // transform 代表此脚本所挂载的游戏对象的Transform组件 // Translate 方法按照给定的向量移动物体。Space.World表示在世界坐标系下移动更直观。 transform.Translate(movement, Space.World); } }挂载脚本并运行将编写好的PlayerController脚本从Project视图拖拽到Hierarchy视图中的“Player”对象上。此时Player的Inspector窗口中会出现PlayerController组件并且可以看到moveSpeed变量你可以在这里直接修改它的值比如改成8。点击Unity编辑器顶部的播放按钮或按CtrlP。Game视图将被激活。按下键盘的W、A、S、D键观察Scene和Game视图你会发现立方体“Player”已经可以前后左右移动了代码关键点解析MonoBehaviour所有挂载到游戏对象上的脚本都必须继承这个基类这样才能拥有Start、Update等生命周期方法。public float moveSpeed声明为public的变量会在Inspector中暴露出来允许你无需修改代码就能调整参数这是Unity非常强大的设计模式。Input.GetAxis(“Horizontal/Vertical”)Unity内置的输入管理器默认映射了键盘和手柄的输入返回平滑的模拟值。Time.deltaTime这是至关重要的一环。它表示上一帧到当前帧的时间间隔以秒为单位。将移动速度乘以Time.deltaTime可以使得移动速度与帧率解耦确保在任何帧率下30帧、60帧、144帧物体每秒钟移动的距离都是固定的从而避免帧率高时移动过快的问题。这被称为“帧率无关化”。4. 资源管理与预制体效率提升的关键当你场景中的物体越来越多或者同一个物体比如敌人、子弹、宝箱需要重复使用时手动复制和配置会变得极其低效且容易出错。这时就需要引入预制体Prefab的概念。4.1 什么是预制体预制体可以理解为一个可重复使用的游戏对象模板。你可以将配置好的游戏对象包括其所有组件和属性设置保存成一个“.prefab”文件。之后你可以像使用乐高积木一样将这个预制体无数次地拖入场景创建它的“实例”。所有实例都源自同一个模板。修改预制体资源本身所有场景中的实例都会同步更新除非某个实例的特定属性被“覆盖”。这是管理大量重复对象、保证一致性的黄金法则。4.2 创建与使用预制体以子弹为例假设我们要制作一个射击游戏子弹需要被频繁生成。创建子弹原型在场景中创建一个Sphere重命名为“Bullet”缩小到合适大小如Scale设为0.2。添加Rigidbody组件并勾选Is Kinematic开始我们先让其不受物理力影响用脚本控制。创建一个材质并赋予它黄色。新建一个C#脚本“Bullet”挂载上去先写一个简单的向前移动逻辑public class Bullet : MonoBehaviour { public float speed 20.0f; void Update() { transform.Translate(Vector3.forward * speed * Time.deltaTime); } }制作成预制体直接从Hierarchy窗口中将“Bullet”对象拖拽到Project视图的Assets文件夹下。你会看到Assets中多了一个蓝色的“Bullet.prefab”文件同时Hierarchy中的“Bullet”对象名字变成了蓝色。这表示它现在已经是一个预制体实例了。此时你可以安全地删除Hierarchy中的那个Bullet实例因为模板已经保存在Project里了。动态生成预制体实例实例化我们需要一个发射器。创建一个空对象命名为“Gun”放在Player旁边。创建一个新脚本“GunController”挂载给Gun。在脚本中我们需要一个公共变量来引用Bullet预制体资源并在按下按键时生成它。using UnityEngine; public class GunController : MonoBehaviour { // 在Inspector中将Bullet.prefab拖拽到这个变量槽里 public GameObject bulletPrefab; public Transform firePoint; // 一个子物体用来表示子弹生成的位置 void Update() { if (Input.GetKeyDown(KeyCode.Space)) // 按下空格键发射 { // 关键方法Instantiate // 参数1要实例化的预制体 // 参数2生成的位置firePoint的位置 // 参数3生成的旋转firePoint的旋转即枪口方向 Instantiate(bulletPrefab, firePoint.position, firePoint.rotation); } } }在Gun对象下创建一个空子对象命名为“FirePoint”将其位置调整到枪口例如放在Gun对象的正前方。选中Gun对象在Inspector中将Project里的“Bullet.prefab”拖拽到GunController脚本的bulletPrefab变量槽中。将“FirePoint”对象拖拽到firePoint变量槽中。运行游戏控制Player移动按空格键你将看到从FirePoint位置不断生成并向前飞行的子弹。实操心得预制体是Unity项目架构的基石。对于任何可能重复使用两次以上的物体都应考虑制作成预制体。这不仅提升效率更便于后期统一调整。例如你想修改所有子弹的伤害或颜色只需在Project中打开Bullet.prefab进行编辑场景中所有已发射和未来将发射的子弹都会自动更新。5. 物理与碰撞交互基础没有交互的世界是静止的图画。Unity内置了强大的物理引擎NVIDIA PhysX让物体间的碰撞、受力、关节连接等模拟变得非常简单。核心在于两类组件碰撞体Collider和刚体Rigidbody。5.1 碰撞体 vs 触发器碰撞体Collider定义了物体的物理形状用于进行实体的物理碰撞计算。当两个带有碰撞体的物体相遇物理引擎会阻止它们相互穿透并根据材质属性计算反弹、摩擦等。我们之前让球和地面弹跳用的就是碰撞体。常见类型Box Collider盒型Sphere Collider球型Capsule Collider胶囊型常用于角色Mesh Collider网格型形状精确但性能开销大慎用。触发器Trigger它是碰撞体的一种特殊状态。勾选碰撞体组件上的Is Trigger复选框该碰撞体就变成了触发器。触发器不会产生物理阻挡效果物体会直接穿过它。它的作用是当另一个碰撞体进入、停留或离开它的范围时会发送消息用于触发游戏逻辑比如拾取物品、进入下一个区域。// 这是一个挂在触发器物体上的脚本示例 public class ItemPickup : MonoBehaviour { // 当另一个碰撞体进入此触发器的范围时调用 void OnTriggerEnter(Collider other) { // 通常通过标签Tag来判断进入的是什么物体 if (other.CompareTag(Player)) { Debug.Log(玩家捡到了物品); Destroy(gameObject); // 销毁这个物品本身 } } }5.2 刚体物理运动的驱动者Rigidbody组件为游戏对象赋予了物理属性使其受到重力、阻力、扭矩的影响并能对其他碰撞体施加力。关键属性Mass质量。影响物体受力和碰撞后的运动状态。Drag阻力。空气阻力会减缓移动。Angular Drag角阻力。旋转阻力。Use Gravity是否受重力影响。Is Kinematic是否为运动学刚体。勾选后物体不受物理引擎的力控制但可以通过直接修改Transform来移动并且能影响其他非运动学刚体。常用于平台、移动的障碍物或者我们之前用脚本控制的子弹。5.3 物理交互实战推箱子游戏我们来创建一个简单的推箱子谜题综合运用物理和碰撞。搭建场景地面一个扁平的CubeScale为(10, 0.5, 10)。玩家一个Cube重命名为“Player”。添加Rigidbody组件并冻结其Y轴旋转在Rigidbody组件的Constraints里勾选Freeze Rotation Y防止玩家被撞翻。箱子一个Cube重命名为“Box”。添加Rigidbody组件将其Mass设置为5比玩家重难推。目标点创建一个扁平的圆柱体CylinderScale设为(0.8, 0.1, 0.8)赋予绿色材质重命名为“Target”。编写玩家移动脚本使用力之前的PlayerController是直接修改Transform这被称为“运动学移动”会穿透物理物体。现在我们要用物理方式移动。修改PlayerController脚本的Update方法public class PlayerController : MonoBehaviour { public float moveForce 10.0f; // 施加的力的大小 private Rigidbody rb; // 引用自身的刚体组件 void Start() { // 在Start中获取组件引用比在Update中每次获取更高效 rb GetComponentRigidbody(); } void Update() { float moveX Input.GetAxis(Horizontal); float moveZ Input.GetAxis(Vertical); // 创建一个方向向量 Vector3 movement new Vector3(moveX, 0.0f, moveZ); // 对刚体施加一个力ForceMode.Force表示使用持续的力 rb.AddForce(movement * moveForce); } }编写箱子与目标点检测脚本给“Target”目标点添加一个Box Collider并勾选Is Trigger。创建脚本“TargetTrigger”挂载给Targetpublic class TargetTrigger : MonoBehaviour { public GameObject box; // 将场景中的Box对象拖拽到这里 private bool isCompleted false; void OnTriggerEnter(Collider other) { // 如果进入触发器的是指定的箱子并且谜题未完成 if (!isCompleted other.gameObject box) { isCompleted true; Debug.Log(谜题完成箱子被推到了目标点); // 可以在这里触发后续事件比如开门、播放音效等 // 例如改变箱子颜色 box.GetComponentRenderer().material.color Color.green; } } void OnTriggerExit(Collider other) { if (other.gameObject box) { isCompleted false; Debug.Log(箱子离开了目标点。); box.GetComponentRenderer().material.color Color.white; } } }将Hierarchy中的“Box”对象拖拽到Target对象上TargetTrigger脚本的box变量槽中。运行游戏用WSAD控制玩家一个受物理控制的立方体去推动更重的箱子。当你把箱子推入绿色的目标区域时控制台会输出信息并且箱子会变成绿色。这就是一个最简单的物理交互谜题原型。6. 光影与材质初步视觉表现是游戏吸引人的第一要素。Unity的实时渲染管线让打造美观场景变得相对容易其核心是光源Light和材质Material。6.1 光源类型与应用在Hierarchy中右键 - Light可以看到几种光源Directional Light方向光像太阳光线是平行的从无限远处照射影响场景中的所有物体。通常用于模拟日光一个场景一般有一个作为主光源。Point Light点光源像灯泡从一个点向所有方向均匀发光有衰减范围。用于台灯、爆炸效果等。Spot Light聚光灯像手电筒或舞台聚光灯从一个点朝一个圆锥形方向发光。用于车灯、探照灯。Area Light区域光从一个矩形或圆形平面发光能产生非常柔和的阴影但通常只用于烘焙光照Baked Lightmap而非实时计算。新手建议初期主要使用Directional Light作为环境主光用Point Light和Spot Light在局部营造氛围。注意调整它们的Intensity强度、Range范围对点光源和聚光灯有效和Color颜色。6.2 材质与着色器材质Material决定了物体表面的视觉属性颜色、光滑度、金属感、纹理贴图等。而材质的表现规则是由着色器Shader定义的。你可以把着色器理解为一套“渲染算法”材质则是这套算法的具体参数配置。Unity提供了许多内置的标准着色器如Standard Standard (Specular setup)功能强大。创建一个具有金属质感的红色球体在Project中右键 - Create - Material命名为“MetalRed”。选中它在Inspector中将Albedo漫反射颜色设为暗红色。将Metallic金属度滑块拉到1完全金属。将Smoothness光滑度滑块拉到0.8非常光滑。将这个材质拖拽给场景中的一个球体。你会看到它变成了一个光滑的、能反射周围环境天空盒的金属红球。使用纹理贴图 纹理Texture是一张2D图片可以贴在模型表面提供细节。最常见的纹理是Albedo Map漫反射贴图即颜色图。准备一张砖墙图片.jpg或.png格式导入Unity直接拖入Project窗口。新建材质“BrickWall”。将砖墙纹理从Project拖拽到材质Inspector的Albedo贴图槽上或者点击旁边的小圆圈选择。将此材质赋予一个Cube你就能看到一个砖墙效果的立方体。注意事项Unity中材质的Metallic和Smoothness属性通常共用一张纹理的特定通道如蓝色通道存MetallicAlpha通道存Smoothness这被称为PBR基于物理的渲染工作流。对于初学者先从简单的颜色和滑块调整开始理解基础概念后再研究复杂的纹理制作。7. 动画系统入门让世界动起来动画是赋予游戏生命力的关键。Unity的动画系统Animation System主要涉及两个部分动画片段Animation Clip和动画控制器Animator Controller。7.1 创建简单的变换动画我们不需要复杂的3D角色先从让一个物体比如一个奖励物品原地旋转和上下浮动开始。准备对象在场景中创建一个Cube重命名为“PowerUp”。打开动画窗口菜单栏 Window - Animation - Animation。确保选中了“PowerUp”对象Animation窗口会显示“Create”按钮。创建动画片段点击“Create”会提示你保存一个.anim文件动画片段命名为“PowerUp_Idle”。同时Unity会自动为“PowerUp”对象添加两个组件Animator和一个简单的Animation组件较新版本可能直接是Animator。录制动画在Animation窗口中确保红色圆点“录制”按钮是按下状态。将时间线红色竖线拖到0秒处。在Inspector中修改PowerUp的Transform下的Rotation的Y轴为0。点击Rotation属性前的小钻石图标添加关键帧。将时间线拖到3秒处。修改Rotation的Y轴为360。Unity会自动在此处创建另一个关键帧。点击播放按钮预览你会看到立方体在3秒内匀速旋转一周。添加上下浮动时间线回到0秒记录Position的Y轴值比如1。时间线到1.5秒将Y轴值改为1.5。时间线到3秒将Y轴值改回1。停止录制再点一次红色圆点。现在播放立方体会一边旋转一边上下浮动。你刚刚创建了一个包含位置和旋转变化的动画片段。Animator组件会播放这个片段。7.2 理解Animator控制器对于更复杂的角色如待机、行走、奔跑、跳跃我们需要一个状态机来管理多个动画片段之间的切换。这就是Animator Controller。创建Animator Controller在Project中右键 - Create - Animator Controller命名为“PlayerAnimator”。打开Animator视图Window - Animation - Animator。将“PlayerAnimator”拖拽给玩家对象的Animator组件的Controller槽位。理解状态机Animator视图显示了一个状态机。默认有一个橙色状态“Any State”和一个灰色状态“Entry”入口。从“Entry”指向一个默认状态比如“Idle”。添加动画状态将之前制作的“PowerUp_Idle.anim”从Project拖入Animator视图的网格区域它会创建一个新的状态节点。右键这个节点 - Set as Layer Default State将其设为默认状态。创建参数与过渡假设我们想通过按键在“Idle”和“Jump”状态间切换。在Animator视图左上角的Parameters面板点击“”号创建一个Bool型参数命名为“IsJumping”。右键“Idle”状态 - Make Transition拖出一条线到“Jump”状态你需要先创建好Jump动画片段并拖进来。点击这条过渡线在Inspector中找到Conditions条件点击“”号选择参数“IsJumping”条件设为“true”。这意味着当IsJumping为真时从Idle过渡到Jump。同样创建从“Jump”回到“Idle”的过渡条件设为“IsJumping”为“false”。用脚本控制动画在玩家的移动脚本中可以控制这个参数。public class PlayerAnimation : MonoBehaviour { private Animator animator; // 引用Animator组件 void Start() { animator GetComponentAnimator(); } void Update() { // 假设按下空格键跳跃 if (Input.GetKeyDown(KeyCode.Space)) { animator.SetBool(IsJumping, true); } if (Input.GetKeyUp(KeyCode.Space)) { animator.SetBool(IsJumping, false); } } }通过这种方式你可以构建出角色复杂的动画行为逻辑。8. 构建与发布从编辑器到可执行文件当你的游戏或应用在编辑器中运行良好后最后一步就是将其打包成可以分发给他人使用的独立文件这个过程称为构建Build。8.1 构建设置详解打开构建设置File - Build Settings (CtrlShiftB)。添加当前场景在Build Settings窗口点击“Add Open Scenes”按钮将当前打开的场景加入到“Scenes In Build”列表中。列表的顺序就是游戏加载场景的顺序索引为0的场景是游戏启动后第一个加载的场景。选择目标平台在“Platform”列表中选择你想要发布的平台如PC, Mac Linux StandalonePC独立平台、Android、iOS、WebGL等。选择后可能需要点击“Switch Platform”按钮Unity会重新为特定平台处理资源如纹理压缩格式这可能需要一些时间。玩家设置点击“Player Settings...”按钮会打开Project Settings的Player部分这里可以配置许多重要信息Company Name和Product Name这些会体现在应用窗口标题、安装目录等处。Default Icon应用图标。Resolution and Presentation可以设置窗口模式全屏、窗口化、默认分辨率等。对于移动平台还需要设置Bundle Identifier包名如com.YourCompany.YourGame必须是唯一的、版本号、权限等。8.2 执行构建在Build Settings中配置好场景和平台后点击“Build”按钮。选择一个文件夹作为输出目录不要放在Assets文件夹内建议在项目根目录新建一个Builds文件夹。Unity会开始编译所有代码、处理资源、打包数据。这个过程的时间取决于项目大小。完成后你会在输出目录下得到PC平台一个.exe可执行文件Windows或.app包Mac以及一个同名的_Data文件夹包含所有资源。这两个需要放在一起才能运行。WebGL一个包含.html,.js,.data等文件的文件夹。你需要将其整个部署到Web服务器上。Android一个.apk或.aab安装包文件。避坑技巧构建前务必保存场景和项目。首次构建某个平台时时间会较长因为需要导入和转换大量资源。使用“Development Build”选项在Build Settings中勾选“Development Build”可以在发布的版本中保留控制台日志并启用Deep Profiling等调试功能对于测试版本非常有用。处理未使用的资源正式发布前检查Project Settings - Editor - Asset Pipeline下的“Strip Unused Mesh Components”等选项或考虑使用Asset Bundle来优化包体大小。WebGL内存限制WebGL平台对内存使用非常敏感。如果项目较大可能需要在Player Settings - Publishing Settings中调整“WebGL Memory Size”。从双击Unity图标时的茫然到亲手构建出一个包含交互、物理、动画的可执行文件这个“初步了解”的过程实质上是建立起一套与Unity引擎对话的基本语法和思维模式。记住引擎只是工具最重要的永远是你的想法和创意。接下来你可以选择深入某个方向比如学习更复杂的C#设计模式、钻研Shader编写来创造独特的视觉效果、研究AI导航网格让敌人更智能或者探索网络功能实现多人游戏。Unity的世界庞大而精彩而你现在已经拿到了入场券并且知道该如何开始自己的探索了。
返回列表