謝吉剛
(南京工業職業技術學院計算機與軟件學院,江蘇南京,210023)
基于Unity 3D的第三人稱攝像機被遮擋的處理
謝吉剛
(南京工業職業技術學院計算機與軟件學院,江蘇南京,210023)
針對涉及第三人稱視角游戲中,因攝像機和游戲主角之間存在一定的距離,容易出現障礙物遮擋,會影響用戶體驗的情況。可采用射線方法來探測障礙物,并在出現遮擋時將遮擋障礙物做透明化處理。
游戲;障礙物遮擋;射線方法
在3D游戲中,一般采用第一人稱視角或者第三人稱視角。第三人稱視角的實現方法一般是讓一架攝像機始終保持一定距離和角度跟隨主角。這種視覺使玩家不但能夠觀察整個場景的情況,同時也能夠把握主角的運行狀態,因此可操作性強,而且易于上手。一般戰略類動作類游戲基本上都是采用的這種視角。但是這種視角容易出現一個問題,就是當主角運動到某個位置,這里正好有一個障礙遮擋在主角和攝像機之間,就會使主角看不見,同時可能部分或全部場景也被障礙物擋住,使玩家無法正常操作,非常影響用戶體驗。有人采用的方法是出現遮擋后,將攝像機拉近,使攝像機越過障礙,但是這樣會使角色突然變大,場景畫面也會出現較大的變化,畫面出現明顯抖動。而且由于攝像機移動造成視角的變化,會影響玩家的操作。因此本文提出另一種處理方法:在出現遮擋的時候,將障礙物進行透明化處理,這樣既能讓玩家發現障礙物的存在,同時也不會影響玩家的觀察視角,保證了良好的用戶體驗。本文以一款用Unity 3D開發的第三人稱視角坦克游戲為例來說明該問題的處理原理和基本方法。
在游戲中,玩家控制主角——坦克在場景中移動,同時搜尋敵人并發起攻擊。攝像機跟隨坦克移動。場景中有墻、房屋、樹等障礙物。當坦克運動到墻的前面時,由于攝像機在墻后面,可以看到坦克被墻擋住了,玩家的視線出現了遮擋(如圖1)。這時玩家很難判斷坦克的狀態,也看不到墻后面的情況,游戲的進行受到了影響。

圖1 障礙物遮擋現象
為解決上面的問題,首先應該做出是否出現遮擋的判斷,進而確定是哪個障礙物發生了遮擋。用Unity 3D中常見的射線方法可以很好的解決這個問題。當主角移動的時候從主角向攝像機方向發射一條射線,如果射線碰撞到的第一個對象是“攝像機”,表示主角和攝像機之間沒有別的模型遮擋,不需要做任何處理。如果射線碰撞到的第一個對象不是攝像機,那么就表示主角和攝像機之間有其他模型,出現了攝像機被遮擋的情況(如圖2)。然后需要進一步檢測障礙物是哪個模型,接著將該模型變為透明形式。

圖 2 遮擋的判斷
2.1產生射線
Unity 3D射線是3D世界中一個點向一個方向發射的一條無終點的線,在發射軌跡中與其他物體發生碰撞時,它將停止發射。射線多用于碰撞檢測、角色移動等等。Ray為Unity3D中的射線類。創建一條射線的方法是Ray (origin: Vector3, direction: Vector3),Ray.origin為射線起點,Ray. direction為射線的方向。
在本例中,射線起點為主角位置,射線終點為攝像機。因此可以這樣生成射線。
Ray ray=new Ray(Vector3.Player, transform. MainCamera);
2.2射線的碰撞檢測
Unity 3D用Physics類來處理場景中可能用到的物理運算。該類具有多個射線碰撞檢測方法,這里我們使用Physics. Linecast方法,即線性投射。該方法用來檢測射線是否與某游戲對象相交。如果該方法返回true則表示相交,返回則表示未相交。該方法在僅檢測線性投射區域,因此效率比較高。形式有 Linecast (start: Vector3, end: Vector3, out hitInfo: RaycastHit),其中start和end表示射線的起點位置和方向,out hitInfo為輸出具體碰撞信息。如果發生碰撞,具體碰撞數據和被碰撞體都會被記錄在RaycastHit結構上。
利用該方法寫出以下的碰撞檢測處理程序

2.3障礙物半透明處理
檢測到遮擋的障礙物后,如果要修改障礙物材質的透明度以使障礙物變得透明。為此需要首先設定該模型支持透明材質。選定障礙物模型,進入Inspector面板,找到Mesh Renderer選項卡,選擇Shader選項,設定材質shade的選項值為Transparent/ Diffuse(如圖3)。此時該模型即可支持透明材質。
如果該模型遮擋了主角,需要將該模型的透明度降低。方法是修改模型的材質透明度color.a的值。color.a為1表示材質完全不透明,0是完全透明。此處將透明度設定為0.5,即半透明(如圖4)。可以看出,障礙物變得半透明了。主要代碼如下。
Color color = obj.renderer.material.color;//取出碰撞對象的顏色給color
color.a = 0.5f;//修改對象的顏色的a通道值
obj.renderer.material.SetColor("_Color", color);
//重設對象的a通道值以半透明處理

圖 4 障礙半透明處理
經過透明化處理后,玩家既能看到障礙物的存在,同時也能夠看到障礙物后面的情況,卻不需要進行場景視覺的變化,保證了玩家的游戲體驗。
試驗表明,該方法對于墻和房屋之類的比較規則的障礙物的遮擋問題解決的非常好。但是當出現比如樹或零星碎石之類的不規則物體,由于出現了遮擋和不遮擋的頻繁變換,使得障礙模型較頻繁的出現透明度變化,從而引起畫面和攝像機的抖動。改進方法是盡量將不規則障礙添加較為規則的BOX,然后把Mesh Collider換成Box Collider,這樣既可以提高系統運行效率,也能適當降低修改透明度頻率。
[1] 宣雨松. Unity 3D游戲開發[M]. 北京:人民郵電出版社2012,6: 182-185
[2] Michelle Menard(美)著 史曉明,李強 譯. Unity游戲開發實戰[M] . 北京:機械工業出版社 2012,4:165-172
[3] 程明智. Unity游戲開發技術[M].北京:國防工業出版社2012,8: 112-114
[4] 吳亞峰. Unity 3D游戲開發技術詳解與典型案例[M].北京:人民郵電出版社 2012,11: 143-148
The third person perspective camera with occluded
Xie Jigang
(Nanjing Institute of Industry Technology,Nanjing,210016,Computer and Software College)
In third person game, because a certain distance between the camera and the protagonist,prone to shelter situation,very influence of the user experience.If the ray method to detect obstacles,in the presence of occlusion the occlusion obstacles do transparent treatment can be a very good solution to this problem.
game;Occlusion;ray method

圖 3 材質支持透明的設置