多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > Unity3D游戲開發之實現血條技能培訓

Unity3D游戲開發之實現血條技能培訓

來源:程序員人生   發布時間:2014-10-04 08:00:00 閱讀次數:3144次

       下面我們開始今天的Unity3D技能培訓。 我們學習Unity3D培訓目標:讓U3D初學者可以更快速的掌握U3D技術,自行制作修改素材,可以獨立完成2D、3D小規模游戲及網頁游戲開發。

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

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

更多精彩請到http://www.gopedu.com/


    接下來,我們打開Unity3D創建一個新的項目,我們首先在場景中創建兩個GUITexture對象,我們將這兩個GUITexture對象分別命名為HPBackwardHPForward。在GUITexture中有一個很重要的屬性PixelInset,它是一個Rect類型的值,用以描述GUITexture對象的左上角位置、寬度、高度。這里我們使用默認的坐標值,將寬度改為64,將高度改為5。兩張貼圖的設置要保持一致。如圖所示:

    在這里需要講一下PixelInset,由于GUITexture是采用的二維屏幕坐標來定位的,即左下角為(0,0),右上角為(1,1),所以我們不能直接使用三維坐標來改變GUITexture對象的位置。在Unity中有一個WorldToScreenPoint()方法可以將三維坐標轉化為二為左邊,所以我們的思路是獲取目標物體的位置,將其轉化為二維坐標,再賦值給GUITexture對象。好,基于這樣的思路,我們可以編寫下面的腳本:

