成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Unity3D研究之人物頭頂名稱與血條更新與繪制

移動開發 iOS 游戲開發
人物的名稱與血條的繪制方法很簡單,但是我們需要解決的問題是如何在3D世界中尋找合適的坐標。因為3D世界中的人物是會移動的,它是在3D世界中移動,并不是在2D平面中移動

首先學習本文的重點內容,如何將游戲世界中任意3D坐標轉換成屏幕中的2D坐標。根據這個方法計算出的2D坐標屏幕左下角的點為0.0 ,屏幕右上角的坐標為1.1 所以真實的2D坐標還得通過Screen.height 與Screen.width計算一下才行。

[代碼]c#/cpp/oc代碼:

1 Vector2 position = camera.WorldToScreenPoint (worldPosition);

       在Unity工程導入角色控制器組件,不知道角色控制器的朋友請閱讀我之前的文章哈。創建一個Plane做為游戲的地面,然后利用角色控制器組件創建兩個模型,一個做為主角,一個作為NPC,主角可以通過控制來移動從四周來觀察NPC對象。由于地面的面積比較小移動主角時為了避免主角越界掉下去,我們做一個邊界的物理層。物理層其實很簡單,就是給平面四周放置四個平面在四周將平面包圍著,給四周的四個平面綁定上Box Collider組件,這樣主角就不會越界掉下去啦。因為沒有給貼圖所以效果上看不到這四個對象。哇咔咔~ 如下圖所示,在場景是途中主角被四個平面包圍這,即時它拼命的想往外條但是還是跳不出去,哈哈。

創建腳本NPC.cs 然后把腳本掛在NPC對象身上,在腳本中我們繪制主角的血條以及名稱。

NPC.cs

[代碼]c#/cpp/oc代碼:

001 using UnityEngine;
002 using System.Collections;
003  
004 public class NPC : MonoBehaviour {
005  
006     //主攝像機對象
007     private Camera camera;
008     //NPC名稱
009     private string name = "我是雨松MOMO";
010  
011     //主角對象
012     GameObject hero;
013     //NPC模型高度
014     float npcHeight;
015     //紅色血條貼圖
016     public Texture2D blood_red;
017     //黑色血條貼圖
018     public Texture2D blood_black;
019     //默認NPC血值
020     private int HP = 100;
021  
022     void Start ()
023     {
024         //根據Tag得到主角對象
025         hero = GameObject.FindGameObjectWithTag("Player");
026         //得到攝像機對象
027         camera = Camera.main;
028  
029         //注解1
030         //得到模型原始高度
031         float size_y = collider.bounds.size.y;
032         //得到模型縮放比例
033         float scal_y = transform.localScale.y;
034         //它們的乘積就是高度
035         npcHeight = (size_y *scal_y) ;
036  
037     }
038  
039     void Update ()
040     {
041         //保持NPC一直面朝主角
042         transform.LookAt(hero.transform);
043     }
044  
045     void OnGUI()
046     {
047         //得到NPC頭頂在3D世界中的坐標
048         //默認NPC坐標點在腳底下,所以這里加上npcHeight它模型的高度即可
049         Vector3 worldPosition = new Vector3 (transform.position.x , transform.position.y + npcHeight,transform.position.z);
050         //根據NPC頭頂的3D坐標換算成它在2D屏幕中的坐標
051         Vector2 position = camera.WorldToScreenPoint (worldPosition);
052         //得到真實NPC頭頂的2D坐標
053         position = new Vector2 (position.x, Screen.height - position.y);
054         //注解2
055         //計算出血條的寬高
056         Vector2 bloodSize = GUI.skin.label.CalcSize (new GUIContent(blood_red));
057  
058         //通過血值計算紅色血條顯示區域
059         int blood_width = blood_red.width * HP/100;
060         //先繪制黑色血條
061         GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,bloodSize.x,bloodSize.y),blood_black);
062         //在繪制紅色血條
063         GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,blood_width,bloodSize.y),blood_red);
064  
065         //注解3
066         //計算NPC名稱的寬高
067         Vector2 nameSize = GUI.skin.label.CalcSize (new GUIContent(name));
068         //設置顯示顏色為黃色
069         GUI.color  = Color.yellow;
070         //繪制NPC名稱
071         GUI.Label(new Rect(position.x - (nameSize.x/2),position.y - nameSize.y - bloodSize.y ,nameSize.x,nameSize.y), name);
072  
073     }
074  
075     //下面是經典鼠標點擊對象的事件,大家看一下就應該知道是什么意思啦。
076     void OnMouseDrag ()
077     {
078         Debug.Log("鼠標拖動該模型區域時");
079     }
080  
081     void OnMouseDown()
082     {
083         Debug.Log("鼠標按下時");
084  
085         if(HP >0)
086         {
087             HP -=5 ;
088         }
089  
090     }
091     void OnMouseUp()
092     {
093         Debug.Log("鼠標抬起時");
094     }
095  
096     void OnMouseEnter()
097     {
098         Debug.Log("鼠標進入該對象區域時");
099     }
100     void OnMouseExit()
101     {
102         Debug.Log("鼠標離開該模型區域時");
103     }
104     void OnMouseOver()
105     {
106         Debug.Log("鼠標停留在該對象區域時");
107     }
108  
109 }

