美文网首页游戏unity3d
Unity开启篇(二) —— Unity界面及创建第一个简单的游

Unity开启篇(二) —— Unity界面及创建第一个简单的游

作者: 刀客传奇 | 来源:发表于2018-12-05 10:14 被阅读208次

    版本记录

    版本号 时间
    V1.0 2018.12.05 星期三

    前言

    Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至WindowsMacWiiiPhoneWebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。网页游戏 坦克英雄和手机游戏王者荣耀都是基于它的开发。
    下面我们就一起开启Unity之旅。感兴趣的看下面几篇文章。
    1. Unity开启篇(一) —— Unity界面及创建第一个简单的游戏 (一)

    开始

    在上一篇中,您了解了Unity界面的详细信息。 在第二部分中,您将在Unity界面中创建第一个游戏,一个小型太空射击游戏。 在此过程中,您将学习以下内容:

    • 如何使用Project window导入和组织资源。
    • GameObjectsPrefabs之间的区别。
    • 物体在Unity中运动的原理。
    • 摄像机如何工作以及可以使用哪种类型的投影。
    • Unity中材料的基础知识。

    本教程将概述Unity的各种系统。 您将从所有预先创建的资源中组装游戏,而在后续教程中,您将在创建自己的资源并编写自己的脚本时深入了解Unity的子系统。 完成后,结果将如下所示:

    有很多东西可以要准备,所以把你的手机放在飞行模式,锁上门,并开启你的思想Unity世界!

    打开本教程的示例文件;它们包含三个文件夹:game assets, modelsstarter project。 您可以简单地使用在本教程的第一部分中处理的项目,也可以使用File \ Open Project从Unity中的文件夹启动项目打开项目,然后选择Space Debris项目文件夹。

    注意:在Unity中打开项目与其他程序略有不同。 您可以在文件浏览器中单击场景文件,也可以从Unity中选择项目文件夹:

    在文件系统中,从示例文件集合导航到game assets文件夹,选择该文件夹中的所有文件,然后将它们拖到UnityProject 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,ScreenWrapShipController脚本,然后将它们拖到Script文件夹中。

    接下来,选择background-music, explosionshoot声音文件并将它们拖到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

    如上一篇所述,层次结构中的所有内容都将是一种GameObjectGameObject本身包含所谓的变换(transform),它包含有关GameObject的位置,比例和旋转的信息:

    您可以通过向它们添加组件来自定义GameObjects;您可以将组件视为表示GameObject的行为和外观。

    例如,您可以添加一个照明组件来照亮您的GameObject。 您可以添加音频源以使GameObject发出声音,甚至可以将您自己的组件编写为脚本并将它们附加到GameObjects

    GameObjects也可以充当容器。 按住Alt键并单击Hierarchyhextraction_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,RevertOpen

    SelectProject window中定位Prefab。 当您在Project window中的复杂文件夹结构中放置Prefab时,这尤其有用。 现在试试看看会发生什么。

    当您对Prefab进行更改时,您将看到Apply按钮代替SelectApply允许您将更改推送到该Prefab的所有其他实例。 Revert按钮可将对Prefab实例所做的任何更改反转为原始Prefab的状态。 最后,Open在生成它的程序中打开模型文件,例如MayaBlender

    目前,玩家的船底下有一个平铺的网格,看起来有点奇怪。 从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真的很有帮助。

    Go forth my unstoppable army of spaceships! Muhahahah!

    最后,花点时间保持Project窗口的有序:单击Assets文件夹以显示其内容。 然后将hextraction_pod拖到Models文件夹中,将p_pod_文件拖到Textures文件夹中。

    注意:您可以像创建normal maps一样创建一个新文件夹,但为了简单起见,您可以将它们放在Textures文件夹中。

    别忘了保存你的工作。


    Controlling the Camera

    如果宇宙飞船不能移动,它就没有用。 在本节中,您将赋予玩家对太空船的控制权。 要做到这一点,你需要处理两件事:相机和物理系统。 别担心,今天你不需要处理亚原子粒子物理!

    首先,您需要设置飞船。 在Hierarchy窗口中选择Spaceship,然后使用Inspector窗口将其position设置为X = 3.74,Y = 1.99Z = 10。然后将旋转设置为X = 270,Y = 0Z = 0以便值在Inspector窗口中,匹配如下所示:

    查看Game view,您可以看到船仍然离摄像机太近:

    有两种方法可以解决此问题:您可以将船向后移动,也可以配置相机。 准备成为摄影助理!

    在层次结构中选择Main Camera,你会在Inspector中看到一个Camera组件。 这里有很多选项,但现在忽略除投影(Projection)和视野(Field of View)之外的所有内容:

    您可以为投影场选择PerspectiveOrthographic;这个选择决定了游戏的最终外观。 透视投影(Perspective projection)表现得非常像你的眼睛;物体离眼睛越近,它就越大。 正交投影(Orthographic projections)丢弃深度信息;靠近你的物体,或者在这种情况下,相机,将显示与更远的物体相同的尺寸:

    The two cubes in the left are being shown with Perspective projection while the cubes on the right are Orthographic

    一般来说,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视图中

    If you are using a retina display the green lines are extremely thin! Unity is looking into customisability or making the editor dpi sensitive to improve this

    在本教程中,您将保持简单并使用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,从层次结构中删除子弹的实例。

    再次选择您的太空船,并使用InspectorBullet Prefab添加到Bullet区域。Inspector应该如下:

    最后,天空背景有点不合适。 你希望宇宙飞船在黑暗的空间中飞行,不是吗?

    在层次结构(Hierarchy)中选择主摄像头(Main Camera),然后使用InspectorClear Flags设置为Solid ColorBackground Colorblack

    保存你的工作,运行你的游戏并按空格键用离子炮轰击!


    Putting the Debris in Space Debris

    到目前为止,你有一艘可以射击的船,但是如果有射击的东西会更有趣。 现在是时候添加一些小行星了。

    在文件中找到rock_d_05.obj文件,然后将其拖到Project窗口的Models文件夹中。

    双击rock_d_05.obj并将其重命名为Asteroid

    该文件仅包含有关模型本身的信息;它没有包含任何动画。

    Asteroid模型拖动到Scene视图中以创建它的实例。 你会看到小行星目前是纯白色的:

    A cute couple? I’ll give them a week! It looks like it could be a rocky relationship

    虽然你可以说它是雪白彗星的碎片,你应该学习如何纹理你的模型......除非你想创造一个以雪为主题的游戏。

    展开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 ColliderRigidbody和音频源(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 GameObjectScale设置为(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 GameObjectInspector中的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)。 通过这个小技巧,你可以确定SpaceshipDebris在同一平面上。

    接下来,将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界面及创建第一个简单的游戏,感兴趣的给个赞或者关注~~~

    相关文章

      网友评论

        本文标题:Unity开启篇(二) —— Unity界面及创建第一个简单的游

        本文链接:https://www.haomeiwen.com/subject/bcpvcqtx.html