[csharp] view plaincopyprint?
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Texture2DHP : MonoBehaviour   
  5. {  
  6.     //前景貼圖  
  7.     public Texture ForwardTexture;  
  8.     //背景貼圖  
  9.     public Texture BackwardTexture;  
  10.     //目標對象  
  11.     public Transform Target;  
  12.     //水平偏移量  
  13.     public float OffSetX=0.05F;  
  14.     //垂直偏移量  
  15.     public float OffSetY=0.05F;  
  16.       
  17.     //最大血量  
  18.     public int MaxHP=100;  
  19.     //當前血量  
  20.     public int HP=100;  
  21.     //血條寬度  
  22.     public int mWidth=64;  
  23.     //血條高度  
  24.     public int mHeight=5;  
  25.       
  26.     //前景  
  27.     private Transform Forward;  
  28.     //背景  
  29.     private Transform Backward;  
  30.       
  31.     void Start ()   
  32.     {  
  33.        //獲得前景和背景  
  34.        Forward=transform.Find("HPForward");  
  35.        Backward=transform.Find("HPBackward");  
  36.        //設置前景、背景貼圖  
  37.        Forward.guiTexture.texture=ForwardTexture;  
  38.        Backward.guiTexture.texture=BackwardTexture;  
  39.        //根據目標對象初始化血條位置  
  40.        UpdateLocation(Target,OffSetX,OffSetY);  
  41.     }  
  42.       
  43.       
  44.     void Update ()   
  45.     {  
  46.        UpdateLocation(Target,OffSetX,OffSetY);  
  47.        UpdateHP(HP);  
  48.     }  
  49.       
  50.     //更新位置  
  51.     private void UpdateLocation(Transform mTransform,float mOffSetX,float mOffSetY)  
  52.     {  
  53.         //獲取目標對象高度  
  54.         float mHight=Target.collider.bounds.size.y;  
  55.         float mScale=Target.transform.localScale.y;  
  56.         mHight=mHight * mScale;  
  57.         //將三維坐標轉化為二維坐標  
  58.         Vector3 mPos3d=new Vector3(mTransform.position.x,mTransform.position.y+mHight,mTransform.position.z);  
  59.         Vector2 mPos2d=Camera.main.WorldToScreenPoint(mPos3d);  
  60.         //更新貼圖的位置  
  61.         Forward.position=new Vector3(mPos2d.x/Screen.width+mOffSetX,mPos2d.y/Screen.height+mOffSetY,0);  
  62.         Backward.position=new Vector3(mPos2d.x/Screen.width+mOffSetX,mPos2d.y/Screen.height+mOffSetY,0);  
  63.     }  
  64.       
  65.     //更新血量  
  66.     public void UpdateHP(int mValue)  
  67.     {  
  68.           
  69.         if(mValue<0 || mValue>MaxHP)  
  70.          return;  
  71.          SetGUITextureWidth(Forward.guiTexture,  
  72.             (int)(mWidth * (mValue/(double)MaxHP)));      
  73.     }  
  74.           
  75.     //設置貼圖寬度  
  76.     private void SetGUITextureWidth(GUITexture mTexture,int mValue)  
  77.     {  
  78.         mTexture.pixelInset=new Rect(mTexture.pixelInset.x,mTexture.pixelInset.y,  
  79.             mValue,mTexture.pixelInset.height);  
  80.     }  
  81. }  

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

   1、目標物體的高度是根據Collider來獲取的,所以要使用血條組件的物體必須帶有碰撞器。

   2、通過WorldToScreenPoint()方法獲取二維坐標后,要分別用xy坐標去除以屏幕寬度、屏幕高度,目的是使坐標值介于0,1之間,因為GUITexture使用這樣的坐標系。

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

   好了,現在我們在場景中創建一個空的GameObject,命名為Texture2DHP。我們將前面創建的兩個GUITexture對象拖放到該對象下,使其成為子對象。我們把腳本拖放到Texture2DHP對象上,此時,我們應該可以看到下面的內容:

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

    預設,在Unity3D中稱為Prefab,是一種可以復用的游戲體。我們首先在Project窗口中創建一個Prefab文件夾,然后在該文件下創建一個名為Texture2DHPPrefab。我們將Hierarchy窗口中的Texture2DHP拖放到Prefab中,Prefab將變成亮藍色,此時表明預設已經創建成功。保存項目,將Hierarchy窗口中的Texture2DHP對象刪除,在接下來的游戲開發中,我們將會一直用到這個預設文件。好,我們現在來測試一下今天的成果,我們首先在場景中創建一個Cube和一個膠囊體,然后我們將Texture2DHP預設直接拖放到游戲場景中,設置其目標物體為Cube,血量HP35,將其改名為CubeHP。類似地,我們為膠囊體創建一個血條組件,設置其血量HP85,將其改名為CapsuleHP。好了,現在我們來運行游戲:

   那么,我們如何在腳本中動態的改變血條的血量呢?我們只需要獲取指定名稱的Texture2DHP組件,然后獲取Texture2DHP腳本并修改其中的HP的值就可以了。怎么樣,效果還不錯吧?不過基于這種方式實現的血條有一個問題,就是所有對象的血條都是在一個平面上的,這樣血條的大小是不會隨著距離攝像機距離的變化而表現出一種漸變的效果的,這是原理性的問題,我們目前還無法避免。測試模型的時候,經常出現無法獲取模型高度的問題,暫時還沒有想到較好的解決辦法,如果大家有更好的想法,歡迎大家給我留言。那么,有沒有更好的方法呢?有,那就是NGUI!好了,關于NGUI的問題,稍后會與大家分享。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美最猛性xxxxx短视频 | 色偷偷亚洲女人天堂观看欧 | 免费在线亚洲 | 在线一区观看 | 伊人久久国产 | 国产欧美一区二区三区在线看 | 多人伦交性欧美在线观看 | 羞羞网站在线观看 | 精品亚洲福利一区二区 | 久操影视 | 日本特黄色大片 | jizz性欧美12 | freexx性video18印度 | 青青青青久久精品国产一百度 | 亚洲黄色第一页 | 国产一级精品高清一级毛片 | 人人爱人人澡 | 免费网站在线观看国产v片 免费网站在线看 | 欧美一级在线免费观看 | 欧美性猛交黑人xxxx | 久久精品国产欧美成人 | 日本欧美一区二区三区高清 | 成人乱码| 亚洲欧美中文字幕专区 | 18视频免费网站 | 国产欧美二区三区 | 一级女人毛片人一女人 | 成年人视频网站免费 | 天码毛片一区二区三区入口 | 亚洲精品日本 | 波多野结衣在线观看一区二区三区 | 亚洲天砖砖区免费 | 性欧美18videos| 欧美一级片网址 | 五月香婷婷 | 亚洲欧美日韩高清 | 久久婷五月综合 | 日本一区二区在线视频 | 国产福利免费看 | 国产一区二区在线观看麻豆 | 永久在线观看 |