先上效果圖,只憑文字描述,腦補應該有些困難- -
如圖:有三個角色(我們暫且從左到右叫它們A、B、C),一個2D UI(中間動作選擇的框框),一個cube(右邊的方塊)
cube擋住了角色C的頭頂信息
2D UI擋住了角色和cube
共同點是只顯示未被遮擋的部分,遮擋的部分不顯示
相信大多數人在看我這篇文章之前已經看過雨松momo的《人物頭頂名稱與血條更新與繪制》
沒看過的可以去看看:http://www.xuanyusong.com/archives/1032
如果直接使用雨松momo文章中的代碼的話,那么你會發現有一些問題,如圖
這里我沒有用血條,只繪制了文字,都一樣的!
第一:因為是用OnGUI繪制的,所以使用的過程之中角色昵稱和血條會擋住NGUI創建的UI。你可以腦補一下當你打開背包時,一排文字和血條擋住了你的背包。。。
第二:當角色被其他物體遮擋時,這里我說的是3D物體,不是UI。怎么說比較好理解呢!!就好比角色走到了牆后面,角色已經被牆遮擋住了,但是角色昵稱和血條依舊顯示(或許有一些人就要這種效果!好吧,至少在我的項目中這種效果給我的感覺是非常差的)
第三:當同一個場景出現兩個角色時,兩個角色都有自己的昵稱和血條,如果你和另個角色距離太遠且旋轉了角度時,名稱和血條居然奇跡的出現在了天上!沒錯,就是天上
......以上所述只是指出一些bug,並沒有多余的意思,大家勿噴,我也是菜鳥,只是和大家分享下經驗!!
雨松momo的寫這篇文章的目的也就是給大家一個思路,具體在項目中怎么實現成預想效果得靠自己了
這個思路挺好,但是由於一些我自身項目的原因就暫且不用這個思路,這個思路大家可以去看看,以后肯定能用到
現在用另外一種思路實現,這里我們要學到一個東西:Layer(層)
關於layer的介紹請看聖典:http://game.ceeger.com/Components/Layers.html
其實我自己也沒有看過,為了寫這篇文章才去搜的,自己沒事的時候瞎點點就知道是干嘛的了
因為我們要用到NGUI,所以先導入NGUI插件包
進入正題:
1、創建一個空GameObject,改名為NamePanel,設為角色子物體,然后Reset並且調整位置到角色頭頂位置
2、將NamePanel的Layer設置和角色同一個層,並且添加一個UIPanel
3、在NamePanel下添加UILabel,方法為:選中NamePanel->NGUI->Create->Label,並且將Label Overflow屬性設置為ResizeFreely(自動適應文字大小以及長度的)
4、設置UILabel組件的屬性。字體、顯示文字、字體顏色。Effect選擇OutLine,顏色選擇為黑色,這個參數是描邊的,讓字體更清晰
咦,搞毛啊,字體怎么這么大啊?把字體修改小一點,10、5、1,尼瑪怎么還是這么大,而且還看不清了
別急別急,不是你操作錯誤,是還沒操作完!
我一開始遇到這個問題的時候我也納悶了,后來想了想,有可能是沒有添加UIRoot的原因
用過NGUI的都知道,UIRoot是NGUI必不可少的一部分,在手機上自適應分辨率就靠它了
那既然知道原因了,我們就添加一個UIRoot試試唄
5、選擇NamePanel,添加一個UIRoot組件,Scaling Style選擇FixedSizeOnMobiles
哈哈,字體恢復正常了!如果感覺字體比較小,可以在把字體調大一些
運行游戲,你會發現角色移動的時候,頭頂信息雖然跟隨角色了,但是角色旋轉或相機旋轉的時候,頭頂信息旋轉面向攝像機。如果你就想這樣,那是大大滴不行的,不能圖方便就少了代碼
現在我們來寫代碼,代碼很簡單
1 public GameObject targets; 2 private Camera camera; 3 4 void Start() 5 { 6 //獲得主攝像機 7 camera = Camera.main; 8 } 9 10 void Update() 11 { 12 //設置旋轉角度 13 targets.transform.rotation = camera.transform.rotation; 14 }
保存代碼,將腳本掛到角色上,然后把NamePanel拖到參數targets
最后運行游戲,在看看效果,ok,完美
最后總結一下:
代碼上是非常簡單的,看我代碼就知道了,可以說就只有一句代碼。。。
主要就是設置層,層一定要分清楚,很重要!