日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > 互聯(lián)網(wǎng) > Unity3D游戲開發(fā)之實現(xiàn)血條技能培訓(xùn)

Unity3D游戲開發(fā)之實現(xiàn)血條技能培訓(xùn)

來源:程序員人生   發(fā)布時間:2014-10-04 08:00:00 閱讀次數(shù):3148次

       下面我們開始今天的Unity3D技能培訓(xùn)。 我們學(xué)習(xí)Unity3D培訓(xùn)目標:讓U3D初學(xué)者可以更快速的掌握U3D技術(shù),自行制作修改素材,可以獨立完成2D、3D小規(guī)模游戲及網(wǎng)頁游戲開發(fā)。

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

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

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


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

    在這里需要講一下PixelInset,由于GUITexture是采用的二維屏幕坐標來定位的,即左下角為(0,0),右上角為(1,1),所以我們不能直接使用三維坐標來改變GUITexture對象的位置。在Unity中有一個WorldToScreenPoint()方法可以將三維坐標轉(zhuǎn)化為二為左邊,所以我們的思路是獲取目標物體的位置,將其轉(zhuǎn)化為二維坐標,再賦值給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.        //設(shè)置前景、背景貼圖  
  37.        Forward.guiTexture.texture=ForwardTexture;  
  38.        Backward.guiTexture.texture=BackwardTexture;  
  39.        //根據(jù)目標對象初始化血條位置  
  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.         //將三維坐標轉(zhuǎn)化為二維坐標  
  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.     //設(shè)置貼圖寬度  
  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、目標物體的高度是根據(jù)Collider來獲取的,所以要使用血條組件的物體必須帶有碰撞器。

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

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

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

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

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

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

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产一级片网站 | 国产在线视频综合 | 一区二区三区精品在线 | 午夜精彩视频 | 国产亚洲精品久久久久久 | 国产青草 | 国产suv精品一区二区三 | 亚洲欧美高清 | 成人影片免费 | 午夜精 | 亚洲视频在线视频 | 精品无码久久久久国产 | 成人高清在线视频 | 午夜精品久久久久 | 激情欧美亚洲 | 激情二区| 久久精品亚洲一区二区 | 精品久久久久久久久久久久久久久久久久久 | 91精品国产色综合久久 | 天天综合精品 | 色婷婷亚洲精品 | 日韩在线免费观看视频 | 欧美日韩成人在线观看 | 亚洲精品999 | 国产视频污 | 中文久久 | 成人一区在线视频 | 视频一区欧美 | 国产视频在线播放 | 欧美日韩亚洲精品一区二区三区 | 国产视频一区二区 | 色婷婷一区二区三区四区成人网 | 最新三级网址 | 人妖在线视频 | 久久亚洲二区 | 亚洲 欧美 激情 另类 校园 | 久久久久久97 | 中文字幕一区二区视频 | 欧美日韩另类一区 | 一区二区三区四区五区视频 | 91日日|