Skip to main content
VRCHINA
AR论坛
 首页 » 未命名

Unity 宝塔对战教程

2017年01月09日 20:31:501030蛮牛网

 Unity 宝塔对战教程 未命名 第1张

这个教程详细介绍了如何在unity中制作一个漂亮的小的宝塔对战游戏。我们会一步步介绍使得每个人都可以理解。

序言

教程中我们会用完全独一无二的图像风格来创建一个小的三维宝塔对战游戏。这个游戏很容易做,不需要任何三维建模技巧,没有动画,且没有任何复杂的。很简单,我们所需要的是90行代码。

必要条件

知识

我们的教程不需要任何特殊的技巧。如果你之前了解unity并听过Gameobjects(游戏主体),Prefabs(预设)以及转变,然后你就可以准备开始了。如果你没有,不用太担心。

去阅读我们简单的教程比如Unity2D乒乓球游戏来学会使用这个引擎。

不用担心,没有恐怖的数学!

Unity 版本

我们的宝塔对战游戏是用Unity 5.3.1f1制作完成。新的版本应该可以,老的版本有的可以,有的不行。

我们不需要任何高级的特效,因此Unity的免费版本就可以了

游戏机制

对于那些从来没听过宝塔对战的人,这儿有些基本常识:

怪兽每几秒孵化的地方是个点

怪兽跑遍整个世界向着它们想摧毁的城堡

玩家可以建立城堡来攻击怪兽

另外,我们用Buildplaces.Buildplaces是在地图上预先设置好的地方,那里玩家可以建立宝塔。我们会用到它们。因为它会使得我们更容易活下来(作为对比,在地图上到处可以建立宝塔)

艺术风格

我们有两个操作:我们可以找现实主义的东西,会耗费几百个高质量的3D模型,纹理和着色器,或者我们可以找些简单但独一无二的东西。

我们的格言是跟我谈谈,比如我很厉害!因此我们不用深入到CAD工具的世界里来创建现实主义的3D模型。相反,我们会用到一个完全抽象的风格,会省去我们的许多工作,但看起来很有趣。我们会使用Unity的原件(立方体,球形,圆柱体,...)与仅有的一些颜色结合(大部分是绿色,黄色和灰色)。

这种艺术风格的好处是每个人都可以在少于一个小时的时间内创建它没有任何3D建模或动画知识。

项目建立

Unity 宝塔对战教程 未命名 第2张

请点击此处输入图片描述

我们命名为towerdefense,选择任意位置比如C:\,选择3D并点击创建项目:

Unity 宝塔对战教程 未命名 第3张

请点击此处输入图片描述

如果我在Hierarchy中选择Main Camera,然后我们可以设置背景色为黑色,调整位置和旋转如下图所示:

Unity 宝塔对战教程 未命名 第4张

请点击此处输入图片描述

注意,这会使照相机以45度角向下俯视整个游戏场景。

灯光

我们为游戏添加些灯光,以至于场景不至于太黑暗。我们通过选择GameObject->light->Directional Light来添加光源在顶部菜单中。我们可以用下面的设置来确保灯光在我们的场景中处于一个更好的角度:

Unity 宝塔对战教程 未命名 第5张

请点击此处输入图片描述

注意:我们基本可以用任何我们想要的设置,但上面那个看着比较好。

地面

我们需要某种地面使得怪兽能够行走。我们通过从顶部菜单来选择GameObject->3D Object->Plane来添加平面。我们命名为Ground并在Inspector中设置为如图所示的位置(Position)和大小(Scale).

Unity 宝塔对战教程 未命名 第6张

请点击此处输入图片描述

注意,这个大小是最合适的大小,适合于所有的Buildplaces和城堡.

我们打开我们选择的绘画工具并创建一个小的有基本绿色色调的40*40px的纹理。通过用基本色来填充来创建你自己的纹理,然后用稍微明亮或暗沉的绿色调来绘制一些随意的线条。这是我们得到的

Unity 宝塔对战教程 未命名 第7张

请点击此处输入图片描述

注意:右击这个图片,选择Save As...,导航到项目的Assets文件夹并保存它到新的纹理文件夹。

现在我们可以从项目区域的纹理文件夹内拖动纹理到地面(Ground):

Unity 宝塔对战教程 未命名 第8张

请点击此处输入图片描述

如果我们现在靠近看地面,我们可以看到纹理看起来是多么光滑

Unity 宝塔对战教程 未命名 第9张

请点击此处输入图片描述

