查看原文
其他

【教程】12个步骤让你快速学会制作3D游戏

2016-08-11 翻译 杨嘉鑫 Gad-腾讯游戏开发者平台


Unity3D不仅是一款功能强大且易于上手的游戏引擎,更重要的是,它还可以被免费下载(它还有一个功能更强大的付费版,但其实你可以使用免费版本完成绝大部分工作)。


你大可不必被它的名字误导,Unity既可以创建2d游戏也可以创建3d游戏。你可以使用C#, Java, 或者一种和Python类似的称为 Boo的语言进行编程。在本教程中,我将带你熟悉Unity的环境,并向你教你如何使用Unity创建一个简单的游戏。
尽管在学习这个教程的过程中,你不需要任何编程经验,但我还是建议你(有一定经验),因为如果你有一些编程背景的话,你在校对代码错误的过程中会更轻松。
此教程是基于Unity网站上的 RollaBall tutorial(RollaBall教程)的。你可以在Unity tutorial webpage网上找到大量的免费教程。我写这个教程的主要目的是为了自己练习使用Unity,同时还为了给相关给视频教程做一套系统的书面补充说明。
步骤1:创建一个新项目


打开Unity3D, 单击“File”(文件)下的“New Project”(新项目)

为你的项目选择一个位置。我喜欢用一个专门的文件夹来保存我所有的项目。键入您的项目的名称。在截图中,这个新的项目被称为“MyGame”。在点击创建按钮之前你应当看到这个截图。 点击“Create.”(创建)。
步骤2:自定义布局


你要做的第一件事就是自定义布局。每一个窗口都可以被点击并被并拖动到相应的位置。或者你也可以在屏幕左上角的布局里单击下拉菜单使用由Unity提供的默认布局。我喜欢Tall(高的)布局,因为它可以更容易的把游戏视图放到场景视图下面。


在使用Unity时你大部分时间都在是使用以下五个窗口。他们分别是Scene(场景), Game(游戏), Hierarchy(层次结构), Project,(项目)和inspector(检查窗口)。在这五个步骤的开头,你都将看到每个窗口各自的图像。 

Scene(场景)
这是游戏制作的地方。它显示了你游戏中存在有哪些元素,以及他们彼此间的相对位置。在右上角有一个标示块用来显示场景的空间方向。 

Game(游戏)
它显示的主要是在游戏时主视角所看到的东西。你可以通过点击屏幕顶部中间的play(播放)按钮,来在这个窗口中测试你创建的游戏。 

Hierarchy(层次结构)
它列出了所有被你添加进场景里的元素。同时它也是默认的主视角。你可以通过单击“Create”选择要你想要创建的对象类型从而创建新的元素。你还可以通过使用位于屏幕上方的GameObject(游戏对象)下拉菜单完成上述操作。 

Project(项目)
它显示正在使用的游戏文件。你可以通过点击Project window.下的“Create”来创建新的文件夹,脚本等等。 

Inspector(检查窗口)
这是你用来自定义场景中每个元素各自特征的地方。只要在Hierarchy window (层次结构窗口)中选择一个对象,或者双击Scenewindow(场景窗口)中的对象,系统就会在Inspector panel(检查面板)中显示出它的属性。
步骤3:保存并生成场景


单击Save Scene. (保存场景),在文件夹中以[项目名称]- Assets的形式保存场景。Assets是一个你为了存储场景和脚本而事先创建好的文件夹。为了防止Assets文件夹变得混乱,你还需要创建一个名为Scene(场景)的文件夹。

 将你的场景保存为Scene 或者是Main再或者是与之相似的形式,单击Build Settings (“生成设置”)文件夹。 把当前场景加入到工程中。 选择你所需要的平台。这将会有包括电脑,游戏系统和智能手机在内的很多选项,但如果这是你第一次创建项目,你最好选择Web Player 或PC/Mac/Linux 这样的独立平台。在BuildSettings (“生成设置”)窗口的底部单击Player Settings(“播放器设置”)。这将打开inspector(检查窗口)中的播放器设置选项。在这里,您可以更改公司名称、产品(游戏)名称、默认图标等。 关闭“生成设置”窗口。这是当你完成你制作的游戏时,你将会回到的地方。
步骤4:创建stage


