天天看點

[Unity3D]Unity3D遊戲開發之基于2D貼圖實作血條元件的開發

      各位朋友,大家好,歡迎大家關注我的部落格,我是秦元培,我的部落格位址是。

   在上一篇文章中,我們以經典的打磚塊遊戲為例,講解了一個unity3d遊戲的完整實作過程。今天呢,我們來做一個在遊戲中十分重要的組成元素:血條。血條是什麼呢?血條是生命值的一種展現,就像《仙劍奇俠傳三》電視劇中,當景天說他想讓那些被邪劍仙害死的人活過來的時候,天帝說需要等量的生命值來換,是以電視劇中的結局就變成了景天留在世上的時間并不多了,雪見依偎着他坐在新安當門口的時候,天上忽然下起了雪。聊完了遊戲,我們繼續回到unity3d中來,我們今天要實作的是基于2d貼圖的血條元件的開發。在正式開始之前,我們先來了解下原理:血條由前後兩張大小相等貼圖組成,前面的貼圖就是我們可以看到的血量貼圖,而後面的貼圖就是我們的背景貼圖,通過改變血量貼圖的寬度,我們就可以實作血條的效果。好,講完了原理我們就來一起學習今天的内容吧!

    首先,我們準備兩張不同顔色的貼圖,如圖:

[Unity3D]Unity3D遊戲開發之基于2D貼圖實作血條元件的開發

    接下來,我們打開unity3d建立一個新的項目,我們首先在場景中建立兩個guitexture對象,我們将這兩個guitexture對象分别命名為hpbackward、hpforward。在guitexture中有一個很重要的屬性pixelinset,它是一個rect類型的值,用以描述guitexture對象的左上角位置、寬度、高度。這裡我們使用預設的坐标值,将寬度改為64,将高度改為5。兩張貼圖的設定要保持一緻。如圖所示:

[Unity3D]Unity3D遊戲開發之基于2D貼圖實作血條元件的開發

    在這裡需要講一下pixelinset,由于guitexture是采用的二維螢幕坐标來定位的,即左下角為(0,0),右上角為(1,1),是以我們不能直接使用三維坐标來改變guitexture對象的位置。在unity中有一個worldtoscreenpoint()方法可以将三維坐标轉化為二為左邊,是以我們的思路是擷取目标物體的位置,将其轉化為二維坐标,再指派給guitexture對象。好,基于這樣的思路,我們可以編寫下面的腳本:

   在上面的代碼中,我們需要把握以下幾點:

   1、目标物體的高度是根據collider來擷取的,是以要使用血條元件的物體必須帶有碰撞器。

   2、通過worldtoscreenpoint()方法擷取二維坐标後,要分别用x,y坐标去除以螢幕寬度、螢幕高度,目的是使坐标值介于0,1之間,因為guitexture使用這樣的坐标系。

   3、當改變腳本中的血量和目标物體的位置時,血條位置和血條量會自動更新。換言之,我們隻要要改變hp的值就可以實作血條數值的更新。

   好了,現在我們在場景中建立一個空的gameobject,命名為texture2dhp。我們将前面建立的兩個guitexture對象拖放到該對象下,使其成為子對象。我們把腳本拖放到texture2dhp對象上,此時,我們應該可以看到下面的内容:

[Unity3D]Unity3D遊戲開發之基于2D貼圖實作血條元件的開發

    我們将開始項目前準備好的兩張貼圖導入項目并将它們賦給腳本,其中紅色的為血量貼圖,黃色的背景貼圖。好了,到目前為止,一個血條元件已經基本成型了,為了讓它可以在項目中複用,我們将其制作成預設。下面來講解預設的制作方法:

    預設,在unity3d中稱為prefab,是一種可以複用的遊戲體。我們首先在project視窗中建立一個prefab檔案夾,然後在該檔案下建立一個名為texture2dhp的prefab。我們将hierarchy視窗中的texture2dhp拖放到prefab中,prefab将變成亮藍色,此時表明預設已經建立成功。儲存項目,将hierarchy視窗中的texture2dhp對象删除,在接下來的遊戲開發中,我們将會一直用到這個預設檔案。好,我們現在來測試一下今天的成果,我們首先在場景中建立一個cube和一個膠囊體,然後我們将texture2dhp預設直接拖放到遊戲場景中,設定其目标物體為cube,血量hp為35,将其改名為cubehp。類似地,我們為膠囊體建立一個血條元件,設定其血量hp為85,将其改名為capsulehp。好了,現在我們來運作遊戲:

[Unity3D]Unity3D遊戲開發之基于2D貼圖實作血條元件的開發

   那麼,我們如何在腳本中動态的改變血條的血量呢?我們隻需要擷取指定名稱的texture2dhp元件,然後擷取texture2dhp腳本并修改其中的hp的值就可以了。怎麼樣,效果還不錯吧?不過基于這種方式實作的血條有一個問題,就是所有對象的血條都是在一個平面上的,這樣血條的大小是不會随着距離錄影機距離的變化而表現出一種漸變的效果的,這是原理性的問題,我們目前還無法避免。部落客測試模型的時候,經常出現無法擷取模型高度的問題,暫時還沒有想到較好的解決辦法,如果大家有更好的想法,歡迎大家給我留言。那麼,有沒有更好的方法呢?有,那就是ngui!好了,關于ngui的問題,部落客稍後會與大家分享。希望大家繼續關注我的部落格哦。今天的内容就是這個樣子啦,部落客期待和大家一起成長,加油!

   每日箴言:對于單純善良的人來說,這個世界其實不複雜

[Unity3D]Unity3D遊戲開發之基于2D貼圖實作血條元件的開發

    喜歡我的部落格請記住我的名字:秦元培,我的部落格位址是。

    轉載請注明出處,本文作者:秦元培,本文出處:

繼續閱讀