对大多数游戏来说是好的,但对我们的宝塔对战教程,我们想纹理看起来像素化来获得一个更独一无二的风格。我们在Project Area中选择纹理并在Inspector中改变Import Settings如下图所示:

Unity 宝塔对战教程 未命名 第10张

请点击此处输入图片描述

现在看起来完全像素化了:

Unity 宝塔对战教程 未命名 第11张

请点击此处输入图片描述

注意:我们在游戏中会对所有的纹理使用这个风格。

地点

立方体地点

好了,我们需要一些地方用来给玩家建立宝塔(与其在整个场景中到处建造它,那样会更复杂)。我们会通过创建一个地点来开始然后复制它几个以至于我们能用地点来设计一些怪兽行走的迷宫。

我们选择GameObject->3D Object->立方体从顶部菜单。我们放置它于(-14,0.5,-14)并命名为Buildplace:

Unity 宝塔对战教程 未命名 第12张

请点击此处输入图片描述

注意:x,z坐标应该是四舍五入为整数比如14(而不是13.99)。Y的位置是0.5,以至于立方体能准确待在地面上,而不是嵌入到地面中。

看起来场景是这样的:

Unity 宝塔对战教程 未命名 第13张

请点击此处输入图片描述

Buildplace的纹理

我们画一个简单的8*8像素的纹理,我们可以穿上它:

tex_buildplace.png

注意:右击链接,选择Save as...保存它到项目的assets/textures文件夹

我们用下面的导入设置:

Unity 宝塔对战教程 未命名 第14张

请点击此处输入图片描述

毕竟我们可以从项目区域拖动它到Buildplace以至于纹理看起来更漂亮:

Unity 宝塔对战教程 未命名 第15张

请点击此处输入图片描述

Buildplace 脚本

我们想在用户点击Buildplace的时候就建立宝塔。这种行为总是用脚本来继承。我们通过在Inspector中选择Add Component->New Script来创建新的脚本。我们命名为Buildplace并选择CSharp作为语言:

Unity 宝塔对战教程 未命名 第16张

请点击此处输入图片描述

现在我们的Buildplace有一个脚本:

Unity 宝塔对战教程 未命名 第17张

请点击此处输入图片描述

我们在项目区域创建一个新的脚本文件夹并移动脚本到文件夹中,以至于看起来干净整洁:

Unity 宝塔对战教程 未命名 第18张

请点击此处输入图片描述

然后我们双击项目区域里的脚本并打开:

