日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity3d 任务头上的血条

發布時間:2023/11/30 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 unity3d 任务头上的血条 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?人物的名稱與血條的繪制方法很簡單,但是我們需要解決的問題是如何在3D世界中尋找合適的坐標。因為3D世界中的人物是會移動的,它是在3D世界中移動,并不是在2D平面中移動,但是我們需要將3D的人物坐標換算成2D平面中的坐標,繼而找到人物頭頂在屏幕中的2D坐標最后使用GUI將名稱與血條繪制出來。

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

C#
1 Vector2 position = camera.WorldToScreenPoint (worldPosition);

?

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

?

?

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

NPC.cs

C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 using UnityEngine; using System.Collections; public class NPC : MonoBehaviour { //主攝像機對象 private Camera camera; //NPC名稱 private string name = "我是雨松MOMO"; //主角對象 GameObject hero; //NPC模型高度 float npcHeight; //紅色血條貼圖 public Texture2D blood_red; //黑色血條貼圖 public Texture2D blood_black; ????//默認NPC血值 private int HP = 100; void Start () { //根據Tag得到主角對象 hero = GameObject.FindGameObjectWithTag("Player"); //得到攝像機對象 camera = Camera.main; //注解1 //得到模型原始高度 float size_y = collider.bounds.size.y; //得到模型縮放比例 float scal_y = transform.localScale.y; //它們的乘積就是高度 npcHeight = (size_y *scal_y) ; } void Update () { //保持NPC一直面朝主角 transform.LookAt(hero.transform); } void OnGUI() { //得到NPC頭頂在3D世界中的坐標 //默認NPC坐標點在腳底下,所以這里加上npcHeight它模型的高度即可 Vector3 worldPosition = new Vector3 (transform.position.x , transform.position.y + npcHeight,transform.position.z); //根據NPC頭頂的3D坐標換算成它在2D屏幕中的坐標 Vector2 position = camera.WorldToScreenPoint (worldPosition); //得到真實NPC頭頂的2D坐標 position = new Vector2 (position.x, Screen.height - position.y); //注解2 //計算出血條的寬高 Vector2 bloodSize = GUI.skin.label.CalcSize (new GUIContent(blood_red)); //通過血值計算紅色血條顯示區域 int blood_width = blood_red.width * HP/100; //先繪制黑色血條 GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,bloodSize.x,bloodSize.y),blood_black); //在繪制紅色血條 GUI.DrawTexture(new Rect(position.x - (bloodSize.x/2),position.y - bloodSize.y ,blood_width,bloodSize.y),blood_red); //注解3 //計算NPC名稱的寬高 Vector2 nameSize = GUI.skin.label.CalcSize (new GUIContent(name)); //設置顯示顏色為黃色 GUI.color??= Color.yellow; //繪制NPC名稱 GUI.Label(new Rect(position.x - (nameSize.x/2),position.y - nameSize.y - bloodSize.y ,nameSize.x,nameSize.y), name); } //下面是經典鼠標點擊對象的事件,大家看一下就應該知道是什么意思啦。 void OnMouseDrag () { Debug.Log("鼠標拖動該模型區域時"); } void OnMouseDown() { Debug.Log("鼠標按下時"); if(HP >0) { HP -=5 ; } } void OnMouseUp() { Debug.Log("鼠標抬起時"); } void OnMouseEnter() { Debug.Log("鼠標進入該對象區域時"); } void OnMouseExit() { Debug.Log("鼠標離開該模型區域時"); } void OnMouseOver() { Debug.Log("鼠標停留在該對象區域時"); } }

?

注解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對象 來實現,不過原理都是這樣的 大家可以試試 哇咔咔。

?

?

總結

以上是生活随笔為你收集整理的unity3d 任务头上的血条的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲综合社区 | 国产精品免费一区二区三区在线观看 | 极品尤物一区二区三区 | 免费成人高清视频 | 色综合天天色综合 | 国产91区 | 亚洲久久视频 | 青青草国产成人99久久 | 日本午夜激情视频 | 色xxxxxx| 久久久久人妻一区精品 | 中文文字幕一区二区三三 | 超碰干| 极品久久久久久 | 强伦轩人妻一区二区电影 | 欧美成人做爰大片免费看黄石 | 一区二区三区av | 一区二区三区四区久久 | caopeng视频| 91久久精品国产91性色tv | 深夜成人在线 | 少妇一级淫片免费观看 | 91av福利视频 | 亚洲熟妇av一区二区三区 | 亚洲天堂欧美在线 | 国产精品亚洲一区二区无码 | 两女双腿交缠激烈磨豆腐 | 四川丰满妇女毛片四川话 | 人人妻人人澡人人爽人人欧美一区 | 久久精品视频无码 | 日韩人妻无码精品综合区 | 久久国产乱子伦精品 | 亚洲国产精品久久精品怡红院 | 日日碰狠狠添天天爽无码av | 一区二区三区四区免费视频 | 男女视频一区二区 | 亚洲色网址 | 三级视频在线观看 | 国产免费一区二区三区四区五区 | 国产主播自拍av | 国产一区二区三区视频在线 | 亚洲精品视频在线 | 色综合综合网 | 别揉我奶头一区二区三区 | 国产精品无码一区二区三区三 | 人妻精油按摩bd高清中文字幕 | www婷婷| 肉大榛一进一出免费视频 | 日韩av资源| 伊人222成人综合网 亚洲日本中文 | 五月婷婷视频在线 | 亚州av一区二区 | av丝袜在线| 精品久久久免费 | www在线免费观看 | 久久免费视频网站 | 激情在线观看视频 | 久青草视频在线观看 | 亚洲无线视频 | 国产成人无码精品 | 2014亚洲天堂 | 国产精品久久一 | 日韩av一级片 | 青青青在线| 国产欧美专区 | 久久99久久99精品免观看软件 | 欧美熟妇交换久久久久久分类 | 久草毛片 | 97国产一区 | 最新91在线 | 最新国产视频 | 香港三级网站 | 99精品在线免费视频 | 久久久久亚洲AV成人无码国产 | 一级黄视频| 色人阁在线视频 | 91网页在线观看 | 国产美女91 | 69av国产| 91国产视频在线播放 | 亚洲国产97在线精品一区 | 欧美一级片黄色 | 毛片大全免费看 | 日本一区二区欧美 | 91网站永久免费看nba视频 | 免费黄色av片 | 国产a√精品区二区三区四区 | 美女隐私无遮挡免费 | 真实的国产乱xxxx在线91 | 草逼视频网站 | 欧美亚洲第一页 | 伊人久久天堂 | 精品久久一 | 9久9久9久女女女九九九一九 | 黄色视屏在线免费观看 | 亚洲爱| 国产一级二级在线 | v99av| 色www亚洲国产张柏芝 |