一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Unity4.3 2D教程:入門實(shí)戰(zhàn)(六)

 3dC 2014-04-15


這將是一個(gè)系列教程,將探索Unity2D原生2D工具的使用。

相關(guān)鏈接:

Unity4.3 2D教程:入門實(shí)戰(zhàn)(一)

Unity4.3 2D教程:入門實(shí)戰(zhàn)(二)

Unity4.3 2D教程:入門實(shí)戰(zhàn)(三)

Unity4.3 2D教程:入門實(shí)戰(zhàn)(四)

Unity4.3 2D教程:入門實(shí)戰(zhàn)(五)


給精靈編程

現(xiàn)在沙灘上散落著一些精靈,它們沒有任何動(dòng)作.教程這部分我們將完成它們的控制,我們會(huì)編寫兩段腳本,一個(gè)是僵尸的動(dòng)畫,另外一個(gè)是允許玩家控制僵尸的移動(dòng),其余的等你學(xué)會(huì)了自己寫吧…

注:我們用C#(發(fā)音為”see-sharp”)寫腳本,它很容易,如果你喜歡,也可以用JavaScript來寫.

精靈動(dòng)畫(Animating Sprites)

首先我們添加一個(gè)腳本來制作僵尸的動(dòng)畫.在Hierarchy視圖選擇zombie并給它新建個(gè)腳本,命名為”ZombieAnimator”.下面動(dòng)畫演示了具體步驟:

add_script_steps

在MonoDevelop中打開ZombieAnimator.cs,一般情況下在Unity雙擊ZombieAnimator文件就可以打開了.如下圖:

spriteanimator_in_inspector
Inspector視圖中的SpriteAnimator腳本

spriteanimator_in_project
Project視圖中的SpriteAnimator

我們要讓僵尸進(jìn)行簡(jiǎn)單的行走動(dòng)畫,需要精靈動(dòng)作表和一個(gè)循環(huán)速度.我們定義兩個(gè)公共變量到腳本中:

1
2
public Sprite[] sprites;
public float framesPerSecond;

注:在C#中變量定義在所有大括號(hào)之外,標(biāo)志著它是定義在類之內(nèi),所有函數(shù)之外.這不用特別理解明白,通常將它放在類的頂部,即任何函數(shù)定義之前.

公共變量將在Unity的編輯器中暴露出來,所以你可以直接修改它們的值而不用改變代碼,哪怕是運(yùn)行的時(shí)候!這個(gè)特性在實(shí)際使用中異常方便.

通過分配不同的精靈給SpriteRenderer組件來渲染動(dòng)畫.而不是在Update中調(diào)用動(dòng)畫,我們要在腳本開始運(yùn)行時(shí)給它緩存?zhèn)€實(shí)例變量.

我們添加一個(gè)私有變量到ZombieAnimator:
1
private SpriteRenderer spriteRenderer;
私有變量是不會(huì)暴露在Unity編輯器中的,我們?cè)赟tart中初始這個(gè)變量:
1
spriteRenderer = renderer as SpriteRenderer;

腳本子類MonoBehaviour可以獲得變量同名的渲染器.對(duì)于顯示精靈的游戲?qū)ο?渲染器將是SpriteRenderer.

注:可以在腳本里直接引用常見的對(duì)象,比較常見的如游戲?qū)ο蟮腡ransform,場(chǎng)景的main Camera.

我們添加如下代碼在Update中:
1
2
3
int index = (int)(Time.timeSinceLevelLoad * framesPerSecond);
index = index % sprites.Length;
spriteRenderer.sprite = sprites[ index ];


關(guān)卡載入到當(dāng)前的時(shí)間秒數(shù) (更多信息請(qǐng)查閱文檔的Time類)和每秒渲染的幀數(shù)相乘.如果動(dòng)畫幀是存儲(chǔ)在一個(gè)無限長(zhǎng)的數(shù)組里,得出的數(shù)就是數(shù)組中成員的索引數(shù).