[C#] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

usingUnityEngine;

usingSystem.Collections;

publicclassBuildplace : MonoBehaviour {

    // Use this for initialization

    voidStart () {

    }

    // Update is called once per frame

    voidUpdate () {

    }

}

首先,我们不需要Start或Update方法,因此我们移除它们:

[C#] 纯文本查看 复制代码

?

1

2

3

4

5

usingUnityEngine;

usingSystem.Collections;

publicclassBuildplace : MonoBehaviour {

}

我们将需要一些公共的变量来具体化将要建立的宝塔:

[C#] 纯文本查看 复制代码

?

1

2

3

4

5

6

7

usingUnityEngine;

usingSystem.Collections;

publicclassBuildplace : MonoBehaviour {

    // The Tower that should be built

    publicGameObject towerPrefab;

}

注意:因为towerPrefab变量是公共的,我们一会儿可以在Inspector中具体化它。

下一步是点击Buildplace后,用Instantiate函数来建立宝塔。通常,Unity使得我们的生活更同意因为已经提供了OnMouseUpAsButton函数,我们可以用:

[C#] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

usingUnityEngine;

usingSystem.Collections;

publicclassBuildplace : MonoBehaviour {

    // The Tower that should be built

    publicGameObject towerPrefab;

    voidOnMouseUpAsButton() {

        // TODO build stuff...

    }

}

现在我们能做的就是在Buildplace上面建立Tower:

[C#] 纯文本查看 复制代码

?

1

2

3

4

voidOnMouseUpAsButton() {

    // Build Tower above Buildplace

    GameObject g = (GameObject)Instantiate(towerPrefab);

    g.transform.position = transform.position + Vector3.up;

}

注意:首先我们通过使用Instantiate来导入towerPrefab到游戏中。然后我们修改位置成为现在Buildplace's的位置往上移一个单位。

如果我们保存脚本并观察Inspector,我们也可以看到TowerPrefab 槽,那儿我们可以拖动宝塔到里面:

Unity 宝塔对战教程 未命名 第19张

请点击此处输入图片描述

创建更多的Buildplaces

既然一个Buildplace已经完成,我们右击Hierarchy并选择Duplicate:

Unity 宝塔对战教程 未命名 第20张

请点击此处输入图片描述

然后我们放置它到(-13,0.4,-14)以至于准确与之前那个相邻:

Unity 宝塔对战教程 未命名 第21张

请点击此处输入图片描述

我们重复这个过程几次为了给怪兽创建行走的迷宫。我们在城堡顶部留一个空白的区域:

Unity 宝塔对战教程 未命名 第22张

请点击此处输入图片描述

城堡

城堡立方体

对了,我们创建一个城堡以致于怪兽有可以攻击的地方。我们通过从顶部菜单选择GameObject->3D Object->Cube开始。我们命名为城堡(Castle),放置它到我们迷宫的空的区域并通过缩放,使它变大点:

Unity 宝塔对战教程 未命名 第23张

请点击此处输入图片描述

城堡纹理

我们再创建一个简单的16*16像素的纹理:

Unity 宝塔对战教程 未命名 第24张

请点击此处输入图片描述

注意:右击图片,选择Save As..并保存它到项目的Assets/Textures文件夹

这儿有我们城堡纹理的导入设置:

Unity 宝塔对战教程 未命名 第25张

请点击此处输入图片描述

我们从项目区域中拖动纹理到城堡并收到一个很简单但独一无二的视角:

Unity 宝塔对战教程 未命名 第26张

请点击此处输入图片描述

健康值条柱

好了,我们在城堡上添加健康值条柱。有许多种不同的方法来做,我们选个简单的做。我们为城堡添加一个3D纹理,它包括文字比如‘-’是1个健康值,‘--’是2个健康值,‘---’是3个健康值等等。

我们通过右击Hierarchy并选择创建空的并添加3D纹理到城堡:

Unity 宝塔对战教程 未命名 第27张

请点击此处输入图片描述

然后我们重命名新的游戏主体到健康柱并在Inspector选择Add Component->Mesh->TextMesh;

Unity 宝塔对战教程 未命名 第28张

请点击此处输入图片描述

我们放置它在城堡上方一个单位,然后修改TextMesh 组件来获得更好的结果:

Unity 宝塔对战教程 未命名 第29张

请点击此处输入图片描述

注意:Text属性已经包含了7x'-',相当于7个健康值。其他属性大部分被改变了,来改变字体大小和尖锐性。放置Arial到字体属性很重要。我们通过点击字体属性右边的小圈来做这个。然后Unity展现目前可用的字体列表,我们从列表中可以选择一个。

场景看起来是这样的:

Unity 宝塔对战教程 未命名 第30张

请点击此处输入图片描述

很简单。现在我们需要一个健康简本准确得做三个事情:

通过数‘-’来返回现在的健康值

通过移除‘-’来减少现在的健康

一直使得TextMesh面对照相机

我们想TextMesh来面对照相机为了避免奇怪的角度比如这个:

Unity 宝塔对战教程 未命名 第31张

请点击此处输入图片描述

对了,我们选择Add Component->New Script,命名为Health并选择CSharp。我们移动它到项目区域的脚本文件夹并打开它:

[C#] 纯文本查看 复制代码

?

1

2

3

4

5

6

7

8

usingUnityEngine;

usingSystem.Collections;

publicclassHealth : MonoBehaviour {

    // Use this for initialization

    voidStart () {

    }

[C#] 纯文本查看 复制代码

?

1

2

3

4

   // Update is called once per frame

    voidUpdate () {

    }

}

首先我们需要获得TextMesh组件:

[C#] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

usingUnityEngine;

usingSystem.Collections;

publicclassHealth : MonoBehaviour {

    // The TextMesh Component

    TextMesh tm;

    // Use this for initialization

    voidStart () {

        tm = GetComponent<TextMesh>();

    }

    // Update is called once per frame

    voidUpdate () {[/align][align=left]}

现在我们用Update功能,使它一直面对计算机:

[C#] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

usingUnityEngine;

usingSystem.Collections;

publicclassHealth : MonoBehaviour {

    // The TextMesh Component

    TextMesh tm;

    // Use this for initialization

    voidStart () {

        tm = GetComponent<TextMesh>();

    }

    // Update is called once per frame

    voidUpdate () {

        // Face the Camera

        transform.forward = Camera.main.transform.forward;

    }

}

注意:没有复杂的数学。我们能做的是使得我们的游戏主体进入准确的照相机对着的方位。

现在我们添加current()和decrease()函数:

[C#] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

// Return the current Health by counting the '-'

publicintcurrent() {

    returntm.text.Length;

}

// Decrease the current Health by removing one '-'

publicvoiddecrease() {

    if(current() > 1)

        tm.text = tm.text.Remove(tm.text.Length - 1);

    else

        Destroy(transform.parent.gameObject);

}

注意,这是唯一一件看着有点奇怪的事情。通常我们有些整型变量来表展现我们现在的健康值。相反,我们利用包含这些‘-’的字符串的TextMesh的文字。我们自动摧毁健康柱的父对象(这个是城堡)直到健康值变为0。我们使得这些函数公共以致于其他脚本能用它们。

是的,我们游戏最简单的健康柱。好事是我们也能够为怪兽用。

怪兽

我们为我们的游戏添加怪兽。通常我们需要用CAD工具比如blender,maya或3dsmax来创建怪兽。但因为我们想把事情简单化,我们会用Unity原件来创建看起来像怪兽的圆柱体。

我们从顶部菜单选择GameObject->3D Object->Cube开始。我们命名为Monster并检查碰撞器的Is Trigger 操作以至于 怪兽之后不会互相碰撞:

Unity 宝塔对战教程 未命名 第32张

请点击此处输入图片描述

我们绘制很小的8*8的纹理来给它赋予颜色:

tex_monster.png

注意:右击链接,选择Save As..保存到项目的Assets/Textures文件夹

我们用下面的Import Settings来设置:

Unity 宝塔对战教程 未命名 第33张

请点击此处输入图片描述

从项目区域(Project Area)中拖拽到怪兽上,看起来是这个样子的:

Unity 宝塔对战教程 未命名 第34张

请点击此处输入图片描述

详情页

我们在Hierarchy中右击怪兽并选择3D Object->Cube。我们命名新的立方体为Eye,放置它到立方体的左中心并使它变小以至于看起来像个眼睛。我们再检查下IsTrigger:

Unity 宝塔对战教程 未命名 第35张

请点击此处输入图片描述

这是场景中看起来的样子:

Unity 宝塔对战教程 未命名 第36张

请点击此处输入图片描述

我们为眼睛画一个简单的白色的纹理:

-tex_eye.png

注意:右击链接并选择Save As..并保存到项目的Assets/Textures文件夹。

我们用下面的导入设置(Import Settings):

Unity 宝塔对战教程 未命名 第37张

请点击此处输入图片描述

然后拖拽它到我们的EyeGameObject上。

我们重复这个步骤制作另一个眼睛,像这样:

Unity 宝塔对战教程 未命名 第38张

请点击此处输入图片描述

像你所想的那样为怪兽添加更多细节。我们简单地添加两只脚:

Unity 宝塔对战教程 未命名 第39张

请点击此处输入图片描述

怪兽物理

我们的怪兽已经有了一个碰撞器,使得它已经成为了物理世界。还有一件事需要添加。假设通过物理世界的每个东西需要有一个刚体赋予它。刚体拥有引力,速度和其他力使得物体移动。

我们首先选择怪兽游戏主体(不是眼睛也不是脚)来添加刚体,然后点击AddComponent->Physics->Rigidbody 在Inspector中。我们使用下面的设置:

Unity 宝塔对战教程 未命名 第40张

请点击此处输入图片描述

注意:我们使用默认设置。

路径寻找

我们想要怪兽能够通过迷宫并进入城堡。我们不得不做两件事来实现它:

烘焙一个导航网格(来告诉Unity哪个区域是可走的)

添加导航网格代理给怪兽

我们告诉Unity那些部分是可走的来开始。好消息是Unity实际上自己绘制出来了。我们不得不做的事情是告诉Unity我们哪部分世界是静态的(例如::绝不移动)

我们选择地面(Ground)和所有的BuildPlaces在Hierarchy中然后使得检查器中的Static(静态) 属性可用:

Unity 宝塔对战教程 未命名 第41张

请点击此处输入图片描述

现在unity知道这些东西绝不能移动,因此会用它们来计算可移动的区域。

现在我们从顶部菜单选择Window->Navigation并使用下面的属性:

Unity 宝塔对战教程 未命名 第42张

请点击此处输入图片描述

然后我们点击底部的Bake按钮。几秒之后,我们能看到Unity怎么计算场景中的可移动区域:

Unity 宝塔对战教程 未命名 第43张

请点击此处输入图片描述

注意:最重要的部分是通过迷宫的路径。Unity也认为Buildplaces是可移动的,但因为没有为怪兽提供阶梯来爬,所以没关系的。

阅读延展
评论列表暂无评论
发表评论