您的位置:首页 > 移动开发 > Unity3D

[转载]Unity3D游戏引擎最详尽基础教程

2017-02-21 14:13 441 查看
原文地址:Unity3D游戏引擎最详尽基础教程作者:ShangShang
我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是因为易用,他的操作非常容易,而使用的脚本语言又是JavaScript或者C#,不仅非常简单,也让各个种类的程序员都非常容易上手。再次,就是因为免费,如果你不使用Pro或者Mobile的内容的话,Unity3d就是完全免费的。还有就是对3D模型的兼容性,几乎任何3d模型都可以导入到unity中,可以说是一个很方便的特性。

今天,我就来讲讲Unity3D的基础操作,这可以说是一个新手必读吧,读完之后,你一定会惊叹,原来做一个游戏这么简单。

第一节 加入重力

我们先打开Unity3d,新建一个场景(Scene),新建的时候应该会有对话框要求你加入哪些Asset Package,记得选择Physics Material,因为后面我们一定要用的哦亲。

如果创建的时候没加,你可以再后来的Asset菜单里加:





之后,我们建立一个Cude,调整一下x和z的大小,我这里调成了25,让它变成一个地板,你也可以放一个texture上去,看起来更加真实,我这里从简,再创建一个sphere,在component中选择Physics中的RigidBody,前提是选中你的sphere物体,之后会看到这个Sphere的inpector中加入一个component叫做RigidBody,调整好Camera运行一下,你就会发现Sphere受到重力的影响自动掉落到地板上。





之后,通过我们之前引入的Physics Materials资源包,你还可以选择这个物体的物理性质,我这里选择Bouncy(跳跳),落下之后,这个物体就会蹦来蹦去的,呵呵





第二节 检测碰撞

下面我们通过简单的JavaScript语句来检测碰撞,这在制作游戏中是很有用的,比如说检测到子弹和敌人的碰撞之后,可以使用我们后来要讲到destory命令消灭敌人。

这次我们新建一个Terrain项目,在用Grass贴图来覆盖住它,如果你找不到贴图的话,记得在Asset菜单里找找,看看哪些资源你还没有引入进去。





然后再加入一个Cube项目,我这里叫做PlayerCube,为他加上重力,之后选择bouncy性质,然后我们再新建一个Cude,调整y和z的值让他变成一堵墙,放置好,命名为Wall,别忘了给Terrain改名为Terrain,

之后我们在Asset菜单中建立一个JavaScript项目,改名为CollisionDetect,双击打开,如果你使用的是Unity 3.5的话,就会打开MonoDev,这是一个新工具还是很好用的,在其中新建一个函数,别管Start和Update函数,我们待会会讲。

加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

function OnCollisionEnter(theCollision : Collision){

if(theCollision.gameObject.name=="Terrain"){

Debug.Log("Hit terrain");

}else if(theCollision.gameObject.name=="Wall"){

Debug.Log("Hit the wall");

}

}


如果看不懂这些代码的话,也没关系,JavaScript是最好学的编程语言,Google一下吧,保存这个JS文件,然后拖到我们的PlayerCube上。





这时候我们运行,就会看到PlayerCube到处蹦,碰到Terrain的时候,控制台就会显示Hit Terrain,碰到wall的时候就会显示Hit the wall。

第三节 检测用户输入

下面我们来讲一下如何检测用户的键盘和鼠标的操作。

就用我们上次的那个场景,这次我们给PlayerCube加上我们可以控制的动作。就是通过“wasd”或者上下左右键来控制移动。

请注意,如果要使用这里使用的方法来控制移动,那么所控制的物体不能够是一个物理世界的物体,也就是说你要把RigidBody这个component删掉,如果你想要在物理世界里移动物体的话,你就需要我们在下面会讲到的力(force)。

首先我们新建一个JavaScript文件,这里命名为InputDetect吧,输入下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
3738
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118

#pragma strict

var Player : GameObject;

function Start () {

}

function Update () {

Player = GameObject.Find("PlayerCube");

if(Input.GetKey(KeyCode.W)){

Debug.Log("Hit w");

Player.transform.Translate(Vector3.forward * 2);

}else if(Input.GetKey(KeyCode.S)){

Debug.Log("Hit s");

Player.transform.Translate(Vector3.back * 2);

}else if(Input.GetKey(KeyCode.A)){

Debug.Log("Hit a");

Player.transform.Translate(Vector3.left * 2);

}else if(Input.GetKey(KeyCode.D)){

Debug.Log("Hit d");

Player.transform.Translate(Vector3.right * 2);

}

}


