這將是一個(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)畫演示了具體步驟: 在MonoDevelop中打開ZombieAnimator.cs,一般情況下在Unity雙擊ZombieAnimator文件就可以打開了.如下圖: 我們要讓僵尸進(jìn)行簡(jiǎn)單的行走動(dòng)畫,需要精靈動(dòng)作表和一個(gè)循環(huán)速度.我們定義兩個(gè)公共變量到腳本中:
注:在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:
腳本子類MonoBehaviour可以獲得變量同名的渲染器.對(duì)于顯示精靈的游戲?qū)ο?渲染器將是SpriteRenderer. 注:可以在腳本里直接引用常見的對(duì)象,比較常見的如游戲?qū)ο蟮腡ransform,場(chǎng)景的main Camera. 我們添加如下代碼在Update中:
關(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è)公共變量. 精靈數(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ì)顯示. 在Project視圖中展開zombie紋理,單擊zombie_0以選中它,然后按住shift鍵再點(diǎn)擊zombie_3來選擇4個(gè)僵尸精靈. 拖拽鼠標(biāo),可以看到一個(gè)綠色的加號(hào)的光標(biāo),拽到精靈數(shù)組那里,這時(shí)可以看到所選項(xiàng)都加到了精靈數(shù)組里.現(xiàn)在Zombie Animator腳本組件看起來應(yīng)該是這樣的: 然后只選擇zombie_2以同樣的方式追加到數(shù)組里,再追加個(gè)zombie_1,這時(shí)精靈數(shù)組將包含正確順序的六個(gè)元素,就像這樣: 再次點(diǎn)擊鎖按鈕解鎖,如圖: Inspector視圖解鎖 最后,設(shè)置Frames Per Second到10,像下面這樣: 運(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腳本并添加如下代碼:
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)來改變僵尸新的位置). 平時(shí)很可能不會(huì)在每一幀都得到輸入事件,所以當(dāng)僵尸目的方向改變時(shí)我們需要存儲(chǔ)僵尸的目的地方向.要做到這一點(diǎn),我們要計(jì)算出指向僵尸行走方向的normalized向量(長(zhǎng)度為1的向量). 添加如下變量到ZombieController中:
雖然我們現(xiàn)在在做一個(gè)2D游戲,但是Unity仍舊使用的是3D坐標(biāo)系,因此要改變對(duì)象位置的Vector3.雖然這里僵尸不會(huì)改變z軸的位置,我 們可以用Vector2類型,但是我避免后面要在Vector2和Vector3兩種類型轉(zhuǎn)換的麻煩,我還是用Vector3了. 添加以下代碼以便有輸入時(shí)間時(shí)更新moveDirection:
下面說明一下剛才這段代碼的用途: 我們要獲得僵尸當(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)走路的效果:
第一行是用來計(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ì)看到僵尸走過去了.
在Inspector更改移動(dòng)速度知道你覺得滿意.根據(jù)你調(diào)整的移動(dòng)速度,你可能還需要調(diào)整Zombie Animator腳本中的Frames Per Second來讓僵尸動(dòng)畫與行走速度相匹配. 這個(gè)時(shí)候,你有可能發(fā)現(xiàn)下面這些問題:
1.當(dāng)游戲開始運(yùn)行時(shí),你會(huì)發(fā)現(xiàn)僵尸的腿在動(dòng),可它確實(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中添加下面這行:
這個(gè)點(diǎn)是在x軸的正方向上,換句話說它指向朝右的方向. 保存ZombieController.cs并回到Unity中再次播放游戲. 現(xiàn)在僵尸自己就跑了,接下來我們要讓他看路走. 回到ZombieController.cs,添加一個(gè)公共變量在ZombieController中做為僵尸的扭率:
我們將用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腳本里添加下面的代碼:
我們來看一下這個(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,如下圖: 運(yùn)行游戲并點(diǎn)擊周圍的海灘,僵尸將始終朝向你鼠標(biāo)點(diǎn)擊的位置. 上面這些就是這個(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
|
|