在Unity中创建stage最简单的方法是添加cubes。为了做到这一点,你需要依次在GameObject(游戏对象)中找到 Create Other 下的 Cube(立方体)选项来添加。或在Hierarchy window(层次结构窗口)中使用Create (创建)菜单来添加一个cube(立方体)。

 通过右键单击Inspector panel (检查面板)中的“Transform(变换)来重新设置cubes(立方体)的参数。以后每当你创建一个新的游戏对象,这都不失为一个很好的方法。 在Hierarchy(层次结构)中选择cube(立方体)。在Hierarchy(层次结构)双击它的名称或使用Inspector panel.(检查面板)将他重命名为“wall”(墙)。在x轴方向上堆建一排cubes(立方体)使它的长度足够长并看起来像一面墙一样。右键单击Hierarchy(层次结构)中的“wall”(墙),并将它复制三次,从而使你得到四面墙。因为这四面墙是一模一样的,并且它们在空间上位于相同的位置,所以你看它们就像只有一面墙一样。接下来你需只要将它们分别拖动到相应位置或使用transform options(转换选项),对它们进行排列使它看起来像一个arena(舞台)即可。 注:如果想要查看场景视图,你可以通过使用鼠标中键进行平移和滚动,放大和缩小。你可以在按住ALT键的同时拖动鼠标,从而实现视图的旋转。 你可以使用在屏幕的顶部Game Object下拉菜单,创建一个新的空白的游戏对象,并把它命名为“stage”(舞台),重新设置它的transform.参数。 将所有的四个“wall”全部选中,把他们拖入到 “stage”(舞台)这个游戏对象中。 通过在Hierarchy(层次结构)面板中选择“create”来添加一个平面的游戏对象。我们把这个对象当做地板来用。接下来将这个对象命名为“floor” (地板),并将它拖动到Hierarchy(层次结构)中的“stage”(舞台)下面。 注:你需要在进行重命名以后按下回车键,否则你进行的更改是不会生效的。为了使“floor” (地板)和四面墙无缝连接,你需要将“floor”(地板)的transform参数在y轴上设置为-0.5。为了使你的墙和“floor” (地板)在比例上相匹配,你需要把“floor” (地板)在X,Y和Z轴上的scale(比例尺)设置为1 /10。
步骤5:创建玩家


你可以在例如Unity Store等等的各种网站上下载相关人物素材。但对于本教程来说,我们只需要使用到一个Game Objects内置的玩家。

 在 Game Objects 中找到 Create Other (创建其他)下的 Sphere(球体)。 在Hierarchy(层次结构)面板中选择sphere 并将它重名为“Player”,重新设置它的transform.参数。 现在我们需要用到一些物理知识。通过点击在检查面板底部的添加组件,让你创建的Player.(玩家)服从客观的物理定律。你需要添加Physics– Rigidbody。然后舍弃所有的默认设置。 你可以在inspector(检查窗口)中看到,每个物体都有各种各样的“components”(组件)可供添加。每个立方体、球体等都拥有一个称被为collider的组件,它是用来占用屏幕物理空间的。如果你关闭它的话,物体就像幽灵一样能够穿过其他的物体。(在视频中你可以看到当玩家的collider组件部分被关掉时会发生什么。)你可以使用“components”(组件)旁边的框来对它进行打开或关闭操作。
步骤6:让你的玩家动起来


在Hierarchy(层次结构)中选择你的玩家。

 通过单击每个组件名称左边的向下箭头来最小化你不想在inspector(检查窗口)中打开的组件。这个操作将在一定程度上清理你的工作空间。单击inspector(检查窗口)底部的Add Component (添加组件)。然后在里面选择New Script(新的脚本),给这个新的脚本取一个例如 “playercontroller”的名字并选择一种编程语言。我选择的编程语言是CSharp。单击Create .(创建)和Add(添加)。为了使文件有条理,你需要在Project window(项目窗口)中打开Assets (“资产”)文件夹,然后再创建一个名为Script(脚本)的文件夹。最后把你的新脚本放在这个文件夹里。如果你要编辑脚本,双击inspector(检查窗口)中的脚本的名,或从Project window(项目窗口)中打开它。以上的操作会打开一个叫做MonoDevelop编程环境。注:如果这是你第一次编写代码,你应该知道这可是一个吹毛求疵过程。你需要保证代码拼写的正确性,例如有前括号,后括号,花括号,引用等等的情况。你还需要注意在每行结束时有没有忘记写分号。 在通常情况下,你的代码中应该包含:voidStart ()和void Update ()两部分。start后边的代码是在目标对象刚进入游戏时候开始运行的,而update后的代码是目标对象在游戏中持续运行的。我们用到的第三个部分叫做FixedUpdate,它可以用来处理相关的物理协议。它的格式如下:voidFixedUpdate () { }
