unity3d 角色頭頂信息3D&2D遮擋解決方案(一)


      先上效果圖,只憑文字描述,腦補應該有些困難- -

      如圖:有三個角色(我們暫且從左到右叫它們A、B、C),一個2D UI(中間動作選擇的框框),一個cube(右邊的方塊)
      更多精彩請關注【狗刨學習網】  

      cube擋住了角色C的頭頂信息

      2D UI擋住了角色和cube

     共同點是隻顯示未被遮擋的部分,遮擋的部分不顯示

     相信大多數人在看我這篇文章之前已經看過雨松momo的《人物頭頂名稱與血條更新與繪製》

     如果直接使用雨松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. <font face="宋體" size="2"> 1     public GameObject targets;
  2. 2     private Camera camera;
  3. 3     
  4. 4     void Start()
  5. 5     {
  6. 6         //獲得主攝像機
  7. 7         camera = Camera.main;
  8. 8     }

  9. 10     void Update()
  10. 11     {
  11. 12         //設置旋轉角度
  12. 13         targets.transform.rotation = camera.transform.rotation;
  13. 14     }</font>
複製代碼

      保存代碼,將腳本掛到角色上,然後把NamePanel拖到參數targets

      最後運行遊戲,在看看效果,ok,完美

最後總結一下:

      代碼上是非常簡單的,看我代碼就知道了,可以說就只有一句代碼。。。

      主要就是設置層,層一定要分清楚,很重要!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章