这时,我们运行这个游戏,就可以通过“WASD”来控制PlayerCube的移动了。





第四节 使用Prefab复制和控制物体

我们可以直接把Prefab看做是个妈,她能生好多小孩,如果妈妈的DNA变了,小孩的跟着变,就是说你可以用Prefab创建物体,然后通过这个Prefab修改所有这类物体的性质,这对于批量生成的敌人或者NPC来说很有用。

首先,先创建一个Prefab,我这里命名为“Mother”,之后新建一个Sphere物体,当然你也可以建一些其他的物体,之后给这个Sphere加上你想要的性质,我加入了RigidBody和Bouncy,之后将Sphere拖到Mother上,你会发现mother变蓝了,之后你就可以随意拖一些mother物体到屏幕上去,你会发现所有的Prefab创建出的物体在清单上都是蓝色的,说明他们都有共同的性质。





当然,作用于一个Prefab上的脚本也会作用到它的子物体上去。

第五节 使用Destroy命令消灭物体

我们游戏中怎么能够没有敌人呢?有敌人就得能够消灭他们,这时候,我们就会使用Destroy命令了。

在这里,我们使用上次Mother生出来的小球球作为敌银,一旦我们的PlayerCube碰撞到了小球的话,就是用Destroy让小球消失。

新建一个JavaScript脚本,输入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
3738
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

#pragma strict

var mother : GameObject;

function Start () {

}

function Update () {

}

function OnCollisionEnter(theCollision : Collision){

mother = GameObject.Find("Mother");

if(theCollision.gameObject.name=="Mother"){

Debug.Log("Hit mother");

Destroy(mother);

}

}


这段代码很好懂吧,就是检验碰撞,然后销毁碰撞到的Mother物体,别忘了把Destroy的JavaScript文件拖到PlayerCube上去。运行一下,就可以看到碰撞到的物体都被消灭了。





第六节 使用Instantiate命令创造物体

我们直接在界面创造的物体都只是会在界面被初始化的时候加载,那么,如果为了节约内存或者其他什么事情,我想要在游戏过程中添加物体,那该怎么办呢?你猜对了,就是用instantiate命令。

这个命令就是英文实例化的意思,下面我们给碰撞之后消失的mother物体继续初始化一些,也就是说消灭了一些,又来了一大波···

为什么非要用mother呢?因为只有拥有Prefab的物体才能够使用这个命令哦亲。

1
2
3
4
5
6
7
8
9
10
11
12
13

function Update () {

var instance : GameObject = Instantiate (PreFab,transform.position,transform.rotation);

}


注意:这样的话,每次刷新一帧都会出现一个新的mother物体,你的内存也许会受不了哦,更合理的方法是按下空格键,然后出现一个新的物体,你可以自己做吗?试试看

你可能已经注意到了,每一个初始化的脚本都会默认有两个函数,就是:

Update()函数 —— 每刷新一帧都会检查并执行

Start()函数 —— 只在场景初始化的时候执行

第七节 使用Timer计时器

这次,我们要让一个计时器倒数,倒数到0的时候创建一个mother物体,来看Javascript代码吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
3738
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

#pragma strict

var myTimer : float = 5.0;

function Start () {

}

function Update () {

if (myTimer >= 0){

myTimer -= Time.deltaTime;

guiText.text=(""+myTimer);

}

if (myTimer <= 0){

guiText.text = ("Done");

}

}


把这个脚本拖到GUItext控件上,你会发现我们所期待的效果。





第八节 让物体动起来

其实让物体行动的技巧,我们已经会了,不是吗?

如果你觉得不是的话,没有认真的看上面的文章哦,我就再给你讲一次吧。

请特别注意,这种方法不适合物理世界的物体,如果向移动物理世界的物体,请看下一节:

创建一个Cylinder物体,之后将下面的脚本附着在上面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
3738
39
40

#pragma strict

var myObject : GameObject;

function Start () {

}

function Update () {

myObject.gameObject.Find("Cylinder");

myObject.transform.Translate(Vector3(0,0,1));

}


第九节 使用物理世界的力

这里是我们讲移动物体的重点,因为大部分的物体移动都是在物理世界完成的,而如果想要在物理世界移动东西,除了position和rotation的移动之外,就是使用“力”了,在高中学过经典物理学的人都知道,要使物体用移动,木有力是不行的,那么我们就开始吧,再新建一个什么物体,我新建了一个Capsule。