在我们输入命令之前,我们需要声先明变量。我们要在页首使用花括号在:PublicClass PlayerController (或者其他类似的名称)与voidStart函数之间使用Monobehaviour。为了使目标动起来,我们使用到一个名为“速度”的变量,它可以帮我们确定我们的目标物体在舞台上移动的速度。声明变量类型为float(浮点数)并命名为speed,结果如下:
publicfloat speed; 分号是每行代码结束的标志,如果你没有在每一行的末尾写分号的话程序就会报错,所以一定不要忘记哦!
在 FixedUpdate下声明两个float(浮点数): moveHorizontal 和 moveVertical.它们的值取决于用户在键盘输入的命令值和FixedUpdate在每一个frame里刷新后赋予它们的值。(在水平和垂直维度中,它们的格式如下)floatmoveHorizontal = Input.GetAxis(“Horizontal”); float moveVertical =Input.GetAxis(“Vertical”); 接下来还是在FixedUpdate中,我们需要创建一个Vector3。它是在三维空间中用来控制物体在三个维度运动的一种函数。这个函数将把用户输入的值以目标物体水平和垂直运动的方式呈现出来。因为在这个游戏中,玩家只能在两个维度移动所以该函数在上/向方向上的值为零。
Vector3movement = new Vector3(moveHorizontal,0.0f,moveVertical); 最后,给玩家键入一个rigidbody.AddForce函数使它能够进行移动。rigidbody.AddForce是一个建立在玩家的 rigidbody组件内的协议。
rigidbody.AddForce(movement*speed*Time.deltaTime); Time.deltaTime用于使物体运动更流畅。我将在稍后介绍如何在Unity编辑器中调整速度变量。 保存CSharp文件,并切换回界面。转到玩家的Inspector(检查面板)中并查看你刚刚创建的运动脚本,在这里应该有一个框显示出速度这一公共变量。您可以使用Inspector(检查面板)来更改公共变量的值。接下来给 “speed”赋一个介于100-1000之间的值,并点击在屏幕顶部中间的 。通过使用Unity默认的移动键“ASWD”或箭头键,你就可以使这个球到处移动了。再次出测试模式。
步骤7:添加灯光


通过点击game object(游戏对象)顶部的工具栏并选择“create empty.”创建一个新的game object(游戏对象),把它名为之为“Lights”。

在Hierarchy(层次结构)中从 “create”(创建)工具栏中选择“create”创建一个定向的名为 “Main Light.”的灯光。通过把它从Hierarchy(层次结构)面板中拖动到Lights的game object(游戏对象)中,使它成为Lights一个子对象。这跟把一个文件移动到一个文件夹的概念是相似的。 在主灯的选择方面,你可以在Inspector(检查面板)中进行灯光的设置。调整阴影类型为“SoftShadows”(“软阴影”)分辨率为“Very High Resolution.”(“非常高的分辨率”)。在Inspector(检查面板)中旋转Main Light的角度,使它照亮arena(舞台),我使用的参数值是30X, 60Y, 0Z。右键单击Hierarchy(层次结构)面板中的“Main Light”并复制它。将这个复制的对象命名为 “Fill Light”(填充灯),也使它成为Lights一个子对象。 在Inspector(检查面板)中,我们采用将色调调整为浅蓝色和光强降低至0.1的方法来减弱补光强度。将阴影改为“No Shadows.”( “没有阴影”)。把Fill Light(填充光)的照射方向设置成与主灯。在我的这个例子中,此参数值是(330,300,0)。
步骤8:进行视角微调


为了得到一个在舞台上方由上向下倾斜的视角,我们需要在Hierarchy(层次结构)面板中选择Main Camera,在camera preview(预览)里调整它的角度至你满意为止。


我采用的参数是 position (0, 10.5, -10)以及rotation (45, 0, 0)。
如果你愿意的话,你也可以在场景视图中通过拖动相机来给它确定一个合适的位置。
步骤9:让相机跟随玩家移动


我们希望在屏幕上,相机能够随着玩家的移动而移动,为此我们要在Inspector(检查面板)的Main Camera(主摄像头)添加新的脚本组件并命名为“cameraMovement”。 双击脚本以便在MonoDevelop打开它。

 这个脚本将会进入game object里的玩家,所以你必须在使用“Start()”函数之前作如下声明:publicGameObject player; 通过以下语句创建一个名为“offset”的Vector3:privateVector3 offset;: 在Start()函数中将offset的值设置为offset=transform.position; 这些值分别是相机在(x,y,z)方向的位置。在一个叫LateUpdate()的函数下,我们可以根据玩家所处的位置来确定照相机的位置:voidLateUpdate () { transform.position=player.transform.position+offset;} 保存脚本然后返回到Unity界面。 我们需要在cameramovement脚本创建的“player”指定一个game object。选择Main Camera然后查看Inspector panel(检查面板),在cameraMovement 脚本下有一个名为 “Player”的方框。 它是暂时并没有被指定到任何GameObject中。把“player”从Hierarchy(层次结构)面板中拖入进这个空盒子,使得player gameobject指定到 cameramovement脚本中。 一定要将新脚本拖放到你在Assets下创建的文件夹中。 通过点击在屏幕的中心顶部的 “play”按钮,试运行游戏。你应该能够通过使用玩家附近的箭头键来使之移动,与此同时相机视角也会按照你的移动而移动。最后,保存场景和项目