但是你知道數(shù)組成員不會(huì)是無限數(shù)量的,當(dāng)動(dòng)畫幀數(shù)組播放一遍后你需要循環(huán)回到開始,通過執(zhí)行模數(shù)(%)操作,即做兩個(gè)數(shù)字之間的整除取余.換句話說 你將得到0~數(shù)組總成員數(shù)之間的索引來控制動(dòng)畫幀的播放.寫完上面腳本后保存,然后切換回Unity.在Hierarchy視圖選擇zombie會(huì)看到 Zombie Animator腳本組件將顯示剛才寫的兩個(gè)公共變量.

public_variables

精靈數(shù)組字段里面沒有內(nèi)容,我們需要按照如下順序添加精靈庫到數(shù)組里:zombie_0, zombie_1, zombie_2, zombie_3, zombie_2, zombie_1,我最喜歡的做法是在Hierarchy視圖里選擇zombie,在Inspector視圖右上角點(diǎn)擊鎖頭圖標(biāo),這樣zombie的 Inspector面板將會(huì)一直保持顯示狀態(tài),即使你選擇其它對(duì)象,它依舊會(huì)顯示.

inspector_locked

在Project視圖中展開zombie紋理,單擊zombie_0以選中它,然后按住shift鍵再點(diǎn)擊zombie_3來選擇4個(gè)僵尸精靈.

sprites_array_plus_icon

拖拽鼠標(biāo),可以看到一個(gè)綠色的加號(hào)的光標(biāo),拽到精靈數(shù)組那里,這時(shí)可以看到所選項(xiàng)都加到了精靈數(shù)組里.現(xiàn)在Zombie Animator腳本組件看起來應(yīng)該是這樣的:

sprites_array_partial

然后只選擇zombie_2以同樣的方式追加到數(shù)組里,再追加個(gè)zombie_1,這時(shí)精靈數(shù)組將包含正確順序的六個(gè)元素,就像這樣:

sprites_array_full
精靈數(shù)組與六個(gè)元素

再次點(diǎn)擊鎖按鈕解鎖,如圖:

inspector_unlocked

Inspector視圖解鎖

最后,設(shè)置Frames Per Second到10,像下面這樣:

zombie_frames_per_second

運(yùn)行一下游戲,你會(huì)看到可怕的僵尸…

注:你可以在運(yùn)行時(shí)根據(jù)自己心情調(diào)整 Frames Per Second來找到一個(gè)合適的速度,但Unity停止播放后會(huì)重置這個(gè)調(diào)整的值,因此你要停下時(shí)一定要記錄一下這個(gè)值在賦到 Frames Per Second上.

現(xiàn)在僵尸已經(jīng)復(fù)活了,下一節(jié)我們要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的控制器腳本讓它行走起來.

控制精靈運(yùn)動(dòng)

在Hierarchy視圖中選擇zombie并添加一個(gè)新C#腳本,命名為”ZombieController”,你可能要一個(gè)年老的邁著沉重步伐的僵尸,也或者要一個(gè)比較年輕有活力的僵尸,可以通過移動(dòng)速度來調(diào)整它們的姿態(tài),便于我們微調(diào),我們將它寫為公共變量.

打開ZombieController.cs腳本并添加如下代碼:

1
public float moveSpeed;

moveSpeed將存儲(chǔ)一個(gè)units數(shù),這個(gè)單位不是像素,而是僵尸每秒移動(dòng)的速度.因?yàn)楝F(xiàn)在精靈是一個(gè)單位為100個(gè)像素,所以這個(gè)值可能需要相當(dāng)小.

正如下面的動(dòng)畫,要做當(dāng)用戶點(diǎn)擊鼠標(biāo)后,僵尸沿著直線走到鼠標(biāo)的那個(gè)點(diǎn)(或這用戶是按住鼠標(biāo)同時(shí)拖拽鼠標(biāo)來改變僵尸新的位置).

Zombie walking toward and then past where you click.

Zombie following the cursor as it is dragged.

平時(shí)很可能不會(huì)在每一幀都得到輸入事件,所以當(dāng)僵尸目的方向改變時(shí)我們需要存儲(chǔ)僵尸的目的地方向.要做到這一點(diǎn),我們要計(jì)算出指向僵尸行走方向的normalized向量(長(zhǎng)度為1的向量).

