謝吉?jiǎng)?/p>
(南京工業(yè)職業(yè)技術(shù)學(xué)院計(jì)算機(jī)與軟件學(xué)院,江蘇南京,210023)
基于Unity 3D的第三人稱攝像機(jī)被遮擋的處理
謝吉?jiǎng)?/p>
(南京工業(yè)職業(yè)技術(shù)學(xué)院計(jì)算機(jī)與軟件學(xué)院,江蘇南京,210023)
針對(duì)涉及第三人稱視角游戲中,因攝像機(jī)和游戲主角之間存在一定的距離,容易出現(xiàn)障礙物遮擋,會(huì)影響用戶體驗(yàn)的情況??刹捎蒙渚€方法來探測(cè)障礙物,并在出現(xiàn)遮擋時(shí)將遮擋障礙物做透明化處理。
游戲;障礙物遮擋;射線方法
在3D游戲中,一般采用第一人稱視角或者第三人稱視角。第三人稱視角的實(shí)現(xiàn)方法一般是讓一架攝像機(jī)始終保持一定距離和角度跟隨主角。這種視覺使玩家不但能夠觀察整個(gè)場(chǎng)景的情況,同時(shí)也能夠把握主角的運(yùn)行狀態(tài),因此可操作性強(qiáng),而且易于上手。一般戰(zhàn)略類動(dòng)作類游戲基本上都是采用的這種視角。但是這種視角容易出現(xiàn)一個(gè)問題,就是當(dāng)主角運(yùn)動(dòng)到某個(gè)位置,這里正好有一個(gè)障礙遮擋在主角和攝像機(jī)之間,就會(huì)使主角看不見,同時(shí)可能部分或全部場(chǎng)景也被障礙物擋住,使玩家無法正常操作,非常影響用戶體驗(yàn)。有人采用的方法是出現(xiàn)遮擋后,將攝像機(jī)拉近,使攝像機(jī)越過障礙,但是這樣會(huì)使角色突然變大,場(chǎng)景畫面也會(huì)出現(xiàn)較大的變化,畫面出現(xiàn)明顯抖動(dòng)。而且由于攝像機(jī)移動(dòng)造成視角的變化,會(huì)影響玩家的操作。因此本文提出另一種處理方法:在出現(xiàn)遮擋的時(shí)候,將障礙物進(jìn)行透明化處理,這樣既能讓玩家發(fā)現(xiàn)障礙物的存在,同時(shí)也不會(huì)影響玩家的觀察視角,保證了良好的用戶體驗(yàn)。本文以一款用Unity 3D開發(fā)的第三人稱視角坦克游戲?yàn)槔齺碚f明該問題的處理原理和基本方法。
在游戲中,玩家控制主角——坦克在場(chǎng)景中移動(dòng),同時(shí)搜尋敵人并發(fā)起攻擊。攝像機(jī)跟隨坦克移動(dòng)。場(chǎng)景中有墻、房屋、樹等障礙物。當(dāng)坦克運(yùn)動(dòng)到墻的前面時(shí),由于攝像機(jī)在墻后面,可以看到坦克被墻擋住了,玩家的視線出現(xiàn)了遮擋(如圖1)。這時(shí)玩家很難判斷坦克的狀態(tài),也看不到墻后面的情況,游戲的進(jìn)行受到了影響。
圖1 障礙物遮擋現(xiàn)象
為解決上面的問題,首先應(yīng)該做出是否出現(xiàn)遮擋的判斷,進(jìn)而確定是哪個(gè)障礙物發(fā)生了遮擋。用Unity 3D中常見的射線方法可以很好的解決這個(gè)問題。當(dāng)主角移動(dòng)的時(shí)候從主角向攝像機(jī)方向發(fā)射一條射線,如果射線碰撞到的第一個(gè)對(duì)象是“攝像機(jī)”,表示主角和攝像機(jī)之間沒有別的模型遮擋,不需要做任何處理。如果射線碰撞到的第一個(gè)對(duì)象不是攝像機(jī),那么就表示主角和攝像機(jī)之間有其他模型,出現(xiàn)了攝像機(jī)被遮擋的情況(如圖2)。然后需要進(jìn)一步檢測(cè)障礙物是哪個(gè)模型,接著將該模型變?yōu)橥该餍问健?/p>
圖 2 遮擋的判斷
2.1產(chǎn)生射線
Unity 3D射線是3D世界中一個(gè)點(diǎn)向一個(gè)方向發(fā)射的一條無終點(diǎn)的線,在發(fā)射軌跡中與其他物體發(fā)生碰撞時(shí),它將停止發(fā)射。射線多用于碰撞檢測(cè)、角色移動(dòng)等等。Ray為Unity3D中的射線類。創(chuàng)建一條射線的方法是Ray (origin: Vector3, direction: Vector3),Ray.origin為射線起點(diǎn),Ray. direction為射線的方向。
在本例中,射線起點(diǎn)為主角位置,射線終點(diǎn)為攝像機(jī)。因此可以這樣生成射線。
Ray ray=new Ray(Vector3.Player, transform. MainCamera);
2.2射線的碰撞檢測(cè)
Unity 3D用Physics類來處理場(chǎng)景中可能用到的物理運(yùn)算。該類具有多個(gè)射線碰撞檢測(cè)方法,這里我們使用Physics. Linecast方法,即線性投射。該方法用來檢測(cè)射線是否與某游戲?qū)ο笙嘟弧H绻摲椒ǚ祷豻rue則表示相交,返回則表示未相交。該方法在僅檢測(cè)線性投射區(qū)域,因此效率比較高。形式有 Linecast (start: Vector3, end: Vector3, out hitInfo: RaycastHit),其中start和end表示射線的起點(diǎn)位置和方向,out hitInfo為輸出具體碰撞信息。如果發(fā)生碰撞,具體碰撞數(shù)據(jù)和被碰撞體都會(huì)被記錄在RaycastHit結(jié)構(gòu)上。
利用該方法寫出以下的碰撞檢測(cè)處理程序
2.3障礙物半透明處理
檢測(cè)到遮擋的障礙物后,如果要修改障礙物材質(zhì)的透明度以使障礙物變得透明。為此需要首先設(shè)定該模型支持透明材質(zhì)。選定障礙物模型,進(jìn)入Inspector面板,找到Mesh Renderer選項(xiàng)卡,選擇Shader選項(xiàng),設(shè)定材質(zhì)shade的選項(xiàng)值為Transparent/ Diffuse(如圖3)。此時(shí)該模型即可支持透明材質(zhì)。
如果該模型遮擋了主角,需要將該模型的透明度降低。方法是修改模型的材質(zhì)透明度color.a的值。color.a為1表示材質(zhì)完全不透明,0是完全透明。此處將透明度設(shè)定為0.5,即半透明(如圖4)??梢钥闯?,障礙物變得半透明了。主要代碼如下。
Color color = obj.renderer.material.color;//取出碰撞對(duì)象的顏色給color
color.a = 0.5f;//修改對(duì)象的顏色的a通道值
obj.renderer.material.SetColor("_Color", color);
//重設(shè)對(duì)象的a通道值以半透明處理
圖 4 障礙半透明處理
經(jīng)過透明化處理后,玩家既能看到障礙物的存在,同時(shí)也能夠看到障礙物后面的情況,卻不需要進(jìn)行場(chǎng)景視覺的變化,保證了玩家的游戲體驗(yàn)。
試驗(yàn)表明,該方法對(duì)于墻和房屋之類的比較規(guī)則的障礙物的遮擋問題解決的非常好。但是當(dāng)出現(xiàn)比如樹或零星碎石之類的不規(guī)則物體,由于出現(xiàn)了遮擋和不遮擋的頻繁變換,使得障礙模型較頻繁的出現(xiàn)透明度變化,從而引起畫面和攝像機(jī)的抖動(dòng)。改進(jìn)方法是盡量將不規(guī)則障礙添加較為規(guī)則的BOX,然后把Mesh Collider換成Box Collider,這樣既可以提高系統(tǒng)運(yùn)行效率,也能適當(dāng)降低修改透明度頻率。
[1] 宣雨松. Unity 3D游戲開發(fā)[M]. 北京:人民郵電出版社2012,6: 182-185
[2] Michelle Menard(美)著 史曉明,李強(qiáng) 譯. Unity游戲開發(fā)實(shí)戰(zhàn)[M] . 北京:機(jī)械工業(yè)出版社 2012,4:165-172
[3] 程明智. Unity游戲開發(fā)技術(shù)[M].北京:國(guó)防工業(yè)出版社2012,8: 112-114
[4] 吳亞峰. Unity 3D游戲開發(fā)技術(shù)詳解與典型案例[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 材質(zhì)支持透明的設(shè)置