步骤10:制作一些items


创建一个新的GameObject.(游戏对象)。它可以是一个球体,一个立方体,一个胶囊现状的物体,或一个圆柱体。我选择了一个立方体。


通过选择一个新的称为 的标签,然后返回到该游戏对象的中,选择你刚创建的这个新“item”标签。给你所有的。以上过程中,请务必确保你拼写正确并且已经正确区分了大小写。
将放置到一个空的中并命名为。
重新设置他们
给添加。
复制一定数量的并把这些副本放置在arena(舞台)。
步骤11:让玩家收集items并显示得分


从Inspector panel(检查面板)中选择Playergame object打开玩家的移动脚本然后对脚本进行修改修Inspector panel(检查面板)使玩家进行收集动作,并记录它所收集的items。


我们需要做两个声明:一个是记录你得分用的变量,另一个是在场景视图里显示得分的GUI text(图形用户界面文本)。(声明如下:)privateint count; public GUIText countText;
初始化,它的功能我们会再在后面介绍。count=0;CountText();
我们为碰撞时的情形编写一个新的函数。这应该是一个独立的部分,就像voidOnTriggerEnter(Collider other){ if (other.gameObject.tag == “item”) {other.gameObject.SetActive(false); count=count+1;CountText();}}
编写一个能够在GUI(图形用户界面)更新显示得分的counttext函数:VoidCountText(){ countText.text="Count: " + count.ToString();}保存代码并切换回。
选择所有的确保他们被标记为,然后确保在Inspector(检查面板)中的按钮处于“is Trigger”状态。
同时在按钮的状态。这样做是为了防止你的,从本质上说这样做是在使重力失效。
使用Hierarchy(层次结构)中的“Create”选项为countText创建一个新的GUI Text(图形用户界面文本)。
设置GUI Text(图形用户界面文本)的参数为(0,1,0),然后在Inspectorpanel(检查面板)里把GUI Text(图形用户界面文本)的offset像素值设置为
将GUI Text(图形用户界面文本)拖到之前被玩家选中的Inspector(检查面板)内的框中
步骤12:制作hazards


这些难以被发现的地方将会把你的玩家弹射到空中去,并很有可能超出arena(舞台)的边缘,以上的过程就意味着游戏的结束。制作hazards的过程与制作items的过程类似。


创建一个名新的空游戏对象命为“Hazards.”的game object。
创建一个新的Quad,然后将它命名为“Hazard.”。将它标记为hazard,,然后确认它 “Is Trigger”的状态。
改变你所选中hazard的颜色,从而使得你可以通过Inspector(检查面板)中Mesh Renderer(网格渲染器)进行查看,然后再改变它的material(材质)。单击下拉菜单中的Materials(材质),使用小灰圈给你的hazard在右边的框中选择一个有别于默认的灰颜色的Materials(材料)即可。因为我有一个已经预装的白色材料素材,所以我选择了白色。改变hazard的角度值为90,将X轴高度设置为低于Y轴0.4,这样我们就得到了一片位于arena(舞台)的floor外围的一片白色区域。
在OnTriggerEnter()函数下编辑Player脚本,使玩家知道他撞到的是一个hazard而不是一个item,同时它还能统计录玩家撞到hazard的次数。当玩家撞到hazard.时,(函数)就要告诉玩家应该跳离这里。void OnTriggerEnter(Collider other){if(other.gameObject.tag=="item"){ other.gameObject.SetActive(false);count = count + 1; CountText(); } if(other.gameObject.tag=="hazard"){other.gameObject.SetActive(false); Vector3 jump = new Vector3(0.0f, 30, 0.0f);rigidbody.AddForce (jump * speed * Time.deltaTime); }保存上述代码,返回到Unity编辑器,然后复制几个hazard。
在的周围布置这些hazards,然后试着开始游戏! 
【版权声明】原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权。

近期热文

Enlighten预处理的过程为你全面揭秘!

Glassdoor揭晓:在Valve、暴雪和Rockstar的开发者薪资是多少?

腾讯游戏开发者平台长按,识别二维码,加关注
经验分享丨项目实践项目孵化丨渠道发行做有梦想的游戏人

-GAME AND DREAM-


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存