添加如下變量到ZombieController中:

1
private Vector3 moveDirection;

雖然我們現(xiàn)在在做一個(gè)2D游戲,但是Unity仍舊使用的是3D坐標(biāo)系,因此要改變對(duì)象位置的Vector3.雖然這里僵尸不會(huì)改變z軸的位置,我 們可以用Vector2類型,但是我避免后面要在Vector2和Vector3兩種類型轉(zhuǎn)換的麻煩,我還是用Vector3了.

添加以下代碼以便有輸入時(shí)間時(shí)更新moveDirection:

1
2
3
4
5
6
7
8
9
10
11
// 1
Vector3 currentPosition = transform.position;
// 2
if( Input.GetButton("Fire1") ) {
// 3
Vector3 moveToward = Camera.main.ScreenToWorldPoint( Input.mousePosition );
// 4
moveDirection = moveToward - currentPosition;
moveDirection.z = 0;
moveDirection.Normalize();
}

下面說明一下剛才這段代碼的用途:

我們要獲得僵尸當(dāng)前位置,所以將位置付給局部變量,然后判斷鼠標(biāo)左鍵(Fire1)是否被按下,用場(chǎng)景的main Camera,轉(zhuǎn)換鼠標(biāo)目前位置為世界坐標(biāo)系,因?yàn)镾creenToWorldPoint不會(huì)影響到Z軸的值,所以這里我們直接用鼠標(biāo)的位置來取得 moveToward,計(jì)算移動(dòng)的方向是用目標(biāo)位置減去僵尸目前的位置,,因?yàn)槟悴幌敫淖兘┦琙軸的位置,所以我們?cè)O(shè)置moveDirection的z值 為0,并用Normalize將moveDirection變?yōu)殚L(zhǎng)度為1的”單位長(zhǎng)度(unit length)”.Unit length的向量用起來是很方便的,可以通過一個(gè)標(biāo)量值,如moveSpeed乘以這個(gè)向量來讓向量指向一個(gè)方向,而保持長(zhǎng)度.后面會(huì)用到這個(gè).

注:用Input來訪問輸入數(shù)據(jù)是比較通用的方法,一個(gè)項(xiàng)目默認(rèn)定義了各種輸入名稱,比如Horizontal, Vertical, 和 Jump, Horizontal是檢測(cè)操縱桿x軸的位置以及鍵盤左右箭頭按鈕狀態(tài).如果你需要獲得水平方向的輸入數(shù)據(jù),可以直接用Horizontal來獲取,而不 用關(guān)心具體是怎么獲取來的.

Fire1默認(rèn)定義的是虛擬鍵之一,它注冊(cè)的是一個(gè)操縱桿或鼠標(biāo)的按鈕0,而左control鍵是用Input.GetButton返回的布爾值獲 得的.代碼將在鼠標(biāo)按下的每一幀時(shí)更新moveDirection(不只是當(dāng)初按下的那一陣).沒錯(cuò),這也意味著你可以通過鍵盤的左CTRL鍵來控制僵尸 方向,只是還要用鼠標(biāo)來掌舵.

在Edit\Project Settings\Input能看到關(guān)于InputManager設(shè)置.

下面我們添加下面的代碼來做僵尸跟隨鼠標(biāo)走路的效果:

1
2
Vector3 target = moveDirection * moveSpeed + currentPosition;
transform.position = Vector3.Lerp( currentPosition, target, Time.deltaTime );

第一行是用來計(jì)算以moveSpeed速度單位讓僵尸從當(dāng)前位置移動(dòng)到目標(biāo)位置,也就是僵尸將按照當(dāng)前位置朝向鼠標(biāo)目標(biāo)位置方向移動(dòng)過去.