之后,我会在这个物体的上方加一个力,让它用力的向下飞,触碰到地之后,通过bouncy这个性质再弹回来。新建一个JavaScript文件,就叫做Force吧,加入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

#pragma strict

var Power : float = 500.0;

function Start () {

rigidbody.AddForce(Vector3(0,Power,0));

}

function Update () {

}


运行之后,会发现capsule其实是个很有幽默感的物体。





第十节 使用贴图和材质

贴图和材质能够使你的虚拟3D世界看起来更加真实,不幸的是,需要大量在PS和AI中的设计工作,最近我一想到要打开PS就有点烦···呜呜。

闲话少说,我已经做好了一个贴图,怎么使用在材质上呢?之后我们怎么才能通过材质使用到其他物体之上呢?





就像你看到的一样,我是直接拖进去的···

之后我们从新建菜单中选择Material这一项,之后选中material,将贴图拖进material的贴图选框里,之后,就可以拖动这个Material赋给任何物体了。





第十一节 使用声效和音乐

音效和音乐对于一个游戏来说是非常重要的,一个寂静无声的世界是无聊的,而且不真实,什么?你说声效和音乐是一个东西?那你就错了,声效是,比如说发射子弹的声音,什么东西爆炸的声音等等,而音乐则是背景音乐什么的,不一样的亲。

对于音乐来说,往往使用立体声音乐,而对于生效来说,我们随便使用一个简单的音乐文件就可以了。

想要在Unity3D中播放音乐,你需要两样东西,一个是监听器,一个是音乐源,监听器是Camera的一个组件,所以你不用担心,你唯一需要增加的就是音乐源。

直接将项目中的音乐拖放到Audio Source项就可以播放,但是如果我们想要在某个特定的点上 播放音乐该怎么办呢?答案就是,写一个脚本,新建一个脚本,输入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

#pragma strict

var myClip : AudioClip;

function Start () {

AudioSource.PlayClipAtPoint(myClip,transform.position);

}

function Update () {

}


之后将这个脚本拖放到我们的物体上,最后,将音频文件拖放到AudioSource选项框中。

第十二节 使用关节

关节在3D游戏之中的应用非常广,主要在于物理世界的重力影响,下面我们就通过关节来制作一个钟摆。

这次我们新建一个场景,松了一口气?刚才的场景是不是太乱了?你做的时候可以整理一下嘛,呵呵

新建一个cube作为地面,之后一个cube放在上空作为摆垂,之后用几个capsule分别用component中的fixed joint连接起来,之后最上面的那个capsule与世界相连,使用Hinge Joint,这样的话,他会默认与世界相连,不用担心,看图









第十三节 使用Axes

在Edit – Project Setting – input 中可以查看各种形式的input,这些input方法在unity中被叫做Axes。

我们创建一个JavaScript,叫做GetAxes,输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

#pragma strict

function Start () {

}

function Update () {

var Honriz : float = Input.GetAxis("Honrizontal");

Debug.Log(Honriz);

}


在拖放脚本之后,运行这个场景,看看控制台输出了什么,你就明白了。





第十四节 使用触发器

触发器一般用于检测一个物体是否处于一个空间内,他是怎么做到的呢?

首先,他创造一个大的物体,之后将他的randerer属性去掉,他就隐形了,这样,我们再把他的isCollide属性去掉,他就不会发生碰撞了,之后,我们只需要用脚本检测物体是否与这个物体碰撞就可以了。

我们新建一个场景,做一个地板,再做一个底座,叠加起来,再在他们的上空做一个方块,设置rigidbody属性,将底座设置成为我们刚才说的那种隐形的状态,之后新建一个JavaScript脚本,输入代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
3738
39
40
41
42
43
44
45
46
47
48
49

#pragma strict

function Start () {

}

function Update () {

}

function OnTriggerEnter (myTrigger : Collider) {

if(myTrigger.gameObject.name == "box"){

Debug.Log("Hit");

}

}


按下运行,会发现可以检测出Hit。





第十五节 使用GUI

其实我们已经学过了如何使用GUI text,不信,我们就用屏幕上的字代替我们在上面的程序中的Debug.Log现实的内容。

你自己能做吗?

试试看吧,一个下午写了这么多,有点累。

一定要在Unity中加入一个GUI Text,运行一下,就会发现屏幕上的GUI Text会随着你设定的的内容而变化了。





之后看些什么?

本教程的所有代码在Unity3D 3.5 F5 + Mac OS X Lion上测试可用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: