日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Unity3D研究之人物頭頂名稱與血條更新與繪制

首先學(xué)習(xí)本文的重點(diǎn)內(nèi)容,如何將游戲世界中任意3D坐標(biāo)轉(zhuǎn)換成屏幕中的2D坐標(biāo)。根據(jù)這個(gè)方法計(jì)算出的2D坐標(biāo)屏幕左下角的點(diǎn)為0.0 ,屏幕右上角的坐標(biāo)為1.1 所以真實(shí)的2D坐標(biāo)還得通過(guò)Screen.height 與Screen.width計(jì)算一下才行。

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、渝北網(wǎng)絡(luò)推廣、小程序定制開發(fā)、渝北網(wǎng)絡(luò)營(yíng)銷、渝北企業(yè)策劃、渝北品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供渝北建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

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

1Vector2 position = camera.WorldToScreenPoint (worldPosition);

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

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

NPC.cs

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

001using UnityEngine;
002using System.Collections;
003 
004public class NPC : MonoBehaviour {
005 
006    //主攝像機(jī)對(duì)象
007    private Camera camera;
008    //NPC名稱
009    private string name = "我是雨松MOMO";
010 
011    //主角對(duì)象
012    GameObject hero;
013    //NPC模型高度
014    float npcHeight;
015    //紅色血條貼圖
016    public Texture2D blood_red;
017    //黑色血條貼圖
018    public Texture2D blood_black;
019    //默認(rèn)NPC血值
020    private int HP = 100;
021 
022    void Start ()
023    {
024        //根據(jù)Tag得到主角對(duì)象
025        hero = GameObject.FindGameObjectWithTag("Player");
026        //得到攝像機(jī)對(duì)象
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世界中的坐標(biāo)
048        //默認(rèn)NPC坐標(biāo)點(diǎn)在腳底下,所以這里加上npcHeight它模型的高度即可
049        Vector3 worldPosition = new Vector3 (transform.position.x , transform.position.y + npcHeight,transform.position.z);
050        //根據(jù)NPC頭頂?shù)?D坐標(biāo)換算成它在2D屏幕中的坐標(biāo)
051        Vector2 position = camera.WorldToScreenPoint (worldPosition);
052        //得到真實(shí)NPC頭頂?shù)?D坐標(biāo)
053        position = new Vector2 (position.x, Screen.height - position.y);
054        //注解2
055        //計(jì)算出血條的寬高
056        Vector2 bloodSize = GUI.skin.label.CalcSize (new GUIContent(blood_red));
057 
058        //通過(guò)血值計(jì)算紅色血條顯示區(qū)域
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        //計(jì)算NPC名稱的寬高
067        Vector2 nameSize = GUI.skin.label.CalcSize (new GUIContent(name));
068        //設(shè)置顯示顏色為黃色
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    //下面是經(jīng)典鼠標(biāo)點(diǎn)擊對(duì)象的事件,大家看一下就應(yīng)該知道是什么意思啦。
076    void OnMouseDrag ()
077    {
078        Debug.Log("鼠標(biāo)拖動(dòng)該模型區(qū)域時(shí)");
079    }
080 
081    void OnMouseDown()
082    {
083        Debug.Log("鼠標(biāo)按下時(shí)");
084 
085        if(HP >0)
086        {
087            HP -=5 ;
088        }
089 
090    }
091    void OnMouseUp()
092    {
093        Debug.Log("鼠標(biāo)抬起時(shí)");
094    }
095 
096    void OnMouseEnter()
097    {
098        Debug.Log("鼠標(biāo)進(jìn)入該對(duì)象區(qū)域時(shí)");
099    }
100    void OnMouseExit()
101    {
102        Debug.Log("鼠標(biāo)離開該模型區(qū)域時(shí)");
103    }
104    void OnMouseOver()
105    {
106        Debug.Log("鼠標(biāo)停留在該對(duì)象區(qū)域時(shí)");
107    }
108 
109}

注解1:通過(guò)collider.bounds.size 可以拿到模型對(duì)應(yīng)三個(gè)軸向的高度,但是模型是可以縮放的,所以真實(shí)的模型高度應(yīng)當(dāng)是原始高度乘以縮放系數(shù)才行。 transform.localScale可以拿到模型對(duì)應(yīng)三個(gè)軸向的縮放系數(shù),因?yàn)檫@里我們需要模型的高度,所以忽略X軸與Z軸。

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

注解3: 這里通過(guò)字符串來(lái)獲取它整體的寬度與高度,因?yàn)镹PC的名稱是可變的,所以我們需要?jiǎng)討B(tài)的獲取整體的顯示區(qū)域。同樣是以GUI.skin.label對(duì)象去調(diào)用CalcSize。

如下圖所示,當(dāng)使用鼠標(biāo)點(diǎn)擊NPC對(duì)象時(shí),NPC頭頂?shù)难獥l將開始發(fā)生減血。這個(gè)例子我使用OnGUI繪制當(dāng)然大家也可以在Hierarchy 視圖中的創(chuàng)建GUI Texture 或者GUI Text對(duì)象 來(lái)實(shí)現(xiàn),不過(guò)原理都是這樣的 大家可以試試 哇咔咔。


分享名稱:Unity3D研究之人物頭頂名稱與血條更新與繪制
鏈接地址:http://www.5511xx.com/article/cdcshhh.html