第二行使用Vector3.Lerp來計(jì)算當(dāng)前位置與目標(biāo)位置之前路徑上僵尸的新位置,線性插值(Lerp)是為取兩個(gè)值之間內(nèi)插值的最便利方 法.Lerp第三個(gè)參數(shù)取值范圍是0~1,這意味著0時(shí)將返回你現(xiàn)在的位置點(diǎn),值為1時(shí)將返回目標(biāo)點(diǎn),0.5時(shí)將返回它們的中點(diǎn).我們這里用 Time.deltaTime來作為第三個(gè)參數(shù)值,因?yàn)樗且幻腌姷囊恍〔糠?很可能會(huì)小于1,會(huì)讓你得到沿著起點(diǎn)到終點(diǎn)路徑上的一些點(diǎn),正因?yàn)?Time.deltaTime任何時(shí)候都將接近于1,因此你可以得到一個(gè)不錯(cuò)的平滑運(yùn)動(dòng).

保存這個(gè)腳本并切換回Unity.

運(yùn)行游戲,點(diǎn)擊某個(gè)地方讓僵尸走過去,因?yàn)闆]有設(shè)定ZombieController的moveSpeed,所以它還不會(huì)走動(dòng),不用停止游戲,我們 在Inspector面板中選擇zombie找到Zombie Controller腳本組件改變移動(dòng)速度為2,再次在沙灘上點(diǎn)擊鼠標(biāo),你會(huì)看到僵尸走過去了.

zombie_brains

在Inspector更改移動(dòng)速度知道你覺得滿意.根據(jù)你調(diào)整的移動(dòng)速度,你可能還需要調(diào)整Zombie Animator腳本中的Frames Per Second來讓僵尸動(dòng)畫與行走速度相匹配.
當(dāng)你覺得滿意的時(shí)候你記住現(xiàn)在設(shè)定的數(shù)值,然后停止游戲的運(yùn)行,重新設(shè)定這些值好讓下次運(yùn)行時(shí)移動(dòng)速度和動(dòng)畫是正確的.

這個(gè)時(shí)候,你有可能發(fā)現(xiàn)下面這些問題:

1.當(dāng)游戲開始運(yùn)行時(shí),你會(huì)發(fā)現(xiàn)僵尸的腿在動(dòng),可它確實(shí)靜止在那里的.
2.僵尸愉快的向右走出了屏幕.
3.他走路的時(shí)候并不看路.

在看完這個(gè)教程時(shí)你會(huì)解決它跑出屏幕的問題,所以現(xiàn)在暫時(shí)忽略這個(gè)問題.此外,如果它跑到了屏幕外面,只需再次點(diǎn)擊沙灘,他有可能就會(huì)回來的.

再次回到MonoDevelop打開ZombieController.cs.

這個(gè)腳本用moveDirection來移動(dòng)僵尸,但是只有當(dāng)有輸入事件的時(shí)候它才開始移動(dòng),為了讓場(chǎng)景開始的時(shí)候它就前進(jìn),我們需要初始moveDirection指向它的右方.

在Start中添加下面這行:

1
moveDirection = Vector3.right;

這個(gè)點(diǎn)是在x軸的正方向上,換句話說它指向朝右的方向.

保存ZombieController.cs并回到Unity中再次播放游戲.

現(xiàn)在僵尸自己就跑了,接下來我們要讓他看路走.

回到ZombieController.cs,添加一個(gè)公共變量在ZombieController中做為僵尸的扭率:

1
public float turnSpeed;

我們將用turnSpeed來控制僵尸定位自己方向的響應(yīng)速度.

Unity內(nèi)部是使用四元數(shù)表示旋轉(zhuǎn).如果你想了解四元數(shù),可以看此鏈接:http://en./wiki/Quaternion,不過也許你看了后會(huì)覺得頭腦發(fā)昏,但值得寬慰的是在Unity做2D游戲不用完全了解四元數(shù)是什么.

因?yàn)橛?Quaternion.Euler 方法可以從一個(gè)歐拉角獲得四元數(shù).大多數(shù)人都習(xí)慣歐拉角,它包含單獨(dú)的x,y,z的旋轉(zhuǎn)角度.雖然它們因?yàn)槿缛f向軸死鎖(gimbal lock)等問題在3D創(chuàng)作中使用不太理想,但對(duì)于2D游戲來說,歐拉角是蠻好用的,我們可能只需要繞z軸旋轉(zhuǎn).

