版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.12.05 星期三 |
前言
Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。网页游戏 坦克英雄和手机游戏王者荣耀都是基于它的开发。
下面我们就一起开启Unity之旅。感兴趣的看下面几篇文章。
1. Unity开启篇(一) —— Unity界面及创建第一个简单的游戏 (一)
开始
在上一篇中,您了解了Unity界面的详细信息。 在第二部分中,您将在Unity界面中创建第一个游戏,一个小型太空射击游戏。 在此过程中,您将学习以下内容:
- 如何使用
Project window
导入和组织资源。 -
GameObjects
和Prefabs
之间的区别。 - 物体在Unity中运动的原理。
- 摄像机如何工作以及可以使用哪种类型的投影。
- Unity中材料的基础知识。
本教程将概述Unity的各种系统。 您将从所有预先创建的资源中组装游戏,而在后续教程中,您将在创建自己的资源并编写自己的脚本时深入了解Unity的子系统。 完成后,结果将如下所示:
有很多东西可以要准备,所以把你的手机放在飞行模式,锁上门,并开启你的思想Unity世界!
打开本教程的示例文件;它们包含三个文件夹:game assets
, models
和 starter project
。 您可以简单地使用在本教程的第一部分中处理的项目,也可以使用File \ Open Project
从Unity中的文件夹启动项目打开项目,然后选择Space Debris
项目文件夹。
注意:在
Unity
中打开项目与其他程序略有不同。 您可以在文件浏览器中单击场景文件,也可以从Unity
中选择项目文件夹:
在文件系统中,从示例文件集合导航到game assets
文件夹,选择该文件夹中的所有文件,然后将它们拖到Unity
中Project window
中的Assets
文件夹中:
注意:如果没有看到
Project window
,请选择Window \ Layouts \ 2 by 3
。
Unity
完成导入文件后,您的Project window
将如下所示:
Unity默认使用大缩略图,但如果您更喜欢使用列表,则可以这样更改:在Project window
的底部,将slider
向左移动以缩小资源缩略图。
虽然将所有资源放在一个地方很好,但它们组织得不太好 - 或者根本没有! 当您第一次启动项目时,这似乎不是一个大问题,但随着您的项目扩展,您的资源集合也将扩展。
通过预先组织您的资源,您将花费更少的时间来搜索您的资源,并花更多的时间来构建您的游戏。
下一步是将资源整理到文件夹中。 在Project window
中,单击Create
按钮,然后从选项列表中选择Folder
:
将新文件夹命名为Materials
。 您的Project window
现在应如下所示:
现在创建以下五个文件夹来保存其余资源:
Models
Prefabs
Scripts
Sounds
Textures
Unity中的文件夹与您计算机上的文件夹非常相似。 您可以创建子文件夹并将文件夹拖入和拖出其他文件夹。 底层文件系统将与Unity中的组织相匹配,这使您可以轻松地在Unity之外找到您的资源。
现在,是时候组织起来了! 选择Bullet,Debris,GameManager,IonCannon,RendererFade,ScreenWrap
和ShipController
脚本,然后将它们拖到Script
文件夹中。
接下来,选择background-music, explosion
和 shoot
声音文件并将它们拖到Sounds
文件夹中。
最后,选择flint_like_rock_4787
纹理并将其移动到Textures
文件夹中。
您的Project window
现在应如下所示:
此时,您可能很想开始制作游戏。 但是在你走得太远之前,你需要养成保存工作的习惯,因为Unity不提供自动保存功能。 如果Unity崩溃或断电了,除了项目组织之外,你将失去一切。
Unity将您的工作保存在场景(scenes)
中。 场景可以是游戏中的许多级别,或者它可以是整个游戏中唯一的“级别”。 在这个游戏中,你只需要使用一个场景。
单击Command-S
保存您的游戏。 将打开一个保存对话框;为你的场景命名Main
如下:
Working with GameObjects and Prefabs in Unity
没有玩家的游戏会怎样? 从先前的示例文件中查看models \ player
文件夹;你会看到一个FBX
文件和一些图像文件。
FBX
文件包含创建3D模型以及其他内容(如动画)所需的所有数据。 您将在此Unity教程中使用的player文件由ComboMash为其游戏Hextraction创建。
选择player
文件夹中的所有文件,然后将它们拖到Project window
窗口中Assets
文件夹的顶部。 您将看到以下对话框:
某些图像文件传达Unity
的额外信息,但保存为标准图像格式。 在这种情况下,p_pod_normal.jpg
定义曲面的深度,该曲面提供表面光照信息,而无需创建其他几何体。 这称为法线贴图(normal map)
。
但是,Unity认为它正在处理常规图像。 单击Fix Now
以指示Unity
将此文件视为常规法线贴图。
导入player
文件后,将hextraction_pod
资源从Project window
拖到Scene view
中,如下所示:
酷 - 你已经创建了第一个模型实例。 Unity正确导入纹理并将其应用于模型。
您还会注意到Hierarchy
现在列出了新的GameObject
:
如上一篇所述,层次结构中的所有内容都将是一种GameObject
。 GameObject
本身包含所谓的变换(transform)
,它包含有关GameObject
的位置,比例和旋转的信息:
您可以通过向它们添加组件来自定义GameObjects
;您可以将组件视为表示GameObject
的行为和外观。
例如,您可以添加一个照明组件来照亮您的GameObject
。 您可以添加音频源以使GameObject
发出声音,甚至可以将您自己的组件编写为脚本并将它们附加到GameObjects
。
GameObjects
也可以充当容器。 按住Alt
键并单击Hierarchy
中hextraction_pod
左侧的disclosure triangle
。 这将扩展GameObject
及其下的所有级别。 您将看到以下GameObjects
集合:
其中很多是代表模型结构的空GameObjects
。 导入模型时,Unity会创建这些GameObject
。 其他GameObjects
(例如pod_mesh
的子节点)包含诸如Skinned Mesh Renderers
之类的组件,以在屏幕上显示几何体。
您会注意到层次结构中的某些游戏对象标记为黑色,而其他游戏对象标记为蓝色:
黑色表示它是标准的GameObject
。 蓝色文本告诉您GameObject
通过Prefab
连接到其他对象。 有时GameObjects
也会变成棕色。 这意味着他们已经失去了Prefab
连接。
Prefab
允许您使用代码或通过将新实例拖动到Scene view
视图中来轻松复制GameObjects
。 这有点像使用沙子形式。 除此之外,Prefab
的实例都已连接。 更改Prefab
时,实例也会更改。
在Scene view
视图中有Prefab
实例后,您可以根据需要自定义Prefab
。 有时您可能希望将这些更改推送到现有的Prefab
(因为您喜欢它们)或将实例重置为原始Prefab
的状态(因为您搞砸了)。
在层次结构中选择hextraction_pod
。 在Inspector
窗口中,您将看到三个按钮:Select,Revert
和Open
:
Select
在Project window
中定位Prefab
。 当您在Project window
中的复杂文件夹结构中放置Prefab
时,这尤其有用。 现在试试看看会发生什么。
当您对Prefab
进行更改时,您将看到Apply
按钮代替Select
。 Apply
允许您将更改推送到该Prefab
的所有其他实例。 Revert
按钮可将对Prefab
实例所做的任何更改反转为原始Prefab
的状态。 最后,Open
在生成它的程序中打开模型文件,例如Maya
或Blender
。
目前,玩家的船底下有一个平铺的网格,看起来有点奇怪。 从Hierarchy
中选择tile_reference GameObject
;它是hextraction_pod GameObject
的直接子代。
注意:不要忘记您可以在层次结构的搜索栏中键入要查找的对象的名称以节省时间。
在Hierarchy
结构中选择tile_reference
后,按Cmd(或CTRL)-Delete
删除网格。 Unity将向您显示以下警告:
Unity警告你,这样一个重大变化将破坏与prefab
的连接。 由于您确定要执行此操作,请单击Continue
。 您会注意到hextraction_pod
标有黑色文本,表示它已恢复为普通的旧GameObject
:
接下来,右键单击Hierarchy
窗口中的hextraction_pod
,从出现的下拉菜单中选择Rename
,然后将GameObject
重命名为Spaceship
。
现在将Spaceship
拖动到Project
窗口的Prefabs
文件夹中:
将GameObject
拖动到Project
窗口会将其转换为prefab
,而无需您做任何额外的努力。 您可以通过将它们从Project window
拖动到Scene view
中来创建任意数量的Spaceship
实例。 目前,这仅复制模型,但稍后它可能包含脚本,音频设置等等。 所以你已经可以看到,Prefabs
真的很有帮助。
最后,花点时间保持Project
窗口的有序:单击Assets
文件夹以显示其内容。 然后将hextraction_pod
拖到Models
文件夹中,将p_pod_
文件拖到Textures
文件夹中。
注意:您可以像创建
normal maps
一样创建一个新文件夹,但为了简单起见,您可以将它们放在Textures
文件夹中。
别忘了保存你的工作。
Controlling the Camera
如果宇宙飞船不能移动,它就没有用。 在本节中,您将赋予玩家对太空船的控制权。 要做到这一点,你需要处理两件事:相机和物理系统。 别担心,今天你不需要处理亚原子粒子物理!
首先,您需要设置飞船。 在Hierarchy
窗口中选择Spaceship
,然后使用Inspector
窗口将其position
设置为X = 3.74,Y = 1.99
和Z = 10
。然后将旋转设置为X = 270,Y = 0
和Z = 0
以便值在Inspector
窗口中,匹配如下所示:
查看Game view
,您可以看到船仍然离摄像机太近:
有两种方法可以解决此问题:您可以将船向后移动,也可以配置相机。 准备成为摄影助理!
在层次结构中选择Main Camera
,你会在Inspector
中看到一个Camera
组件。 这里有很多选项,但现在忽略除投影(Projection)
和视野(Field of View)
之外的所有内容:
您可以为投影场选择Perspective
或Orthographic
;这个选择决定了游戏的最终外观。 透视投影(Perspective projection)
表现得非常像你的眼睛;物体离眼睛越近,它就越大。 正交投影(Orthographic projections)
丢弃深度信息;靠近你的物体,或者在这种情况下,相机,将显示与更远的物体相同的尺寸:
一般来说,3D游戏应该使用透视投影(Perspective projection)
。 没有深度的游戏,如2D游戏,应该使用正交投影(Orthographic projection)
。
虽然您的游戏具有3D元素,但游戏玩法基本上是2D。 在Projection
字段中,选择Orthographic
。 接下来,将Size
设置为18.85
。 您的游戏视图应如下所示:
宇宙飞船应该飞,不是吗? 要做到这一点,你必须用C#
或UnityScript
编写一些代码来逐帧移动。 为了节省一些工作,示例文件包含一个可以使用的脚本。 问题是,你如何将它添加到你的飞船上?
脚本只是另一种类型的组件,有很多方法可以向GameObjects
添加组件。 您将在本教程中尝试一些方法。
现在,从Hierarchy
中选择Spaceship
。 然后从菜单栏中选择Component
选项。 在底部,您将看到一个名为Scripts
的选项,其中包含可用脚本的弹出菜单。 选择Ship Controller
脚本:
您现在应该看到Ship Controller
脚本已作为Script
组件添加到Inspector
窗口中的Spaceship GameObject
。
就像您可以使用其他组件一样,您可以在脚本中定义可以在编辑器中访问的字段。 这使您能够在玩游戏时更改脚本的属性:
将脚本的Move Speed
设置为22
,将Rotation Speed
设置为2
。移动速度决定了船的速度,而旋转速度决定了船的转弯速度。 点击Unity
界面顶部中间的Play
按钮。 这开始了游戏。 使用箭头键移动您的船。
不幸的是,你的船将从屏幕上飞到半人马座阿尔法星以及更远的地方。 你需要解决这个问题。
像以前一样使用菜单栏将ScreenWrap
脚本添加到太空船:
您会注意到此脚本有一个名为Renderers
的字段,该字段采用蒙皮网格渲染器数组,即创建模型的几何体。 如果渲染器不在屏幕上,则它会根据游戏对象的移动方向和当前位置将游戏对象传送到屏幕上的另一个位置。
展开Spaceship
节点,直到找到body GameObject
,然后将body GameObject
拖到Renderers
field中:
现在运行你的游戏。
你记得保存你的工作吗?
Introducing Physics
只有一个主要问题。 在你的船上飞行时,你违反了物理定律之一。 不,不是牛顿的物理定律 - Unity
物理学的最佳实践定律。
Unity
使用物理进行碰撞检测;如果GameObject
没有RigidBody
组件,则它被视为static colliders
。 这意味着Unity假设它将保持静止,这允许在碰撞检测方面进行大量优化。 但! 当您开始移动这些静态对象时,Unity必须重新计算这些优化,这会给游戏增加不必要的CPU时间。
为了避免这种不必要的CPU开销,您需要通过添加Rigidbody
组件来选择加入物理引擎。 您已经直接从菜单栏添加了组件;这次,在Hierarchy
中仍然选择了Spaceship
,单击Inspector
中的Add Component
按钮:
你会看到一个组件菜单出现;点击Physics
然后Rigidbody
:
该组件还有很多选项。 是否是您感兴趣的Kinematic
。设置此选项意味着您要手动移动GameObject
但仍希望对象注册碰撞。 当您通过脚本移动项目(例如您在此处或通过动画)时,这非常有用。
勾选Is Kinematic
复选框;由于您未在此游戏中使用重力,请取消选中Use Gravity
复选框,如下所示:
这个游戏的目的是飞来飞去射击各种类型的物体。 当然,处理碰撞将在这种类型的游戏中发挥重要作用。 您需要知道玩家何时射击小行星或玩家撞到什么东西。
碰撞器让你监听并回应碰撞。 有许多类型的碰撞器可用于基本形状,例如Sphere Collider and Box Collider
。 甚至还有一个基于3D模型的网格对撞机。 碰撞器使用绿线显示在Scene view
视图中
在本教程中,您将保持简单并使用Sphere Collider
。
在Hierarchy window
窗口中选择Spaceship
,然后单击Inspector window
中的Add Component
按钮。 单击Physics \ Sphere Collider
,您将看到Spaceship
后面的绿色圆圈:
呃,等等 - 为什么对撞机在太空船后面? 那是因为当你早先改变它的位置时,宇宙飞船的实际模型已经偏离了父场景。
在Hierarchy
结构中选择了Spaceship
后,在Inspector
中找到您的Sphere Collider
。 将Center
设置为X = 0,Y = 4.09,Z = -0.72
,然后将Radius
设置为3.14
。 最后,选中Is Trigger
复选框。 Kinematic GameObjects
无法注册正常碰撞,但它们可以侦听来自其他Kinematic
对象的触发事件。
您的Sphere Collider
组件应如下所示:
碰撞还应该包围宇宙飞船,如下:
Arming the Cannons - 武装大炮
虽然四处飞行很有趣,但是大多数玩家都有发射几十个光子鱼雷的首要愿望!为您提供了一个脚本来帮助满足这种渴望。
在Hierarchy
中选择Spaceship
,打开Assets / Scripts
文件夹,然后将IonCannon
脚本从Project
窗口拖到Inspector
窗口:
您会注意到Audio Source
组件已自动添加到GameObject
以及脚本中。 有些脚本需要组件;如果在GameObject
上找不到组件,它们将自动添加。
要使对象播放声音,您需要音频源和音频片段。 音频源可以附加到任何GameObject
,而音频片段只是一个音频文件。
将射击声音从Project window
中的Sounds
文件夹拖动到Fire Sound
的Field中:
您会注意到Ion Cannon
脚本有一个Bullet
区域。 你的工作是创建一个bullet
对象。 如果你不是艺术家,请不要担心 - 一个简单的球体就足够了。
单击Hierarchy
中的Create
按钮。 从菜单中选择3D Object
,然后选择Sphere
:
在层次结构中选择Sphere
,然后使用检查器将scale
设置为(.47,.47,.47)
。在层次结构中选择Sphere
并将其命名为Bullet
。
由于您的子弹将在场景中移动,因此它也需要选择加入物理引擎。你还记得你需要做什么吗?给它一个旋转,如果你卡住了,检查下面的spoiler
。
从
Hierarchy
中选择Bullet
,然后单击Inspector
中的Add Component
按钮。选择Physics \ Rigidbody
以添加Rigidbody
组件。
子弹将需要移动速度,因此请确保未选中Is Kinematic
。此外,请确保未选中Use Gravity
。
即使它飞离屏幕,子弹也会继续行驶,就像你的宇宙飞船最初一样。将Bullet
脚本从Project
窗口拖到Bullet GameObject
上。现在,当子弹飞离屏幕时,它会自动被摧毁。
最后,将Bullet
对象拖到Project
窗口的Prefab
文件夹中。这会创建一个子弹的Prefab
,允许您使用脚本创建大量Bullet
。
现在您已将子弹创建为Prefab
,从层次结构中删除子弹的实例。
再次选择您的太空船,并使用Inspector
将Bullet Prefab
添加到Bullet
区域。Inspector
应该如下:
最后,天空背景有点不合适。 你希望宇宙飞船在黑暗的空间中飞行,不是吗?
在层次结构(Hierarchy)
中选择主摄像头(Main Camera)
,然后使用Inspector
将Clear Flags
设置为Solid Color
和Background Color
为black
:
保存你的工作,运行你的游戏并按空格键用离子炮轰击!
Putting the Debris in Space Debris
到目前为止,你有一艘可以射击的船,但是如果有射击的东西会更有趣。 现在是时候添加一些小行星了。
在文件中找到rock_d_05.obj
文件,然后将其拖到Project
窗口的Models
文件夹中。
双击rock_d_05.obj
并将其重命名为Asteroid
。
该文件仅包含有关模型本身的信息;它没有包含任何动画。
将Asteroid
模型拖动到Scene
视图中以创建它的实例。 你会看到小行星目前是纯白色的:
虽然你可以说它是雪白彗星的碎片,你应该学习如何纹理你的模型......除非你想创造一个以雪为主题的游戏。
展开Asteroid GameObject
并选择名为rockLP001
的子对象。在Inspector
中,您将看到这个子GameObject
附加了一个Mesh Renderer
组件。渲染器将对象绘制到屏幕上,但需要一些帮助来做到这一点 - 这就是Materials
发挥作用的地方。
材质Materials
决定了对象的外观。例如,棉质衬衫看起来与石膏墙看起来有很大不同。
Unity
通过使用每种材质封装着色器来实现此目的。你问什么是着色器?这是一个用类似C语言编写的简单程序,可以在GPU上运行。着色器可以很简单,可以在立方体上渲染纹理,也可以很复杂,可以模拟水。
Unity提供了许多不同的着色器,例如渲染天空盒,或使对象显得半透明。
在Project
窗口中打开Materials
文件夹,然后单击Create
按钮。从下拉列表中选择Material
并将其命名为Asteroid
。在Inspector
窗口中,您现在将看到material
的可用属性。
- 1)
Shader
选项允许您从众多预打包的着色器中选择一个。 默认的标准着色器具有极大的灵活性,因此请选择它。 - 2) 当一个小行星被击中时,你会想要淡出它,所以将
Rendering Mode
设置为Fade
。 - 3)
Albedo
属性保持实际纹理;你可以通过提供颜色来着色。
将flint_like_rock_4787
图像从Project
窗口中的Textures
文件夹拖动到Albedo
属性:
- 4) 您会注意到材料看起来有点过于光滑,就像它经过抛光一样:
在Metallic
属性下,你会看到两个滑块。 第一个滑块确定材料的金属外观,而另一个确定纹理的粗糙程度。
现在,将Metallic
滑块设置为0.219
。
- 5)
Smoothness
滑块为0.149
。 您的材料现在应该如下所示:
使用所有配置的材料,您现在需要将其添加到小行星。 将“小行星”(Asteroid)
材质从Project
窗口拖动到“场景”视图(Scene view)
中的“小行星游戏对象”(Asteroid GameObject)
:
真棒! 你有一个小行星准备好引起很多麻烦,但首先你需要添加一些行为。 将Debris
脚本从Scripts
文件夹中的Project
窗口拖到Asteroid
。
Debris script
自动向小行星添加了Sphere Collider
,Rigidbody
和音频源(Audio Source)
。 现在设置所有必需的属性:
- 1) 将
Sphere Collider
的中心设置为(0.01,-0.09, 0.89)
- 2) 而半径为
1.49
。 - 3) 同时选中
Is Trigger
复选框。 - 4) 对于
Rigidbody
,取消选中Use Gravity
复选框 - 5) 并选中
Is Kinematic
复选框。 - 6) 对于碎片脚本
(Debris script)
,将Min Speed
设置为15
- 7) 将
Max Speed
设置为30
- 8) 并将爆炸
(explosion)
声音文件从Sounds
文件夹拖到Explosion Sound
区域。 - 9) 对于变换,
Asteroid GameObject
将Scale
设置为(3.02,3.02,3.02)
。 - 10) 添加
Debris
脚本还添加了所需的Renderer Fade
脚本。 当子弹与小行星碰撞时,小行星应逐渐消失,而不是简单地从屏幕上消失。 脚本只需要淡入淡出时间,因此将淡入淡出(Fade Time)
时间设置为0.5
。
当小行星从屏幕上漂移时,它们应该像宇宙飞船一样包裹起来。 从Project
窗口的Scripts
文件夹中,将ScreenWrap
脚本拖动到Asteroid
。 就像您使用Spaceship
一样,您需要使用正确的渲染器配置ScreenWrap
。
Asteroid
有一个名为rockLP001
的子GameObject
。 将此子GameObject
拖动到Asteroid GameObject
的Inspector
中的Screen Wrap Script
组件的Renderers
属性:
最后,将“小行星”(Asteroid)
从“层次结构”(Hierarchy)
拖动到Project
窗口中的Prefab
文件夹。 现在您已完成创建Asteroid Prefab
,从层次结构中删除Asteroid
实例。
你需要的最后一件事是所有小行星的生成点。 单击Hierarchy
中的Create
按钮,然后选择Create Empty
。 将你的生成点命名为Debris
。
你会希望这个生成点与玩家在同一个平面上;否则,玩家将飞过碎片上方或下方。 一个好的GameObject
用作参考是missle_R_0
,因为它位于模型的中心。
拖动Debris GameObject
并使其成为missle_R_0
的子项。 然后,碎片(Debris)
的变换坐标将相对于其父GameObject
。 要匹配父级的坐标,请将(Debris)
位置设置为(0,0,0)
。 通过这个小技巧,你可以确定Spaceship
和Debris
在同一平面上。
接下来,将Debris
移动到最初的Hierarchy
视图的底部:
将Debris GameObject
向右移动15个点。 如果你没有设法得到完全相同;它的新位置应该是(20.0,1.72,7.06)
:
Putting It All Together
现在您已经配置了您的船和小行星,您需要将所有元素组合在一起并创建一个简单的游戏。
单击Hierarchy
中的Create
按钮,然后选择Create Empty
。在Inspector
中,单击新GameObject
的名称并将其命名为GameManager
。
在Hierarchy
中选择GameManager
后,单击Add Component
按钮,选择Scripts
,然后选择GameManager
。您会看到此操作也添加了音频源。此外,GameManager
组件有几个字段,您需要设置它们将用于生成小行星。
从Debris
字段开始。确保在层次结构中选择了Game Manager
,并将小行星预制件(Asteroid Prefab)
拖动到Debris field
中。那你在这做什么? GameManager
负责产生小行星。它使用Debris field
来决定产生哪些对象。你告诉它使用(Asteroid Prefab)
。
接下来仍然在GameManager
上将Min Time
设置为2,将Max Time
设置为5。这告诉脚本它应该以多快的速度产生小行星。将Total Items on Screen
设置为5,这将小行星的数量限制为5,这样玩家就不会被淹没。将碎片游戏对象(Debris GameObject)
从Hierarchy
拖动到Screen Debris field
。这指定GameManager
应该在Debris GameObject
上产生小行星。
GameManger
组件应如下所示:
最后,在Audio Source
组件中,将background-music
添加到AudioClip
字段,并确保选中loop
复选框。
运行游戏并查看一切的外观:
恭喜 - 你已经在Unity
中构建了你的第一款游戏! 在后面的教程中,您将了解Unity的各个子部分,这些部分真正让您了解这个游戏。 您还将学习如何编写自己的脚本以利用Unity的灵活API。
后记
本篇主要讲述了Unity界面及创建第一个简单的游戏,感兴趣的给个赞或者关注~~~
网友评论