[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:04.30,Default,,0000,0000,0000,,Unity 4.3 我们发布了第一阶段的2D工具 Dialogue: 0,0:00:04.30,0:00:08.30,Default,,0000,0000,0000,,为此,我们用这个工具做了一个2D范例 Dialogue: 0,0:00:08.30,0:00:11.53,Default,,0000,0000,0000,,这个2D范例叫做"铁桥塔防" Dialogue: 0,0:00:11.53,0:00:15.56,Default,,0000,0000,0000,,描述伦敦铁桥被外星人入侵的故事 Dialogue: 0,0:00:15.56,0:00:23.47,Default,,0000,0000,0000,,范例完全用2D图片和物理来呈现\N让你了解这些元素如何在Unity里组合 Dialogue: 0,0:00:23.47,0:00:31.64,Default,,0000,0000,0000,,影片会说明范例里的背景、前景、角色、特效\N镜头追迹、动作和脚本程序是如何制作的 Dialogue: 0,0:00:31.64,0:00:36.14,Default,,0000,0000,0000,,开始之前,先来聊聊基本的Unity 2D工作 Dialogue: 0,0:00:36.86,0:00:43.04,Default,,0000,0000,0000,,首先,当要制作2D项目,你应该先设定工作环境为2D Dialogue: 0,0:00:43.04,0:00:47.04,Default,,0000,0000,0000,,可以在建立新项目时在下拉选单设定 Dialogue: 0,0:00:47.04,0:00:53.17,Default,,0000,0000,0000,,或是在开发中到Edit - Project Settings - Editor调整 Dialogue: 0,0:00:53.17,0:00:59.63,Default,,0000,0000,0000,,这代表预设情况下,输入的材质会\N被视为2D图片,场景视图也会预设为2D Dialogue: 0,0:00:59.63,0:01:04.42,Default,,0000,0000,0000,,这个新的2D模式会采用完全的\N正视图视角来呈现你的2D游戏 Dialogue: 0,0:01:04.42,0:01:10.20,Default,,0000,0000,0000,,同时也会把右上角的3D小图示都隐藏\N让工作空间更大 Dialogue: 0,0:01:10.20,0:01:17.04,Default,,0000,0000,0000,,除此之外,Unity 2D的工作流程\N是和现有的3D流程整合在一起的 Dialogue: 0,0:01:17.04,0:01:22.93,Default,,0000,0000,0000,,如果你已经会操作原本的Unity\N那Unity 2D会很好上手 Dialogue: 0,0:01:22.93,0:01:27.22,Default,,0000,0000,0000,,值得一提的是,你也可以混搭2D和3D共享 Dialogue: 0,0:01:27.22,0:01:32.87,Default,,0000,0000,0000,,所以如果你想要有3D元素在你的2D游戏里\N或2D元素在3D游戏里都没有问题 Dialogue: 0,0:01:33.37,0:01:38.31,Default,,0000,0000,0000,,现在来看看范例如何建立一个关卡 Dialogue: 0,0:01:38.81,0:01:44.81,Default,,0000,0000,0000,,我们一开始勾勒关卡设计雏形\N然后到Photoshop里面去把每个图层做出来 Dialogue: 0,0:01:45.31,0:01:51.31,Default,,0000,0000,0000,,然后输出这些图层\N成为新的Sprite类型导入Unity Dialogue: 0,0:01:58.37,0:02:06.52,Default,,0000,0000,0000,,为了呈现出背景的视差,我们做了一些\N背景元素在Sorting Layer里 Dialogue: 0,0:02:06.52,0:02:09.66,Default,,0000,0000,0000,,这是一个2D工具的新功能 Dialogue: 0,0:02:10.16,0:02:17.38,Default,,0000,0000,0000,,当所有背景指定到这一层后\N我们可以在图片着色器的图层排序它们 Dialogue: 0,0:02:17.38,0:02:21.38,Default,,0000,0000,0000,,调好位置之后也可以把图层锁定不能编辑 Dialogue: 0,0:02:21.38,0:02:27.75,Default,,0000,0000,0000,,这样的话我们编辑前景元素的时候\N就不用担心会不小心动到背景元素 Dialogue: 0,0:02:27.75,0:02:31.75,Default,,0000,0000,0000,,可以从接口右上方的图层选单来设定 Dialogue: 0,0:02:32.82,0:02:39.53,Default,,0000,0000,0000,,由于背景只是装饰用的,所以\N并不需要在图片上放任何组件 Dialogue: 0,0:02:39.53,0:02:41.53,Default,,0000,0000,0000,,将它们放到一个空的对象里 Dialogue: 0,0:02:41.53,0:02:46.20,Default,,0000,0000,0000,,并放入一个叫做叫做\NBackgroundParallax的脚本来处里视差 Dialogue: 0,0:02:46.20,0:02:50.64,Default,,0000,0000,0000,,更多的细节可以详查这个已经批注的脚本 Dialogue: 0,0:02:54.91,0:02:59.40,Default,,0000,0000,0000,,接下来制作角色活动的前景空间 Dialogue: 0,0:02:59.79,0:03:03.47,Default,,0000,0000,0000,,我们设计了伦敦铁桥和降落在中间的飞碟 Dialogue: 0,0:03:03.47,0:03:09.22,Default,,0000,0000,0000,,主角处于一个敌人从天而降并到处乱窜的环境 Dialogue: 0,0:03:09.22,0:03:13.63,Default,,0000,0000,0000,,因此,每一个前景元素都需要\N碰撞体(Collider)来让主角在上面行走 Dialogue: 0,0:03:13.63,0:03:21.24,Default,,0000,0000,0000,,大多数环境用方体碰撞就可以\N除了外型比较复杂的飞碟 Dialogue: 0,0:03:22.50,0:03:28.72,Default,,0000,0000,0000,,Unity提供多边形碰撞体(Polygon Collider)\N可以根据图片外型自动产生多边形碰撞体 Dialogue: 0,0:03:28.72,0:03:32.05,Default,,0000,0000,0000,,甚至可以调整碰撞体的外型 Dialogue: 0,0:03:32.05,0:03:38.16,Default,,0000,0000,0000,,你可以新增、移动或删除节点\N调整到更适合行走的外型 Dialogue: 0,0:03:38.66,0:03:45.60,Default,,0000,0000,0000,,为了排序前景元素我们建立了前景层\N设定显示在背景之前 Dialogue: 0,0:03:48.88,0:03:50.88,Default,,0000,0000,0000,,接下来看看主角 Dialogue: 0,0:03:53.71,0:04:03.60,Default,,0000,0000,0000,,我们的主角也是在Photoshop里面设计的\N一个四肢独立类似卡通主角雷曼的角色 Dialogue: 0,0:04:03.60,0:04:05.60,Default,,0000,0000,0000,,另外一个2D工具的新功能 Dialogue: 0,0:04:05.60,0:04:09.64,Default,,0000,0000,0000,,是一个以图表化的动画工具\N可以在Photoshop里绘制每一节点的图 Dialogue: 0,0:04:09.64,0:04:14.36,Default,,0000,0000,0000,,后面我们会介绍如何用这方法\N制造我们的天鹅 Dialogue: 0,0:04:15.07,0:04:20.20,Default,,0000,0000,0000,,因为身体部位分开比较好控制动画\N因此我们希望独立每个身体部位 Dialogue: 0,0:04:20.20,0:04:27.96,Default,,0000,0000,0000,,所以我们将身体部位独立切开\N好让Unity在输入时容易拆离它们 Dialogue: 0,0:04:28.76,0:04:33.10,Default,,0000,0000,0000,,这代表我们可以为图片单独制作动作 Dialogue: 0,0:04:33.10,0:04:40.92,Default,,0000,0000,0000,,把这些部位放入建好的角色层\N然后改变Z轴深度来改变前后顺序 Dialogue: 0,0:04:48.81,0:04:56.59,Default,,0000,0000,0000,,把这些图片都放入一个有控制脚本\N碰撞体、物理设定等等的对象 Dialogue: 0,0:04:56.59,0:05:07.10,Default,,0000,0000,0000,,一旦做到这里,就可以到动画窗口给予图片动作\N建立待机、跑、跳、射击和死亡的动画 Dialogue: 0,0:05:07.10,0:05:11.80,Default,,0000,0000,0000,,使用动画窗口里新的分镜表功能\N就可以简单制作动作 Dialogue: 0,0:05:13.41,0:05:19.40,Default,,0000,0000,0000,,我们在父对象建立一个动画组件\N然后针对每一个子对象建立影格 Dialogue: 0,0:05:19.40,0:05:25.40,Default,,0000,0000,0000,,移动指标到想要的影格后调整角色部位\N就会自动把变量录到影格上 Dialogue: 0,0:05:27.31,0:05:35.06,Default,,0000,0000,0000,,可随时切换分镜表和动画曲线\N使得它更容易调整设计 Dialogue: 0,0:05:36.73,0:05:41.37,Default,,0000,0000,0000,,这些动作建立好之后我们可以\N帮我们的角色设计控制状态 Dialogue: 0,0:05:41.37,0:05:45.28,Default,,0000,0000,0000,,让我们用程序呼叫角色执行各种动作 Dialogue: 0,0:05:45.28,0:05:52.12,Default,,0000,0000,0000,,因为不是驱动3D骨架,所以取消打勾Root Motion Dialogue: 0,0:05:52.12,0:05:57.29,Default,,0000,0000,0000,,也可以打勾Animate Physics如果\N动画要和物理行为相互作用 Dialogue: 0,0:05:57.29,0:06:04.56,Default,,0000,0000,0000,,为了在场景走动,主角脚上有圆形碰撞体\N和一个包覆整个身体的方形碰撞体 Dialogue: 0,0:06:04.56,0:06:09.45,Default,,0000,0000,0000,,这样他可以平顺地行走和跳下场景\N跳起来的时候头部也可以判定撞到 Dialogue: 0,0:06:09.80,0:06:16.04,Default,,0000,0000,0000,,为了控制角色动作,我们写了\N一个脚本透过2D物理引擎来移动 Dialogue: 0,0:06:16.04,0:06:21.43,Default,,0000,0000,0000,,这代表在游戏里面可以指定主角和敌人\N让游戏动态更丰富的物理行为 Dialogue: 0,0:06:21.43,0:06:25.81,Default,,0000,0000,0000,,我们用PlayerControl脚本来判断角色的输入 Dialogue: 0,0:06:25.81,0:06:32.00,Default,,0000,0000,0000,,我们在此指定物理移动速度\N同时也把输入的值送到动画控制器 Dialogue: 0,0:06:32.00,0:06:40.48,Default,,0000,0000,0000,,判定播放哪些动画以及\N顺畅的播放分镜表上图片的转变 Dialogue: 0,0:06:40.48,0:06:44.48,Default,,0000,0000,0000,,使用动画控制建立图片动态最大的好处是 Dialogue: 0,0:06:44.48,0:06:51.28,Default,,0000,0000,0000,,可以调整动画速度用来搭配物理速度\N不需要额外再作任何判定 Dialogue: 0,0:07:23.13,0:07:26.36,Default,,0000,0000,0000,,FixedUpdate函式会检查每一步物理运算 Dialogue: 0,0:07:26.36,0:07:32.99,Default,,0000,0000,0000,,在这里我们第一件要做的事情是\N把输入的水平值传给动画的速度参数 Dialogue: 0,0:07:33.95,0:07:41.72,Default,,0000,0000,0000,,在我们的状态设定里\N待机状态到跑动需要速度参数大于0.1 Dialogue: 0,0:07:41.72,0:07:46.02,Default,,0000,0000,0000,,当值成立时,动画就会从待机切到跑步 Dialogue: 0,0:07:51.86,0:07:58.82,Default,,0000,0000,0000,,要让角色移动,让它有Rigidbody2D组件\N就可以为它加力道移动 Dialogue: 0,0:07:59.63,0:08:07.71,Default,,0000,0000,0000,,同时我们也根据输入的水平值是\N大于0或小于0来处理角色面朝的方向 Dialogue: 0,0:08:07.71,0:08:14.57,Default,,0000,0000,0000,,这是因为在Unity里,按住左键会传回-1\N而按住右键会传回+1 Dialogue: 0,0:08:15.07,0:08:24.57,Default,,0000,0000,0000,,根据输入值呼叫一个简单的翻转函数\N来翻转角色的X轴缩放,让角色面向反方向 Dialogue: 0,0:08:26.85,0:08:31.00,Default,,0000,0000,0000,,为了判定角色是否着地\N我们新增了一个Ground图层 Dialogue: 0,0:08:31.00,0:08:34.98,Default,,0000,0000,0000,,并指定给全部可行走的前景物件 Dialogue: 0,0:08:43.40,0:08:50.23,Default,,0000,0000,0000,,然后使用2D里面的Linecast函数\N检查Ground图层是否和角色的脚接触 Dialogue: 0,0:08:50.23,0:08:56.78,Default,,0000,0000,0000,,为了让制作更容易,我们建立了\N一个空白的对象当作检查地面的标准点 Dialogue: 0,0:08:56.78,0:09:03.08,Default,,0000,0000,0000,,在该对象上增加一个小图示\N我们就可以控制角色到地面的距离 Dialogue: 0,0:09:03.08,0:09:07.96,Default,,0000,0000,0000,,就游戏角度来看\N角色在地面时只能做跳的动作 Dialogue: 0,0:09:08.46,0:09:12.65,Default,,0000,0000,0000,,更多关于角色控制的信息\N可以查看范例脚本里面的说明 Dialogue: 0,0:09:12.65,0:09:15.88,Default,,0000,0000,0000,,影片稍后也会讨论角色的武器 Dialogue: 0,0:09:15.88,0:09:19.88,Default,,0000,0000,0000,,接下来看看相机如何追踪角色 Dialogue: 0,0:09:21.29,0:09:27.82,Default,,0000,0000,0000,,跟3D游戏一样,在2D游戏里\N镜头运镜也左右着游戏体验 Dialogue: 0,0:09:27.82,0:09:33.62,Default,,0000,0000,0000,,要呈现经典的2D游戏运镜\N我们参考了2D游戏经典大作 Dialogue: 0,0:09:33.62,0:09:38.65,Default,,0000,0000,0000,,任天堂或超任的超级玛莉欧的镜头运作 Dialogue: 0,0:09:38.65,0:09:45.12,Default,,0000,0000,0000,,在超级玛莉欧世界里镜头会水平移动\N除了封闭的空间或关卡边缘 Dialogue: 0,0:09:45.12,0:09:49.34,Default,,0000,0000,0000,,在这两类区域里角色小幅移动\N镜头不会追踪 Dialogue: 0,0:09:49.34,0:09:54.05,Default,,0000,0000,0000,,一旦角色移出区域\N镜头又会开始追踪角色 Dialogue: 0,0:09:54.05,0:09:58.20,Default,,0000,0000,0000,,超级玛莉欧的相机\N用特定高度来进行垂直判定 Dialogue: 0,0:09:58.20,0:10:06.85,Default,,0000,0000,0000,,但我们的游戏没有往上的长度\N比较像动作平台,所以不需要这类设定 Dialogue: 0,0:10:07.21,0:10:12.79,Default,,0000,0000,0000,,因此我们的相机在垂直判定\N采用了和水平一样的方法 Dialogue: 0,0:10:18.78,0:10:25.14,Default,,0000,0000,0000,,请看看主相机里的CameraFollow脚本\N了解镜头追踪更完整的写法和批注 Dialogue: 0,0:10:26.14,0:10:32.73,Default,,0000,0000,0000,,游戏中有许多特效\N但最重要的是主角杀死外星人的能力 Dialogue: 0,0:10:32.73,0:10:36.34,Default,,0000,0000,0000,,主角会发射一个具有\N反作用力动画的火箭筒 Dialogue: 0,0:10:36.34,0:10:38.90,Default,,0000,0000,0000,,这个动画由几个部分组成 Dialogue: 0,0:10:38.90,0:10:47.97,Default,,0000,0000,0000,,首先检查输入,当按下Fire键时\N产生一个火箭,播放音效并触发火箭动画播放 Dialogue: 0,0:10:47.97,0:10:49.97,Default,,0000,0000,0000,,让我们进一步分解这些步骤 Dialogue: 0,0:10:49.97,0:10:57.68,Default,,0000,0000,0000,,为了可以播放其他动画(跑步)时同时播放火箭发射\N我们在动画控制器建立了Shooting的动画层 Dialogue: 0,0:10:57.68,0:11:06.98,Default,,0000,0000,0000,,将Weight属性设为1,可以\N完全覆盖基本层(Base Layer)所有的动作 Dialogue: 0,0:11:20.50,0:11:27.35,Default,,0000,0000,0000,,我们可以从任何状态中用程序\N触发Shoot参数发射动画 Dialogue: 0,0:11:27.35,0:11:30.54,Default,,0000,0000,0000,,来看看负责这工作的Gun脚本 Dialogue: 0,0:11:32.70,0:11:37.40,Default,,0000,0000,0000,,你可以看到我们写了驱动事件\N触发Shoot为True Dialogue: 0,0:11:37.40,0:11:45.51,Default,,0000,0000,0000,,触发后会打开,在下一格重置为关\N就可以重复使用,对于射击动作最好用 Dialogue: 0,0:11:46.01,0:11:50.67,Default,,0000,0000,0000,,除了设定动画,我们也从脚本中发射火箭 Dialogue: 0,0:11:50.67,0:12:00.56,Default,,0000,0000,0000,,播放音效后根据角色的方向\N产生火箭并给它一个X轴的正或负速度 Dialogue: 0,0:12:01.28,0:12:05.29,Default,,0000,0000,0000,,这个Gun脚本被放在主角身上的空物件 Dialogue: 0,0:12:05.29,0:12:11.66,Default,,0000,0000,0000,,像这样将脚本放到一个空对象上\N可以轻易的定位火箭发射位置 Dialogue: 0,0:12:11.66,0:12:20.01,Default,,0000,0000,0000,,我们将对象放到火箭筒发射口\N然后以他自己的坐标当作发射点 Dialogue: 0,0:12:40.25,0:12:46.80,Default,,0000,0000,0000,,火箭本身有2D刚体\N我们给它一个速度让它移动 Dialogue: 0,0:12:46.80,0:12:51.10,Default,,0000,0000,0000,,它也有火焰喷射动画和粒子系统做的烟雾 Dialogue: 0,0:12:52.83,0:12:56.48,Default,,0000,0000,0000,,粒子系统也接受新的Sprite图片 Dialogue: 0,0:12:56.48,0:13:04.15,Default,,0000,0000,0000,,所以可以将烟雾的图片切好后加到材质\N并指定到粒子系统的Texture Sheet Animation Dialogue: 0,0:13:04.15,0:13:08.23,Default,,0000,0000,0000,,就有烟雾特效让粒子系统发射 Dialogue: 0,0:13:16.12,0:13:22.94,Default,,0000,0000,0000,,当火箭命中敌人或环境时\N火箭本身会引起爆炸并被摧毁 Dialogue: 0,0:13:22.94,0:13:27.73,Default,,0000,0000,0000,,爆炸是我们制作的爆炸动画对象 Dialogue: 0,0:13:27.73,0:13:33.70,Default,,0000,0000,0000,,排序位置在前景的最后面 Dialogue: 0,0:13:36.17,0:13:44.58,Default,,0000,0000,0000,,要建立这类动画,可以从项目点选图片\N然后在属性Sprite Mode选择Multiple Dialogue: 0,0:13:44.58,0:13:49.76,Default,,0000,0000,0000,,这功能允许我们编辑图片\N手动或是自动裁切图片大小 Dialogue: 0,0:13:49.76,0:13:52.41,Default,,0000,0000,0000,,一旦完成裁切后 Dialogue: 0,0:13:52.41,0:13:58.76,Default,,0000,0000,0000,,只需要点击Apply\NUnity会自动产生图片并作为子对象 Dialogue: 0,0:13:59.71,0:14:01.69,Default,,0000,0000,0000,,这就是火箭制作过程 Dialogue: 0,0:14:01.69,0:14:06.53,Default,,0000,0000,0000,,稍后我们将在影片中讨论\N杀死敌人的动画技法 Dialogue: 0,0:14:07.10,0:14:12.19,Default,,0000,0000,0000,,现在先让我们回到主角\N看看如何处理血条补血和扣血 Dialogue: 0,0:14:12.19,0:14:18.55,Default,,0000,0000,0000,,血条被定义为一个浮点数(Float)\N每次碰到敌人就会呼叫TakeDamage函式 Dialogue: 0,0:14:18.55,0:14:25.35,Default,,0000,0000,0000,,为了避免触发太快造成死亡\N我们用repeatDamagePeriod来间隔触发时间 Dialogue: 0,0:14:26.52,0:14:31.14,Default,,0000,0000,0000,,为了让角色显示受伤\N并容易从敌人手中逃脱 Dialogue: 0,0:14:31.14,0:14:34.85,Default,,0000,0000,0000,,我们建立了受伤的动作\N并在物理上弹飞主角 Dialogue: 0,0:14:34.85,0:14:39.54,Default,,0000,0000,0000,,要做到这点,TakeDamage函式\N会阻止角色跳跃 Dialogue: 0,0:14:39.54,0:14:42.12,Default,,0000,0000,0000,,并从主角与敌人之间找到一个向量位置 Dialogue: 0,0:14:42.12,0:14:46.12,Default,,0000,0000,0000,,指定一个物理力量往指定方向击退 Dialogue: 0,0:14:46.12,0:14:55.32,Default,,0000,0000,0000,,hurtForce是一个全局变量,可以随时从接口调整\N而不用从脚本里调整 Dialogue: 0,0:14:55.32,0:15:02.21,Default,,0000,0000,0000,,除了击退主角之外,我们同时\N也扣掉角色的血量并更新血条 Dialogue: 0,0:15:02.21,0:15:09.82,Default,,0000,0000,0000,,为了呈现扣血,我们把血条的宽度缩减\N用一个公式计算让绿色转变到红色 Dialogue: 0,0:15:09.82,0:15:14.64,Default,,0000,0000,0000,,透过当下的血量和总量算出一个百分比 Dialogue: 0,0:15:14.64,0:15:21.74,Default,,0000,0000,0000,,血条是由两个图片组成\N一个显示血量,另一个显示外框 Dialogue: 0,0:15:21.74,0:15:25.95,Default,,0000,0000,0000,,这也是在Photoshop里做的\N然后输出两个单独的图片 Dialogue: 0,0:15:25.95,0:15:34.05,Default,,0000,0000,0000,,导入图形的时候,设定图形轴心在左边\N所以当它按比例减少时,就会往左缩 Dialogue: 0,0:15:48.57,0:15:54.57,Default,,0000,0000,0000,,这两个图片放在一个空对象底下\N给予一个简单脚本,让它显示在角色头上 Dialogue: 0,0:15:54.57,0:15:58.62,Default,,0000,0000,0000,,将血条位置设定与角色相同 Dialogue: 0,0:15:58.62,0:16:02.62,Default,,0000,0000,0000,,并加上偏移用的全局变量\N好在检视接口进行调整 Dialogue: 0,0:16:16.22,0:16:22.63,Default,,0000,0000,0000,,当主角血量为0时,设定碰撞体的isTrigger = true\N主角就会往下跌到水上 Dialogue: 0,0:16:22.63,0:16:28.19,Default,,0000,0000,0000,,同时将主角排序推到UI层上\N主角会移到画面最上层 Dialogue: 0,0:16:28.19,0:16:31.59,Default,,0000,0000,0000,,UI层是我们制作的层\N是用来表示像UI的前面的对象 Dialogue: 0,0:16:31.59,0:16:34.22,Default,,0000,0000,0000,,当脚色死亡时,我们有两个动画 Dialogue: 0,0:16:34.22,0:16:38.63,Default,,0000,0000,0000,,一个叫Death,会失去帽子和枪\N另外一个叫Falling Dialogue: 0,0:16:38.63,0:16:47.24,Default,,0000,0000,0000,,用Exit Time当作动画的切换条件\N一旦Death播完就会切到Falling动画 Dialogue: 0,0:16:50.78,0:16:55.00,Default,,0000,0000,0000,,最后,在播放死亡动画时\N为了阻止玩家移动角色或射击 Dialogue: 0,0:16:55.00,0:16:58.34,Default,,0000,0000,0000,,我们会禁用PlayerControl和Gun脚本 Dialogue: 0,0:16:58.34,0:17:05.04,Default,,0000,0000,0000,,由于Die函式是全局可以从任何地方呼叫\N例如玩家掉入水中 Dialogue: 0,0:17:05.04,0:17:12.46,Default,,0000,0000,0000,,要在主角接触水面时重置游戏,我们\N用一个由触发器和脚本组成的KillTrigger对象 Dialogue: 0,0:17:12.46,0:17:17.51,Default,,0000,0000,0000,,在大多的情况下\NRemover脚本移除掉入河中的敌人 Dialogue: 0,0:17:17.51,0:17:21.44,Default,,0000,0000,0000,,并播放一个水花动画和音效 Dialogue: 0,0:17:21.44,0:17:24.00,Default,,0000,0000,0000,,但如果是主角被触发器侦测到时 Dialogue: 0,0:17:24.00,0:17:27.09,Default,,0000,0000,0000,,就会呼叫PlayerHealth脚本里的Die函式 Dialogue: 0,0:17:27.09,0:17:34.53,Default,,0000,0000,0000,,并禁用CameraTracking同时将角色移出屏幕\N并呼叫co-routiene函数(停止2秒) Dialogue: 0,0:17:34.53,0:17:36.53,Default,,0000,0000,0000,,然后重生在出生点 Dialogue: 0,0:17:37.08,0:17:39.08,Default,,0000,0000,0000,,接下来焦点转移到角色生存 Dialogue: 0,0:17:39.08,0:17:42.48,Default,,0000,0000,0000,,来看看它是如何生存\N和我们给予它甚么生存工具 Dialogue: 0,0:17:42.48,0:17:49.91,Default,,0000,0000,0000,,游戏中有两种帮助玩家的补给箱\N一种箱子是炸弹,另一种可以补血 Dialogue: 0,0:17:50.41,0:17:55.70,Default,,0000,0000,0000,,补给箱由箱子和降落伞两个部分组成 Dialogue: 0,0:17:58.05,0:18:03.77,Default,,0000,0000,0000,,这两个元素放入一个空白对象\N我们就可以一起触发动画 Dialogue: 0,0:18:03.77,0:18:08.48,Default,,0000,0000,0000,,我们定位这两个图片\N降落伞的轴心位于父对象的中心 Dialogue: 0,0:18:09.04,0:18:15.31,Default,,0000,0000,0000,,这样动画可以左右摇摆\N让降落伞是浮在空中的感觉 Dialogue: 0,0:18:15.31,0:18:19.31,Default,,0000,0000,0000,,然后增加一个刚体让它有重力往下掉 Dialogue: 0,0:18:19.31,0:18:24.96,Default,,0000,0000,0000,,箱子增加碰撞体用来探测它的着陆时机\N和玩家捡起的时机 Dialogue: 0,0:18:24.96,0:18:30.51,Default,,0000,0000,0000,,着陆之后\N播放第二段动画让降落伞消失 Dialogue: 0,0:18:30.51,0:18:34.92,Default,,0000,0000,0000,,跟游戏其他地方一样\N动画器控制对象的状态 Dialogue: 0,0:18:34.92,0:18:38.92,Default,,0000,0000,0000,,我们可以看到预设的情况下\N它会播放FloatDown动画 Dialogue: 0,0:18:38.92,0:18:43.47,Default,,0000,0000,0000,,然后当Land = True时会切换到着陆状态 Dialogue: 0,0:18:43.97,0:18:49.73,Default,,0000,0000,0000,,在脚本里,我们使用onTriggerEnter函数\N透过标记来检测是否碰到地面 Dialogue: 0,0:18:49.73,0:18:55.10,Default,,0000,0000,0000,,我们也将补给箱从父对象中分离\N并给它一个刚体 Dialogue: 0,0:18:55.10,0:19:00.62,Default,,0000,0000,0000,,它就可以和环境互动\N比如降落在一个斜坡上就会斜停在坡上 Dialogue: 0,0:19:00.62,0:19:03.67,Default,,0000,0000,0000,,接下来看看炸弹 Dialogue: 0,0:19:03.67,0:19:08.48,Default,,0000,0000,0000,,捡起炸弹箱的动作是箱子上的\NBombPickup脚本处理的 Dialogue: 0,0:19:08.48,0:19:16.74,Default,,0000,0000,0000,,透过角色身上的LayBombs脚本\N增减主角拥有的炸弹数量 Dialogue: 0,0:19:17.56,0:19:25.56,Default,,0000,0000,0000,,LayBombs脚本负责检查是否携带着炸弹\N并负责产生并放置炸弹 Dialogue: 0,0:19:27.42,0:19:36.15,Default,,0000,0000,0000,,炸弹设有定时装置,在爆炸之前\N透过BombDetonation里的yield倒数计时 Dialogue: 0,0:19:36.80,0:19:39.54,Default,,0000,0000,0000,,爆炸函式执行几个动作 Dialogue: 0,0:19:39.54,0:19:43.80,Default,,0000,0000,0000,,它会重置bombLaid参数\N允许产生另外一个炸弹箱 Dialogue: 0,0:19:43.80,0:19:49.80,Default,,0000,0000,0000,,它会通知产生器补充新的炸弹箱\N并炸死范围内的敌人 Dialogue: 0,0:19:50.52,0:19:53.06,Default,,0000,0000,0000,,来看看最后一部分怎么运作的 Dialogue: 0,0:19:53.06,0:19:57.18,Default,,0000,0000,0000,,因为炸弹对敌人来说是致命的\N不管他们的生命值剩下多少 Dialogue: 0,0:19:57.18,0:20:03.47,Default,,0000,0000,0000,,我们用Physics.OverlapCircleAll方法收集\N在爆炸范围内所有标记为敌人的对象 Dialogue: 0,0:20:03.47,0:20:06.61,Default,,0000,0000,0000,,然后为每一个敌人执行循环 Dialogue: 0,0:20:06.61,0:20:15.54,Default,,0000,0000,0000,,设定他们的血量为0\N从爆炸地点到敌人算出一个向量并施加外力 Dialogue: 0,0:20:16.30,0:20:21.38,Default,,0000,0000,0000,,一旦循环跑完,就可以播放视觉效果 Dialogue: 0,0:20:21.38,0:20:25.91,Default,,0000,0000,0000,,播放一段音效同时摧毁炸弹 Dialogue: 0,0:20:26.88,0:20:29.25,Default,,0000,0000,0000,,爆炸视觉效果有两部分 Dialogue: 0,0:20:29.25,0:20:33.58,Default,,0000,0000,0000,,主要部份是一个简单的圆形\N短暂的出现后摧毁 Dialogue: 0,0:20:33.58,0:20:39.58,Default,,0000,0000,0000,,第二部分是星星状的粒子系统\N重复用相同图片呈现火箭爆炸 Dialogue: 0,0:20:42.26,0:20:51.74,Default,,0000,0000,0000,,效率上我们保持粒子系统持续在场景中\N需要时我们用程序移动到指定位置播放 Dialogue: 0,0:20:52.51,0:20:56.51,Default,,0000,0000,0000,,这样可以让粒子系统存在内存里\N使游戏比较有效率 Dialogue: 0,0:20:57.01,0:21:04.67,Default,,0000,0000,0000,,这么做主要是因为这个范例\N同时只会有一个爆炸在场景中 Dialogue: 0,0:21:04.67,0:21:07.79,Default,,0000,0000,0000,,因为玩家只能一次丢一个炸弹 Dialogue: 0,0:21:07.79,0:21:14.94,Default,,0000,0000,0000,,这就是为什么将粒子系统保持在场景中\N并重复播放的原因,比起建立后移除有效率 Dialogue: 0,0:21:15.71,0:21:21.62,Default,,0000,0000,0000,,但如果是火箭爆炸,因为可以重复发射\N因此需要建立后移除 Dialogue: 0,0:21:22.12,0:21:26.12,Default,,0000,0000,0000,,让我们看看主角杀死敌人\N怎么计算分数 Dialogue: 0,0:21:26.62,0:21:35.53,Default,,0000,0000,0000,,这分为两个部分,动画显示获得100分\N以及增加UI的分数计算 Dialogue: 0,0:21:35.53,0:21:40.19,Default,,0000,0000,0000,,分数动画由1和0两个数字组成 Dialogue: 0,0:21:40.19,0:21:42.87,Default,,0000,0000,0000,,将它们放到场景中的空白对象 Dialogue: 0,0:21:42.87,0:21:49.19,Default,,0000,0000,0000,,给予一个简单的得分动画\N并用程序让它们在动画完成后消失 Dialogue: 0,0:21:49.19,0:21:55.19,Default,,0000,0000,0000,,我们放置摧毁脚本在动画事件尾端 Dialogue: 0,0:22:06.14,0:22:13.70,Default,,0000,0000,0000,,ScoreUI单纯是个GUI文字组件\N带有管理玩家分数的脚本 Dialogue: 0,0:22:13.70,0:22:20.98,Default,,0000,0000,0000,,Score是全局变量,代表随时可以\N检查当敌人被杀死时增加100分 Dialogue: 0,0:22:20.98,0:22:24.98,Default,,0000,0000,0000,,说到敌人,让我们仔细看看他们 Dialogue: 0,0:22:25.48,0:22:28.26,Default,,0000,0000,0000,,在我们的游戏里,有两种类型外星敌人 Dialogue: 0,0:22:28.26,0:22:30.85,Default,,0000,0000,0000,,一种是绿皮肤的鼻涕虫 Dialogue: 0,0:22:30.85,0:22:34.56,Default,,0000,0000,0000,,另一种是会搭着飞船保护自己\N的智能型外星怪物 Dialogue: 0,0:22:34.56,0:22:36.56,Default,,0000,0000,0000,,这些角色会共享一种脚本 Dialogue: 0,0:22:36.56,0:22:38.56,Default,,0000,0000,0000,,因为他们行为相似 Dialogue: 0,0:22:38.56,0:22:45.76,Default,,0000,0000,0000,,我们可以检视它们的全局变量\N并设定不同的移动速度和生命 Dialogue: 0,0:22:46.64,0:22:49.09,Default,,0000,0000,0000,,每个敌人都有自己的移动动画 Dialogue: 0,0:22:49.09,0:22:54.44,Default,,0000,0000,0000,,鼻涕虫有一个可以活动的尾巴\N飞船内的敌人会前后摇摆移动 Dialogue: 0,0:22:55.99,0:23:01.99,Default,,0000,0000,0000,,对鼻涕虫来说,我们汇入图形\N并把尾巴切为独立图形 Dialogue: 0,0:23:01.99,0:23:07.48,Default,,0000,0000,0000,,这样我们就可以单独缩放它\N不会影响到整个图片 Dialogue: 0,0:23:07.48,0:23:14.12,Default,,0000,0000,0000,,轴心设定到右边\N我们可以漂亮的伸展收缩尾巴 Dialogue: 0,0:23:16.48,0:23:19.92,Default,,0000,0000,0000,,上下移动眼睑 Dialogue: 0,0:23:19.92,0:23:24.86,Default,,0000,0000,0000,,然后使用Z轴来排序\N眼睛就会在眼睑底下了 Dialogue: 0,0:23:24.86,0:23:26.86,Default,,0000,0000,0000,,就可以制作眨眼动画 Dialogue: 0,0:23:28.86,0:23:34.05,Default,,0000,0000,0000,,第二个外星人的动画要简单的多\N我们只需要前后转动它 Dialogue: 0,0:23:35.80,0:23:41.23,Default,,0000,0000,0000,,关于这些敌人的移动技术\N我们透过改变刚体的速率来移动它们 Dialogue: 0,0:23:41.23,0:23:47.83,Default,,0000,0000,0000,,当它们遇到一个墙壁这样的障碍物时\N会呼叫Physics.OverlapPoint函式来检测 Dialogue: 0,0:23:47.83,0:23:55.85,Default,,0000,0000,0000,,检查是否有重迭到像是\N墙壁和两边的塔被标记的障碍物 Dialogue: 0,0:23:55.85,0:23:59.16,Default,,0000,0000,0000,,当函式侦测到时,就会呼叫Flip函式 Dialogue: 0,0:23:59.16,0:24:04.07,Default,,0000,0000,0000,,函式会翻转敌人的X轴缩放\N让它转到不同方向 Dialogue: 0,0:24:04.07,0:24:11.04,Default,,0000,0000,0000,,要杀死敌人,当敌人和火箭相撞时\N在撞击时会呼叫Hurt函式 Dialogue: 0,0:24:14.96,0:24:19.21,Default,,0000,0000,0000,,这个函式我们从敌人身上扣1点血 Dialogue: 0,0:24:19.21,0:24:23.21,Default,,0000,0000,0000,,并持续呼叫函式保持敌人持续扣血 Dialogue: 0,0:24:23.21,0:24:27.12,Default,,0000,0000,0000,,如果血条降到0,就会呼叫死亡函式 Dialogue: 0,0:24:31.23,0:24:33.92,Default,,0000,0000,0000,,当他们死后,就会执行一些函式 Dialogue: 0,0:24:33.92,0:24:39.92,Default,,0000,0000,0000,,会先停用所有的图形渲染\N因为2D角色大多都有动画 Dialogue: 0,0:24:40.94,0:24:46.94,Default,,0000,0000,0000,,这是为了把动画对象换成单张死亡图片 Dialogue: 0,0:24:47.74,0:24:54.16,Default,,0000,0000,0000,,我们在图形渲染器将图片改为deadEnemy Dialogue: 0,0:24:54.16,0:24:58.16,Default,,0000,0000,0000,,然后我们帮Score全局变量增加100 Dialogue: 0,0:24:58.16,0:25:03.53,Default,,0000,0000,0000,,然后增加扭转让他们死亡时扭曲 Dialogue: 0,0:25:04.45,0:25:08.88,Default,,0000,0000,0000,,因此我们要让这些敌人死后\N掉入环境的河中 Dialogue: 0,0:25:08.88,0:25:13.59,Default,,0000,0000,0000,,我们找到对象上所有碰撞体\N并设定IsTrigger = True Dialogue: 0,0:25:13.59,0:25:17.42,Default,,0000,0000,0000,,这样他们就会穿过所有环境往下掉 Dialogue: 0,0:25:17.42,0:25:25.47,Default,,0000,0000,0000,,然后播放死亡音效之后展示一个分数动画 Dialogue: 0,0:25:27.88,0:25:29.88,Default,,0000,0000,0000,,要将已死亡的敌人从场景中移除 Dialogue: 0,0:25:29.88,0:25:31.88,Default,,0000,0000,0000,,我们使用killTregger对象 Dialogue: 0,0:25:31.88,0:25:34.76,Default,,0000,0000,0000,,和前面所说的一样 Dialogue: 0,0:25:34.76,0:25:36.76,Default,,0000,0000,0000,,当任何角色接触它时 Dialogue: 0,0:25:36.76,0:25:39.95,Default,,0000,0000,0000,,将会引起一个水花动画,并移除该对象 Dialogue: 0,0:25:39.95,0:25:45.95,Default,,0000,0000,0000,,它们撞击水面并播放\N一段附在水花动画的音效 Dialogue: 0,0:25:45.95,0:25:50.63,Default,,0000,0000,0000,,所以当我们产生水花动画时\N同时也听到音效 Dialogue: 0,0:25:55.15,0:25:59.15,Default,,0000,0000,0000,,要完成游戏关卡\N我们也用一些移动背景来装饰 Dialogue: 0,0:25:59.15,0:26:02.30,Default,,0000,0000,0000,,为了让游戏环境更显动态 Dialogue: 0,0:26:02.30,0:26:07.12,Default,,0000,0000,0000,,我们添加了一些飞翔的天鹅\N以及沿着河岸开的公交车和出租车 Dialogue: 0,0:26:07.12,0:26:16.05,Default,,0000,0000,0000,,首先是天鹅,它是在Photoshop里面画好后\N用Multiple Sprite导入图片 Dialogue: 0,0:26:16.05,0:26:20.80,Default,,0000,0000,0000,,Unity会自动裁切天鹅的每个图片 Dialogue: 0,0:26:20.80,0:26:24.58,Default,,0000,0000,0000,,分为不同的图导入\N并把原图当作父对象放在底下 Dialogue: 0,0:26:24.58,0:26:32.35,Default,,0000,0000,0000,,因为这是个动画组合,可以将所有的图片\N一起拖到场景中,让Unity帮我们生成动画 Dialogue: 0,0:26:32.35,0:26:37.76,Default,,0000,0000,0000,,瞧,天鹅的动画已经准备好了 Dialogue: 0,0:26:37.76,0:26:43.37,Default,,0000,0000,0000,,然后给天鹅一个刚体\N让我们可以控制速度飞过屏幕 Dialogue: 0,0:26:43.37,0:26:47.33,Default,,0000,0000,0000,,和公交车和出租车一样,天鹅已被存为预制对象 Dialogue: 0,0:26:49.26,0:26:55.26,Default,,0000,0000,0000,,公交车和出租车作法只需要\N在汇入图形时分开车身和车轮 Dialogue: 0,0:26:55.26,0:26:58.39,Default,,0000,0000,0000,,并制作一个简单的摆动动画 Dialogue: 0,0:26:58.39,0:27:04.38,Default,,0000,0000,0000,,相同指定2D刚体到车子上\N就能够驱动他们在屏幕上跑 Dialogue: 0,0:27:07.28,0:27:14.27,Default,,0000,0000,0000,,公交车、出租车和天鹅这三个物件\N我们用一个重复执行的脚本来制造它们 Dialogue: 0,0:27:14.27,0:27:21.84,Default,,0000,0000,0000,,BackgroundPropsSpawner脚本\N同时也处理出生位置,出生频率并给予速度 Dialogue: 0,0:27:21.84,0:27:30.52,Default,,0000,0000,0000,,代表我们可以用这个脚本应用在三种对象\N默认出生点和属性 Dialogue: 0,0:27:30.52,0:27:33.85,Default,,0000,0000,0000,,要了解更多的细节,可以查看脚本中的说明 Dialogue: 0,0:27:33.85,0:27:40.41,Default,,0000,0000,0000,,最后,要了解更多的背景动态\N我们使用了移动的云朵、流动的河水和烟雾 Dialogue: 0,0:27:41.32,0:27:50.00,Default,,0000,0000,0000,,我们在空白对象下放两个背景图片\N并使这些图片缓慢飞过屏幕 Dialogue: 0,0:27:50.00,0:27:54.65,Default,,0000,0000,0000,,因为这是个无限循环\N所以动画永远不会停 Dialogue: 0,0:27:59.18,0:28:01.03,Default,,0000,0000,0000,,这就是我们游戏的制作过程 Dialogue: 0,0:28:01.03,0:28:05.52,Default,,0000,0000,0000,,我们希望这个教学让你\N对如何用Unity开发2D游戏有一定了解 Dialogue: 0,0:28:05.52,0:28:08.97,Default,,0000,0000,0000,,未来我们也会制作更简单的教学 Dialogue: 0,0:28:08.97,0:28:14.96,Default,,0000,0000,0000,,也期待你们对于Unity4.3的反应\N迫不及待想看看你们的2D产品 Dialogue: 0,0:28:14.96,0:28:16.49,Default,,0000,0000,0000,,谢谢观看