注解1:通過collider.bounds.size 可以拿到模型對應三個軸向的高度,但是模型是可以縮放的,所以真實的模型高度應當是原始高度乘以縮放系數才行。 transform.localScale可以拿到模型對應三個軸向的縮放系數,因為這里我們需要模型的高度,所以忽略X軸與Z軸。

注解2:在這里我們計算血條的寬度,GUI.skin.label.Calcsize()這個方法是以默認的皮膚對象Label對象去參數對象的寬高。參數是new GUIContent(blood_Red)意思是拿紅色血條的貼圖的寬高,它將保存在返回的size中。最后以寬高將血條繪制在屏幕中,我們的血條采取兩層。背景是黑色的,前面是紅色的,當人物費血時紅色血條減少。

注解3: 這里通過字符串來獲取它整體的寬度與高度,因為NPC的名稱是可變的,所以我們需要動態的獲取整體的顯示區域。同樣是以GUI.skin.label對象去調用CalcSize。

如下圖所示,當使用鼠標點擊NPC對象時,NPC頭頂的血條將開始發生減血。這個例子我使用OnGUI繪制當然大家也可以在Hierarchy 視圖中的創建GUI Texture 或者GUI Text對象 來實現,不過原理都是這樣的 大家可以試試 哇咔咔。

 

責任編輯:冰凝兒
相關推薦

2012-12-24 09:09:27

AndoidUnity3D

2012-12-24 09:15:57

iOSUnity3D

2012-12-24 09:55:15

iOSUnity3D

2012-12-24 09:19:31

iOSUnity3D

2012-12-24 09:08:14

iOSUnity3D

2012-12-24 09:07:09

iOSUnity3D

2013-04-25 09:56:24

unity3D手機游戲引擎

2012-12-24 09:13:23

iOSUnity3D

2013-06-14 09:54:04

Unity3D

2013-04-25 10:03:07

unity3D手機游戲引擎

2012-12-24 09:20:48

AndoidUnity3D

2012-12-24 09:11:58

iOSUnity3D

2013-06-17 09:12:31

Unity3D

2012-12-24 08:52:44

iOSUnity3D

2013-04-25 13:27:11

unity3D手機游戲引擎

2012-12-24 09:17:12

iOSUnity3D

2015-01-06 09:55:16

Unity3D實時繪制

2012-12-24 08:40:12

2012-12-24 08:51:23

iOSUnity3D

2013-04-09 13:42:23

Unity3D基礎知識梳理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品一区二区久久 | 99re在线 | 欧美一区二区三区的 | 欧美精品一区二区三区四区 在线 | 天天躁日日躁狠狠很躁 | 国产精品99999 | 免费在线观看黄视频 | 日韩三级一区 | 国产在线视频99 | 99精品久久久久久中文字幕 | 久久视频免费观看 | 亚洲国产免费 | 久久国| 久久午夜精品福利一区二区 | 日本午夜一区二区三区 | 久久999| 91在线视频一区 | 久久99国产精品久久99果冻传媒 | 日韩欧美一级精品久久 | 波霸ol一区二区 | 久久久久亚洲av毛片大全 | 麻豆视频国产在线观看 | 欧美成年黄网站色视频 | 99久久精品国产一区二区三区 | 蜜桃视频在线观看免费视频网站www | www.亚洲视频 | 日本 欧美 国产 | 羞羞涩涩在线观看 | 欧美日韩国产中文字幕 | 色久影院 | 激情毛片 | 自拍偷拍中文字幕 | 在线91| 成人在线国产 | 国产精品久久久久久影院8一贰佰 | com.色.www在线观看 | 中文字幕一区二区三区不卡 | 午夜精品久久久久久久久久久久久 | 亚洲电影一区 | 亚洲精品一 | xx视频在线|