注:欲了解更多關(guān)于四元數(shù),可以看我們這個(gè)教程OpenGL ES Transformations with Gestures(http://www./50398/opengl-es-transformations-gestures)”.

最后我們?cè)赨pdate腳本里添加下面的代碼:

1
2
3
4
5
float targetAngle = Mathf.Atan2(moveDirection.y, moveDirection.x) * Mathf.Rad2Deg;
transform.rotation =
Quaternion.Slerp( transform.rotation,
Quaternion.Euler( 0, 0, targetAngle ),
turnSpeed * Time.deltaTime );

我們來看一下這個(gè)代碼,首先我們用Mathf.Atan2來找到x軸與moveDirection之間的角度.Mathf.Atan2將返回角度的弧度,所以要乘以Mathf.Rad2Deg來轉(zhuǎn)換為角度.

然后用Quaternion.Slerp來轉(zhuǎn)向您所計(jì)算的目標(biāo)角度.

Quaternion.Slerp執(zhí)行的是指定兩個(gè)角度的球面線性插值.類似于前面我們用到的Vector3.Lerp,只是它是計(jì)算新的旋轉(zhuǎn),而不是計(jì)算新的位置.

此前,調(diào)用Vector3.Lerp,并用moveSpeed調(diào)整僵尸移動(dòng)的距離,同時(shí)用turnSpeed做僵尸的面向角度處理.

以上就是ZombieController.cs腳本,保存它并回到Unity.

在Hierarchy視圖選擇zombie.設(shè)定Turn Speed到5,如下圖:

turn_speed_set

運(yùn)行游戲并點(diǎn)擊周圍的海灘,僵尸將始終朝向你鼠標(biāo)點(diǎn)擊的位置.

dizzy_zombie

上面這些就是這個(gè)教程教你做Zombie Conga游戲的所有內(nèi)容.通過”File\Save Scene as…. ”并命名為”CongaScene”保存場(chǎng)景.

下一節(jié)我們要講一些只在Unity專業(yè)版(付費(fèi)版本)才提供的功能,這些對(duì)于Zombie Conga游戲不是必要的,但你可能想了解更復(fù)雜項(xiàng)目的制作,就需要用到它-Sprite Packing.

原文鏈接:http://www./61532/unity-2d-tutorial-getting-started

本部分文字翻譯來源:http://blog./?p=1422


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    粗暴蹂躏中文一区二区三区| 亚洲一区二区三区国产| 老司机激情五月天在线不卡| 国产精品免费无遮挡不卡视频| 国内精品偷拍视频久久| 国产熟女一区二区三区四区| 国产精品免费无遮挡不卡视频| 色无极东京热男人的天堂| 亚洲国产成人一区二区在线观看| 久久99青青精品免费观看| 国产视频福利一区二区| 日韩欧美精品一区二区三区| 欧美中文日韩一区久久| 精品推荐久久久国产av| 97人妻精品一区二区三区免| 在线观看视频日韩精品| 亚洲中文在线观看小视频| 国产亚洲精品久久99| 黄片三级免费在线观看| 国产精品自拍杆香蕉视频| 欧美日韩国产自拍亚洲| 九九九热视频免费观看| 老外那个很粗大做起来很爽| 国产精品国三级国产专不卡| 国产精品激情在线观看| 日韩人妻欧美一区二区久久| 五月天丁香婷婷狠狠爱| 国产一区一一一区麻豆| 美女激情免费在线观看| 九九热视频经典在线观看| 99久久国产精品亚洲| 欧美精品久久一二三区| 91插插插外国一区二区| 亚洲精品国产主播一区| 欧美激情一区=区三区| 成人精品网一区二区三区| 国产成人精品一区二区在线看| 亚洲少妇人妻一区二区| 日本黄色美女日本黄色| 日本熟妇五十一区二区三区| 国产精品九九九一区二区|