Unity3D遊戲引擎最詳盡基礎教程
轉自:http://blog.sina.com.cn/s/blog_7c336a8301013son.html
我一直向所有想做遊戲的朋友推薦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
37
38
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
37
38
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
37
38
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
37
38
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
37
38
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上測試可用。
歡迎關注我的圍脖: @Oratis
在知乎和豆瓣上,我的名字也是Oratis
我會把之後發表的教程分享到這些社交網路中。
如果你有任何問題,歡迎在底下留言,也歡迎寫信給我,我的郵箱地址是: [email protected]
相關推薦
Unity3D遊戲引擎最詳盡基礎教程
轉自:http://blog.sina.com.cn/s/blog_7c336a8301013son.html 我一直向所有想做遊戲的朋友推薦Unity3D,為什麼呢?首先是因為專業,Unity3D非常強大,用它建立一個類似MiniGore這樣的3D平面射擊遊
Unity3D 遊戲引擎之C#使用Socket與HTTP連接server數據傳輸包
tco 類型 oba connect asp bre amp 客戶 star 近期比較忙。有段時間沒寫博客拉。近期項目中須要使用HTTP與Socket。雨松MOMO把自己這段時間學習的資料整理一下。有關Socket與HTTP的基礎知識MOMO就不贅述拉,不懂得朋友自己
Unity3D 遊戲引擎之詳解遊戲開發音訊的播放(十五)
找一個音樂檔案,我這裡使用了一個.mp3音樂檔案,我命名為0.mp3 如下圖所示將它拖動到右側Audio Clip處。我們發現 Audio Source 有很多設定的屬性,那麼MOMO將一些比較重要的屬性諾列出來。AudioClip :聲音片段,還可以在程式碼中去動態的擷取音樂檔案。Mute : 是否靜音By
Unity3D遊戲開發基礎入門學習線路圖(2019最新版)
對於程式設計零基礎小白來說,Unity3D遊戲開發真的是高深到無法踏足的領域嗎?我認為並不是這樣的。 按照我個人的理解:其實Unity本身並不是一種體系,而是計算機圖形學+遊戲開發+各種其他系統的一種表現。學習進階遊戲開發,Unity是一個非常出色的入手工具,但是它背後蘊含的諸多通用系統知識並非我們一朝
最完整的Elasticsearch 基礎教程
epo -o 小寫 名稱 搜索結果 博客 需要 必須 搜索api 基礎概念 Elasticsearch有幾個核心概念。從一開始理解這些概念會對整個學習過程有莫大的幫助。 接近實時(NRT) Elasticsearch是一個接近實時的搜索平臺。這意
【Unity3D基礎教程】給初學者看的Unity教程(零):如何學習Unity3D
cos 詳解 component lock index unity3d遊戲 design 技術棧 log 【Unity3D基礎教程】給初學者看的Unity教程(零):如何學習Unity3D http://www.cnblogs.com/neverdie/p/How_To_
Sass基礎教程、最基本部分
ner http idt ray nested href 管理 content margin Sass 是一款強化 CSS 的輔助工具,它在 CSS 語法的基礎上增加了變量 (variables)、嵌套 (nested rules)、混合 (mixins)、導入 (inli
Egret引擎的EUI基礎使用教程
由於Egret引擎的EUI擴充套件庫的官方文件寫得十分複雜,讓很多開發者短時間內難以入手並且走了不少坑,在這裡我將教你Egret引擎的擴充套件庫EUI的基本使用方法。廢話不多說,一起開始吧! 一、我們要新建一個專案; 二、開啟專案後,需要在資源管理器
Unity3d 遊戲中整合Firebase 統計和Admob廣告最新中文教程
Firebase Admob Unity3d外掛是一個Unity使用者更方便使用Firebase 統計和Firebase admob廣告的外掛,介面非常的簡潔簡單,使用c#,無需另外編寫java和oc程式碼一、2種方式安裝Firebase Admob Unity3d外掛1.直接下載https://github
python基礎教程_學習筆記18:標準庫:一些最愛——shelve
變量綁定 工作 關閉 mes 名稱 tis 標準 times data- 版權聲明:本文為博主原創文章,未經博主同意不得轉載。 https://blog.csdn.net/signjing/article/details/3602998
動力節點Java基礎301集 史上最全的Java基礎教程
Problem Description 任何一個大學生對菲波那契數列(Fibonacci numbers)應該都不會陌生,它是這樣定義的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(n-2)(n>=3); 所以,1,2,3,5,8,13……就是菲波那契數列。 在HDOJ上
halcon教程從0基礎到精通 快速瞭解操作並精通視覺專案最全視訊教程資料彙總 halcon下載
全網最全資料總連結: halcon是德國公司開發的一套很完善的機器視覺演算法包,很廣泛地應用於工業各個領域中,用途十分廣泛,是一款值得學習的影象處理軟體,個人覺得:halcon雖然沒有opencv和matlab在影象處理領域應用更加廣泛,專業性、整合封裝性、穩
史上最簡單MySQL教程詳解(基礎篇)之多表聯合查詢
常用術語 內連線 外連線 左外連線 右外連線 注意事項: 自連線 子查詢 在上篇文章史上最簡單MySQL教程詳解(基礎篇)之資料庫設計正規化及應用舉例我們介紹過,在關係型資料庫中,我們通常為了減少資料的冗餘量將對資料表進行規範,將
Unity3D-遊戲/VR/AR開發之C#基礎:字典
using System; //引用泛型集合名稱空間 using System.Collections.Generic; namespace Lesson_24 { class MainClass { public static
Unity3d 遊戲特效製作實戰教程 第二部
本套教程是由多年特效製作經驗的作者錄製,通過多個案例, 演示了xffect粒子系統與unitu3d粒子系統的特效製作的全部流程 包含xffect基礎教程,並附送全部專案檔案打包和素材。 本教學適合於Unity平臺的遊戲特效製作,教學演示的案例流程方案可以直接
山寨Unity3D?搜狐暢遊的免費開源遊戲引擎Genesis-3D
用過Unity3d的朋友會發現,Genesis-3D的介面非常類似於Unity3d:主選單都是“新建工程”、“新建場景”;在場景樹中可以建立攝像頭、立方體、粒子、燈光等;在左下角的“工程”中可以建立C#指令碼、材質、精靈等;螢幕中間區域是場景編輯器,可以到“遊戲”標籤中檢視預覽效果;
python基礎教程_學習筆記16:標準庫:一些最愛——random
標準庫:一些最愛 random random模組包括返回隨機數的函式,可以用於模擬或者用於任何產生隨機輸出的程式。 事實上,所產生的數字都是偽隨機數,它們以一個可預測的系統作為基礎,除非是為了強加密的目標,否則這些隨機數還是足夠隨機的。如果真的需要隨機性,可以使用os模組的
OGRE 引擎官方基礎教程 (一)
先決條件: 1.本範例假設你能夠設定和編譯一個OGRE應用程式,具體方法見設定方法,並且具備一定的 C++語言程式設計基礎。 開始工作: 建立一個工程,命名為Tutorial,這裡採用 Visual Studio 2010,加入下列檔案 BaseApplication
2017有哪些推薦的Unity3D開發的基礎教程
2017有哪些推薦的Unity3D開發免費基礎教程 C#入門教程 1-下載並安裝MonoDevelop 2-c#編譯過程 3-二進位制 4-變數和資料型別 5-基本資料型別 6-運算子和表示式 7-型別轉換 8-使用字串 9-控制檯輸入輸出 10-關
北京U3D外包團隊 UE4紅軍抗戰案例 Unity3D紅軍抗戰案例 UE4下載和安裝虛幻4遊戲引擎
dex 除了 u3d 更新 團隊 文檔 在線演示 2015年 bsp 剛完整UE4紅軍抗戰案例 Unity3D紅軍抗戰案例,有在線演示(版權關系不方便發圖),有UE4或Unity項目定制外包開發的歡迎聯系我們 進入虛幻4的官方主頁(https://www.unrealen