![Unity高級(jí)項(xiàng)目實(shí)戰(zhàn)課件06全方位滾動(dòng)射擊游戲講述_第1頁](http://file4.renrendoc.com/view/b557dc706c79b6f02862680a0a2b391a/b557dc706c79b6f02862680a0a2b391a1.gif)
![Unity高級(jí)項(xiàng)目實(shí)戰(zhàn)課件06全方位滾動(dòng)射擊游戲講述_第2頁](http://file4.renrendoc.com/view/b557dc706c79b6f02862680a0a2b391a/b557dc706c79b6f02862680a0a2b391a2.gif)
![Unity高級(jí)項(xiàng)目實(shí)戰(zhàn)課件06全方位滾動(dòng)射擊游戲講述_第3頁](http://file4.renrendoc.com/view/b557dc706c79b6f02862680a0a2b391a/b557dc706c79b6f02862680a0a2b391a3.gif)
![Unity高級(jí)項(xiàng)目實(shí)戰(zhàn)課件06全方位滾動(dòng)射擊游戲講述_第4頁](http://file4.renrendoc.com/view/b557dc706c79b6f02862680a0a2b391a/b557dc706c79b6f02862680a0a2b391a4.gif)
![Unity高級(jí)項(xiàng)目實(shí)戰(zhàn)課件06全方位滾動(dòng)射擊游戲講述_第5頁](http://file4.renrendoc.com/view/b557dc706c79b6f02862680a0a2b391a/b557dc706c79b6f02862680a0a2b391a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
全方位滾動(dòng)射擊玩耍鎖定,激光制導(dǎo),消滅敵機(jī),11玩法介紹21玩法介紹鎖定,激光制導(dǎo),消滅敵機(jī)!鼠標(biāo)把握!鼠標(biāo)把握玩家方向一舉殲敵將獲得高分!能夠一次性集中鎖定多架敵機(jī)同時(shí)消滅多架敵機(jī)將得高分左鍵放射索敵激光!持續(xù)按下左鍵將放射鎖敵激光。鎖定!索敵激光和敵機(jī)相遇則將其鎖定。使用激光制導(dǎo)攻擊!松開左鍵,將使用激光制導(dǎo)進(jìn)展攻擊。32功能強(qiáng)大的激光制導(dǎo)42功能強(qiáng)大的激光制導(dǎo) 射擊玩耍是種類繁多的玩耍中擁有極高人氣的一種玩耍類型。其歷史作常悠久,繽紛且已經(jīng)被開發(fā)出了很多種類的玩耍系統(tǒng)。即使只依據(jù)!畫面滾動(dòng)的方向,也可分為縱軸滾動(dòng)、橫軸滾動(dòng)以及朝著畫面內(nèi)部前進(jìn)的3D滾動(dòng)。
在3D技術(shù)成為主流之后,即使是一平面玩耍,背景和玩家角色使用多邊形繪制的狀況也越來越多。隨著渲染技術(shù)的不斷打磨,現(xiàn)在很多玩耍的的面品質(zhì)絲毫不輸給電影。
這次我們開發(fā)的“噬星者”,雖然是經(jīng)典的科幻題材,不過玩耍內(nèi)容卻是全方位滾動(dòng)這種略顯瘋狂的類型。由于美術(shù)設(shè)計(jì)師的天才創(chuàng)意,玩耍中還參與了能夠鎖定敵機(jī)并進(jìn)展攻擊的激光制導(dǎo)功能。對(duì)玩耍內(nèi)容和程序制作而言,這都是特殊重要的一局部。
玩耍的關(guān)鍵詞是強(qiáng)大的激光制導(dǎo):
被制導(dǎo)的激光在攻擊時(shí)看起來就像突襲獵物的蛇,“噬星者”這個(gè)名字正是因此而來的。
另外,在玩耍制作的過程中,碰撞處理是一個(gè)難點(diǎn)二玩耍中能夠‘·鎖定多架敵機(jī)一次性消滅”的特性會(huì)導(dǎo)致玩家飛機(jī)不射擊僅移動(dòng)的時(shí)間變得較長(zhǎng)。這樣玩家飛機(jī)和從畫面外飛來的敵機(jī)發(fā)生碰撞的狀況將很頻繁。我們通過優(yōu)化敵機(jī)的移動(dòng)算法解決了這個(gè)問題。請(qǐng)讀者在試玩玩耍時(shí)留意一下這方面的處理。52.1腳本一覽62.2本章小節(jié)索敵激光的碰撞檢測(cè)不會(huì)重復(fù)的鎖定激光制導(dǎo)消息窗口73索敵激光的碰撞檢測(cè)3.1關(guān)聯(lián)文件ScoutingLaser.csScoutingLaserMesh.cs93.2概要 “噬星者”中的玩家飛機(jī)除
了一般射擊外,還配備了可以自
動(dòng)跟蹤敵機(jī)的激光制導(dǎo)二為了發(fā)
射制導(dǎo)激光,必需先用索敵激光
探測(cè)敵機(jī)并將其鎖定?!八鲾场?/p>
一詞就是查找敵人的意思。 通過鼠標(biāo)操作使玩家飛機(jī)旋轉(zhuǎn),索敵激光就會(huì)繪制出扇形殘影,進(jìn)入該范圍的敵機(jī)將被一次性鎖定。這可以說是“噬星者”的最大特色。下面我們將爭(zhēng)論如何探測(cè)到進(jìn)人索敵激光捕獲范圍的敵機(jī),以及如何推斷鎖定成功。103.3索敵激光的碰撞檢測(cè) 索敵激光朝著敵機(jī)方向射出,與敵機(jī)交會(huì)后即可鎖定目標(biāo)。利用碰撞檢測(cè)我們可以很簡(jiǎn)潔地感知到對(duì)象之間是否發(fā)生了重
合。為了使玩家飛機(jī)發(fā)起攻擊時(shí)生成的矩形區(qū)域和敵機(jī)進(jìn)展碰撞檢測(cè),需要設(shè)定敵機(jī)的碰撞外形。 如以下圖,對(duì)索
敵激光也要設(shè)置符合
其探測(cè)區(qū)域的碰撞形
狀。這樣就可以通過
碰撞大事探測(cè)到索敵
激光和敵機(jī)發(fā)生了重
疊。不過這里需要注
意的是,應(yīng)當(dāng)把碰撞
外形設(shè)置為觸發(fā)器
(trigger)。 觸發(fā)器也是碰撞器的一種,只不過在這種狀況下,發(fā)生碰撞的兩個(gè)物體不會(huì)被彼此彈開,而是將保持原有狀態(tài)連續(xù)運(yùn)動(dòng)。
圖描述了玩耍對(duì)象發(fā)生碰
撞時(shí),承受一般碰撞器和觸發(fā)
器的區(qū)分。
如圖中(1)所示,當(dāng)使用普
通碰撞器時(shí),玩耍對(duì)象會(huì)在發(fā)
生碰撞的瞬間停下,彼此不會(huì)
發(fā)生重疊。這是由于對(duì)象間發(fā)
生了所謂的擠壓。碰撞后物體
將被彈開,或者在發(fā)生碰撞的
位置停下來,至于具體是哪種狀況,還要取決于對(duì)象間的彈性和摩擦等物理特性。
但是,假設(shè)碰撞對(duì)象的一方使用了觸發(fā)器,狀況將如圖中(2)所示。碰撞對(duì)象將穿透彼此,各自保持接觸前的速度連續(xù)前進(jìn)。_碰撞大事不會(huì)影響對(duì)象的運(yùn)動(dòng)。3.3索敵激光的碰撞檢測(cè) 索敵激光假設(shè)承受一般碰
撞器的話會(huì)把敵人彈開,所以
必需設(shè)置為觸發(fā)器。
關(guān)于索敵激光的碰撞還有
一個(gè)要考慮的問題。這就是快
速轉(zhuǎn)彎時(shí)的穿透問題。
Unity中為了削減碰撞處
理的計(jì)算量,即使對(duì)象正在
移動(dòng),也承受Update被調(diào)用
瞬間的對(duì)象的位置坐標(biāo)來進(jìn)展
碰撞檢測(cè),并不考慮對(duì)象以何種方向和何種速度運(yùn)動(dòng)。
“噬星者”中玩家飛機(jī)總是跟隨鼠標(biāo)光標(biāo)運(yùn)動(dòng),當(dāng)玩家用鼠標(biāo)做出類似畫圓等操作時(shí)飛機(jī)將高速旋轉(zhuǎn)。同時(shí),索敵激光總是筆直地伸向玩家飛機(jī)的前方,這就導(dǎo)致了在執(zhí)行碰撞檢測(cè)時(shí)有可能消逝如圖(1)所示的穿透敵機(jī)的狀況。3.3索敵激光的碰撞檢測(cè) 一種解決方法是,將碰撞檢測(cè)的計(jì)算方式改為Continuous(連續(xù)的)。前面提到的Discrete(離散的)計(jì)算方法中,只使用每一幀內(nèi)的瞬間位置。而Continuous的計(jì)算方法中,會(huì)將相鄰幾幀的位置坐標(biāo)連起來作為碰撞檢測(cè)的外形。這樣即使物體在高速運(yùn)動(dòng)時(shí)也不會(huì)發(fā)生穿透的現(xiàn)象。 雖然看起來Continuous是一種好方法,不過它具有運(yùn)算量大且無法使用網(wǎng)格碰撞器等缺點(diǎn)?;蛟S將來的Unity版本會(huì)解決這些問題,但這里我們將使用如圖(2)所示的生成扇形碰撞網(wǎng)格的方法來處理。雖然這種方法比Continuous略微麻煩一些,不過它的應(yīng)用范圍很廣,所以我們不妨借此時(shí)機(jī)學(xué)習(xí)一下。3.3索敵激光的碰撞檢測(cè)3.4碰撞網(wǎng)格的生成方法 我們?cè)诘?0章“迷蹤賽道”的“多邊形網(wǎng)格的創(chuàng)立”一節(jié)中將具體說明如何在Unity中創(chuàng)立網(wǎng)格。“迷蹤賽道”玩耍中創(chuàng)立了用于顯示和用于碰撞檢測(cè)的網(wǎng)格,而在“噬星者”的索敵激光中,我們只需要?jiǎng)?chuàng)立用于碰撞檢測(cè)的網(wǎng)格。由于外形比較單一,所以步驟比“迷蹤賽道”更為簡(jiǎn)潔。這里我們只對(duì)生成網(wǎng)格的必要步驟進(jìn)展講解。
創(chuàng)立碰撞網(wǎng)格或許需要以下兩步。獵取頂點(diǎn)的位置坐標(biāo)連接三角形的頂點(diǎn)繪制出多邊形(頂J點(diǎn)數(shù)組) 由于索敵激光朝著玩家飛機(jī)的前方直線延長(zhǎng),所以發(fā)生旋轉(zhuǎn)時(shí)將描繪出扇形的軌跡。而Unity中的網(wǎng)格不管用于顯示還是用于碰撞檢測(cè)都必需由只角形構(gòu)成。因此,對(duì)于扇形的軌跡,可以像切蛋杜一樣,從中心向四周以均等的角度進(jìn)展切分,利用三角形來近似地表現(xiàn)出扇形。 圖中,頂點(diǎn)0是扇形的中心了頂點(diǎn)1至
頂點(diǎn)5在圓弧上按相等的間隔排列。
不難看出,頂點(diǎn)0到頂點(diǎn)1的直線表示
旋轉(zhuǎn)開頭時(shí)的索敵激光、頂點(diǎn)0到頂點(diǎn)5的
直線表示旋轉(zhuǎn)完畢時(shí)的索敵激光。這兩條
直線中間的扇形區(qū)域就是我們將要生成的
碰撞外形。
計(jì)算出圖中的各頂點(diǎn)的排列后,需要
生成用于準(zhǔn)備各只角形中的頂點(diǎn)的排列挨次的數(shù)據(jù)。仍以上圖為例,可知
0號(hào)三角形:頂點(diǎn)0-頂點(diǎn)1-頂點(diǎn)2
1號(hào)三角形:頂點(diǎn)0-頂點(diǎn)2-頂點(diǎn)3
……
n號(hào)三角形:頂點(diǎn)0-頂點(diǎn)n+頂點(diǎn)n+2
計(jì)算規(guī)章特殊簡(jiǎn)潔。
那么我們來看看生成碰撞網(wǎng)格的相關(guān)代碼:3.4碰撞網(wǎng)格的生成方法3.4碰撞網(wǎng)格的生成方法 圖中顯示了代碼中的一些變量。請(qǐng)參考以下說明進(jìn)展理解。 makeFanShape函數(shù)中的參數(shù)(a)首先對(duì)圓弧的開頭角度
startAngle和終止角度
endAngle橫跨0度的狀況進(jìn)
行處理。請(qǐng)考慮一以以下圖(1)
的狀況。以時(shí)鐘為例。圓弧
從1點(diǎn)鐘的方向開頭,跨越
12點(diǎn)旋轉(zhuǎn)到11點(diǎn)的位置。
為了生成扇形外形,需要從
startAngle到endAngle的
角度進(jìn)展分割。由于旋轉(zhuǎn)以
順時(shí)針方向?yàn)檎栽摻嵌葘⒋┻^6點(diǎn)鐘的方向。但事實(shí)上索敵激光的軌跡是從12點(diǎn)的方向穿過的,這樣就變得截然相反了。為了避開這種狀況,當(dāng)startAngle和endAngle橫跨12點(diǎn)鐘的方向代表的0度時(shí),我們給startAngle增加了360度圖(2)是將各角度排列在直線上的結(jié)果。沿順時(shí)針方向,角度越大越靠右。圖(3)表示將startAngle加上360度以后的狀況??梢钥吹絪tartAngle和endAngle的起始關(guān)系發(fā)生了轉(zhuǎn)變,表示角度的方向的箭頭跨越了360度(=0度)這一界限。由于圓的一周是360度,所以即使加上360度也不會(huì)轉(zhuǎn)變?cè)趫A上的位置。3.4碰撞網(wǎng)格的生成方法3.4碰撞網(wǎng)格的生成方法(b)這里使endAngle的值總是大于startAngle。由于Unity中規(guī)定“頂點(diǎn)挨次為順時(shí)針方向的外表為正面”。關(guān)于這一點(diǎn)我們后續(xù)會(huì)再做具體說明。計(jì)算出分割扇形所需要的二角形數(shù)量。只要將從endAngle到startAngle的角度除以一個(gè)三角形所占的中心角度pieceAngle,再將所得值加1后取整即可。(c)需要留意數(shù)組的容量應(yīng)確保頂點(diǎn)
都能被存儲(chǔ)。請(qǐng)?jiān)俅螀⒖紙D??梢?/p>
看到當(dāng)三角形的個(gè)數(shù)為triangleNum
時(shí),圓弧上將消逝trigangleNum+1
個(gè)頂點(diǎn)。最終追加的一個(gè)頂點(diǎn)表示圓
中心的頂點(diǎn)。(d)預(yù)備好數(shù)組以后,將實(shí)際的頂點(diǎn)存人該數(shù)組。首先將中心頂點(diǎn)作為數(shù)組的第一個(gè)元素存人??梢詫⑵渲翟O(shè)置為代表原點(diǎn)的Vector.zero。(e)接下來計(jì)算圓弧上的頂點(diǎn)坐標(biāo)。圓弧L的頂點(diǎn)坐標(biāo)可以通過將距離原點(diǎn):adios的Z軸上的點(diǎn)“Vector3.}orward*radius“繞Y軸旋轉(zhuǎn)currentAngle度計(jì)算得出。(f)頂點(diǎn)的位置坐標(biāo)全部計(jì)算完畢后,將各二角形的頂點(diǎn)按挨次放人數(shù)組circleTriangles中。前面我們已經(jīng)總結(jié)r一個(gè)簡(jiǎn)一單的規(guī)章,即
n號(hào)三角形:頂點(diǎn)0-頂點(diǎn)n+1-頂點(diǎn)n+2
步驟(b)中使endAnglew定大于startAngle就足為了便利這里的頂點(diǎn)排序假設(shè)endAngle比startAngle小,為了讓頂點(diǎn)仍按順時(shí)針方向排列.就必需變成
n號(hào)三角形:頂點(diǎn)0-頂點(diǎn)n+2-頂點(diǎn)n+1(g)當(dāng)頂點(diǎn)的位置坐標(biāo)和索引數(shù)組都預(yù)備好后,將它們?cè)O(shè)置到網(wǎng)格碰攤器。(h)最終將網(wǎng)格碰撞器的enable成員按false,true的挨次代入。否則網(wǎng)格的變化將無法反映出來。清同學(xué)記住這個(gè)流程。3.4碰撞網(wǎng)格的生成方法3.5確認(rèn)碰撞網(wǎng)格 現(xiàn)在讓我們來確認(rèn)一下制作好的索敵激光的碰撞網(wǎng)格是否符合我們的期望。
碰撞網(wǎng)格通常不會(huì)被繪
制在玩耍畫面上二雖然也可
以添加MeshRenderer組件
用于調(diào)試,不過通過同時(shí)顯
示場(chǎng)景視圖和玩耍視圖,即
可便利地杏看碰撞網(wǎng)格。
在Unity編輯器中把窗口
的布局設(shè)為Tall,并將Game
標(biāo)簽頁拖曳到場(chǎng)景(Scene)視
圖上,能看到圖所示的分割
顯示畫面。在層級(jí)視圖中選
擇ScoutinglaseMesh對(duì)象
后點(diǎn)擊檢視面板中
MeshCollider旁的三角形。這樣一來,當(dāng)玩家飛機(jī)旋轉(zhuǎn)時(shí),索敵激光的碰撞外形就通過線框圖顯示出來了。3.6小結(jié)本節(jié)內(nèi)容涉及了很多數(shù)學(xué)計(jì)算,還必需為這些計(jì)算準(zhǔn)務(wù)很多數(shù)據(jù),可能理解起來比較困難。不過網(wǎng)格的生成在特效等很多場(chǎng)合中都能應(yīng)用,是一項(xiàng)作特殊有效的技術(shù),看到線框圖顯示的碰撞外形伸縮的樣子后,估量有些讀者已經(jīng)躍躍欲試想開發(fā)個(gè)精彩的特效了吧。4不會(huì)重復(fù)的鎖定4.1關(guān)聯(lián)文件ScoutingLaser.cs在“噬星者”玩耍中,當(dāng)鎖定敵機(jī)時(shí),在播放音效的同時(shí)會(huì)顯示“鎖定標(biāo)記”,右上角的“鎖定槽”將消逝一個(gè):另外玩家可以留意到,即使用索敵激光再次定位已經(jīng)被鎖定的敵機(jī),也不會(huì)重復(fù)鎖定二這是由于,“噬星者”中不允許對(duì)同一敵機(jī)鎖定屢次;只有BOSS飛機(jī)允許被鎖定兩次以上,不過這其實(shí)是分別對(duì)組成BOSS飛機(jī)的多個(gè)局部進(jìn)展鎖定。一個(gè)對(duì)象只能被鎖定一次,這個(gè)原則是不變的。4.2概要4.3鎖定的治理 為了防止對(duì)同一架敵機(jī)鎖定兩次以上,首先需要對(duì)大量敵機(jī)做出明確區(qū)分:“噬星者”中,同一種類的敵時(shí)機(jī)同時(shí)大量消逝:這樣一來,只通過“預(yù)設(shè)類型”是無法對(duì)其進(jìn)展區(qū)分的。
Unity中允許對(duì)對(duì)象設(shè)置實(shí)例ID(instanceID)。每個(gè)對(duì)象的實(shí)例ID各不一樣,不同的對(duì)象不能同時(shí)使用同一個(gè)實(shí)例ID。
這種不會(huì)重復(fù)的特性稱為Uniq?!癠niq”一詞在英文中的本意是“唯一的”?!拔ㄒ坏闹怠本褪恰安粫?huì)重復(fù)的值”,實(shí)例ID就是這種“唯一的值”?!笆尚钦摺敝芯褪鞘褂眠@樣的實(shí)例ID來治理已經(jīng)鎖定的敵機(jī)的。
當(dāng)前已經(jīng)鎖定的敵機(jī)的實(shí)例ID都被記錄在鎖定列表中鎖定列表的槽數(shù)等于一次能夠鎖定的敵機(jī)的最大數(shù)量。
下面我們以鎖定兩架敵機(jī)的狀況為例來說明鎖定列表的工作流程。請(qǐng)讀者參照以以下圖進(jìn)展理解。 現(xiàn)在玩家飛機(jī)前方有兩架敵機(jī),實(shí)例ID(以下簡(jiǎn)稱為ID)分別力10和11。
(1)玩家飛機(jī)一邊放射索敵激光,一邊略微向左旋轉(zhuǎn),這時(shí)ID=10的敵機(jī)進(jìn)入激光的軌跡內(nèi),因此從鎖定列表中查詢ID=10的敵機(jī),在鎖定列表中沒有ID=10的記錄,意味著該敵機(jī)未被鎖定過,于是就鎖定該機(jī),并將ID=10記錄到鎖定列表中。
(2)玩家飛機(jī)在ID=10的敵機(jī)被鎖定的了位置連續(xù)左轉(zhuǎn),鎖定ID=11的敵機(jī)后也把ID=11記錄到鎖定列表中。
(3)鎖定ID=11的敵機(jī)后,玩家屹機(jī)在該處停下,開頭向右轉(zhuǎn),索敵激光在碰撞檢測(cè)的過程中將再次命中ID=11的敵機(jī)。但是由于鎖定列表中已經(jīng)存在了ID=11的記錄,所以不會(huì)再次對(duì)其執(zhí)行鎖定處理。這是避開對(duì)同一對(duì)象進(jìn)展屢次鎖定的機(jī)制中最關(guān)鍵的地方。
(4)玩家飛機(jī)向鎖定的敵機(jī)放射制導(dǎo)激光。制導(dǎo)激光擊中ID=10的敵機(jī)后,從鎖定列表中刪除ID=10的記錄。假設(shè)遺忘刪除,就可能會(huì)造成鎖定列表的存儲(chǔ)空間缺乏而無法鎖定敵機(jī)。因此在擊毀敵機(jī)后確定要將相應(yīng)記錄從鎖定列表中刪除。 了解了鎖定列表的工作流程后,讓我們看看實(shí)際的代碼。4.3鎖定的治理 ScoutingLaser.Lockon方法在ScoutingLaserMeshController的OnTriggerEnter中被調(diào)用。collider參數(shù)也是通過OnTriggerEnter直接傳人。 (a)首先推斷和索敵激光的碰撞區(qū)域(觸發(fā)器)發(fā)生碰撞的對(duì)象是否為敵機(jī)。假設(shè)是敵機(jī),則取得該對(duì)象的實(shí)例ID。 (b)接下來加上已鎖定的敵機(jī)數(shù)量。假設(shè)鎖定列表中已經(jīng)含有指定的實(shí)例ID,也就是說敵機(jī)對(duì)象已經(jīng)被鎖定過,IncreaseLockonCount方法將返回false。當(dāng)鎖定數(shù)量到達(dá)了允許的最大值時(shí),也進(jìn)展同樣的處理。假設(shè)函數(shù)返回true,則意味著該敵機(jī)對(duì)象未被鎖定過,處理將連續(xù)進(jìn)了。 (c)在鎖定列表中,取得記錄新鎖定的敵機(jī)的位置,(鎖定編號(hào))。假設(shè)鎖定列表中已沒有空位,getLockonNumber方法將返回-1。為已經(jīng)通過IncreaseLockonCount函數(shù)檢查過允許鎖定的址大數(shù)量,所以此時(shí)鎖定列表中確定存在空位,不過為了增加代碼的強(qiáng)健性,我們照舊將該錯(cuò)誤檢查添加到代碼中。4.3鎖定的治理4.4小結(jié)現(xiàn)在讀者應(yīng)當(dāng)能夠理解實(shí)例ID的用處了吧?!笆尚钦摺敝袨榱酥卫礞i定的敵機(jī),使用了“記錄處理過的對(duì)象”這一實(shí)例ID的典型用法。在“需要對(duì)大量同類型的對(duì)象進(jìn)展區(qū)分”的狀況下,往往都可以使用實(shí)例D來解決問題。5制導(dǎo)激光5.1關(guān)聯(lián)文件LockonLaserMotion.cs5.2概要“噬星者”中,敵機(jī)一且被鎖定就無法逃脫,確定會(huì)被制導(dǎo)激光擊中這是一種特殊優(yōu)秀的攻擊武器。假設(shè)從武器的性能來考慮,最好使激光朝著敵機(jī)直線匕去,不過考慮到玩耍的畫面表現(xiàn)效果,我們使其沿著曲線向敵機(jī)飛去。下面我們對(duì)這種兼顧性能和視覺效果的制導(dǎo)激光的制作方法進(jìn)展說明。5.3依據(jù)TrailRenderer生成網(wǎng)格 首先我們來對(duì)顯示制導(dǎo)激光需要用到的TrailRenderer組件進(jìn)展講解。
制導(dǎo)激光像彗星一樣拖著長(zhǎng)長(zhǎng)的尾巴顯示在畫面上。雖然看起來似乎有瘦長(zhǎng)的網(wǎng)格,但事實(shí)上激光前端的對(duì)象并沒有使用用于顯示的MeshRenderer。使用了TrailRenderer的對(duì)象在移動(dòng)時(shí),會(huì)像圖6.12那樣沿著運(yùn)動(dòng)軌跡自動(dòng)生成瘦長(zhǎng)的網(wǎng)格。固然它也支持貼圖。 圖(1)是使用了TrailRenderer的
制導(dǎo)激光在玩耍中的畫面表現(xiàn),
(2)是將其用線框圖顯示的結(jié)果???/p>
以看到,沿著制導(dǎo)激光的軌跡生成
了很多瘦長(zhǎng)的網(wǎng)格。5.3依據(jù)TrailRenderer生成網(wǎng)格5.4制導(dǎo)激光的移動(dòng) 依據(jù)上文可知,假設(shè)使用了TrailRenderer,軌跡的繪制就會(huì)變得比較簡(jiǎn)潔。在位于頭部的對(duì)象動(dòng)起來后,TrailRendere:就會(huì)沿著其移動(dòng)的路徑繪制出長(zhǎng)長(zhǎng)的激光軌跡。
那么現(xiàn)在我們來考慮在每幀的Update方法中該如何更新對(duì)象的移動(dòng)方向。由于制導(dǎo)激光朝著敵機(jī)飛去,因此首先需要把握好玩家和敵機(jī)的位置關(guān)系。
在圖中,位于箭頭頂端的I`1色圓圈表示玩耍對(duì)象。可以把箭頭看作是TrailRenderer描繪的軌
跡從放射的那一瞬間開頭,制導(dǎo)
激光始終朝著上方沿著直線前進(jìn)。
由于TrailRenderer的作用,激光
將不斷地往下延長(zhǎng)。敵機(jī)位于激光前進(jìn)方向左側(cè)90度的位置。假設(shè)此時(shí)將激光的前進(jìn)方向左轉(zhuǎn)90度,它將朝著敵機(jī)飛去。 玩耍中的制導(dǎo)激光是沿著曲線軌跡向敵機(jī)飛去的:但是假設(shè)每一幀更新時(shí)都將其角度轉(zhuǎn)變?yōu)槌驍硻C(jī)的話.就
會(huì)消逝圖(1)那樣的直線運(yùn)動(dòng)的情
況:為了解決這個(gè)問題,我們需要
對(duì)征次轉(zhuǎn)變方向時(shí)轉(zhuǎn)動(dòng)的角度添
加一個(gè)最大值限制。具體來說,
就是先計(jì)算出當(dāng)前前進(jìn)方向到敵
機(jī)方向需要旋轉(zhuǎn)的角度,再將其
乘以確定的比例,把最終得到的
值作為旋轉(zhuǎn)角度。
請(qǐng)參考圖(2)進(jìn)展理解。假設(shè)
每次轉(zhuǎn)變方向只允許旋轉(zhuǎn)30%的
角度。
這種狀況下,當(dāng)敵機(jī)位于前進(jìn)方向左側(cè)90度時(shí),可以算出旋轉(zhuǎn)角度是90度的30%等于27度。之所以不把角度的限制設(shè)定為諸如30度這樣固定的數(shù)值,是為了使激光的運(yùn)動(dòng)軌跡顯得更平滑,在激光和敵機(jī)的角度差比較大時(shí)能夠急轉(zhuǎn)彎,反之當(dāng)角度相差不多時(shí)又能夠緩慢地轉(zhuǎn)變方向,這樣就能繪制出較為平滑的曲線。5.4制導(dǎo)激光的移動(dòng)5.4制導(dǎo)激光的移動(dòng) 雖然加人了旋轉(zhuǎn)角度的限制后激光的運(yùn)動(dòng)軌跡變得平滑了,但是也帶來了新的問題—激光變得難以擊中敵機(jī)了。由于添加了旋轉(zhuǎn)角度的限制,這意味著激光不能直接朝敵機(jī)方向飛去,而只能朝著敵機(jī)方向每次轉(zhuǎn)變
確定的角度。有時(shí)
就會(huì)消逝在敵機(jī)周
圍持續(xù)繞圈的狀況
。
為了避開這種
狀況,我們讓前面
提到的轉(zhuǎn)彎角度的
一百分比值隨時(shí)間
漸漸變大。也就是說,放射后經(jīng)過的時(shí)間越長(zhǎng),轉(zhuǎn)彎角度就越大。 從圖中可以看到轉(zhuǎn)彎的角度越來越大。在放射后不久的①處,轉(zhuǎn)彎角度的比例
很小.只朝著敵機(jī)方
向轉(zhuǎn)變了一點(diǎn)點(diǎn)方
向。②處的轉(zhuǎn)彎角
度的比例略微增加
了一些,前進(jìn)方向
的轉(zhuǎn)變也更大了。
到③的位置后,繼
續(xù)增加轉(zhuǎn)彎角度的
比例,直接轉(zhuǎn)向敵
機(jī)方向。原來狀況下激光有可能在敵機(jī)四周持續(xù)繞圈,現(xiàn)在將沿著一條類似漩渦狀的軌跡擊中敵機(jī)。 下面我們通過實(shí)際的代碼,來再次梳理整個(gè)流程。5.4制導(dǎo)激光的移動(dòng)(a)首先求出從自己所在位置看到的敵機(jī)的方向。通過Quaternion.LookRotation方法使用向量計(jì)算出旋轉(zhuǎn)角度。
(b)接下來,通過turnRate比率計(jì)算消逝在的前進(jìn)方向currentRotationAngle和敵機(jī)方向targetRotationAngle的補(bǔ)間值。這相當(dāng)于前面提到的從當(dāng)前方向向敵機(jī)方向旋轉(zhuǎn)確定比例的角度。這是程序中最重要的地方。為了不受幀率(玩耍循環(huán)的時(shí)間間隔)變化的影響,不要遺忘乘上Time.deltatime。
(c)最終,更新轉(zhuǎn)彎角度的比例,再通過旋轉(zhuǎn)轉(zhuǎn)變前進(jìn)方向后連續(xù)向前,處理就完畢了。 最終,讓我們通過實(shí)際的玩耍來看看程序是如何運(yùn)作的。
請(qǐng)?jiān)诠こ桃晥D中選擇Prefabs/Lockon/LockonLaser二可以在檢視面板中看到LockonLaserMotion腳本標(biāo)簽。我們通過轉(zhuǎn)變其中的TurnRate和TurnRateAcceleration的值來看激光的運(yùn)動(dòng)將如何變化。
TurnRate的值準(zhǔn)備了每幀刷新時(shí)激光前進(jìn)方向的轉(zhuǎn)變程度二假設(shè)這個(gè)值很大。運(yùn)動(dòng)中的激光的轉(zhuǎn)彎幅度就大;反之假設(shè)這個(gè)值比較小,激光會(huì)接近直線運(yùn)行二當(dāng)把這個(gè)值設(shè)置為60左右時(shí),激光差不多將沿著直線向敵機(jī)飛去.
TurnRateAcceleration表示每幀刷新時(shí)TurnRate的增加值。其值為0時(shí)意味著轉(zhuǎn)彎的角度是固定的,這樣很可能就會(huì)造成激光始終在敵機(jī)外圍不停做圓周運(yùn)動(dòng)的狀況。5.6小結(jié) 現(xiàn)在讀者應(yīng)當(dāng)可以理解激光沿著平滑曲線前進(jìn)的隱秘了。這種算法也常常在制導(dǎo)或者敵人AI規(guī)律中使用。假設(shè)敵機(jī)總是筆直地沖向玩家角色.玩家可能會(huì)對(duì)這種強(qiáng)大的敵機(jī)感到束手無策,這時(shí)不妨像這樣對(duì)敵機(jī)添加轉(zhuǎn)彎角度的限制。建議讀者在把握了某種方法以后.在開發(fā)過程中多加思考,看看能否使用這種方法來解決其他問題。6消息窗口6.1關(guān)聯(lián)文件PrintMessage.cs6.2概要 “噬星者”中會(huì)依據(jù)玩耍的狀況在畫面左下角顯示各種消息。內(nèi)容一般是電腦返回的報(bào)告信息,或者從“司令部”發(fā)來的指令,這些都是豐富玩耍的
重要元素。 消息中的文字會(huì)
按挨次逐個(gè)顯示出來,
就似乎有人在打字機(jī)
上操作那樣。雖然這
只是個(gè)很小的功能,
但卻能給玩耍增色不
少,下面我們就來介紹它的制作方法。6.3消息隊(duì)列和顯示緩沖區(qū) 玩耍中的各種消息都在消息窗口中顯示。每行消息并非一次性地顯示出來,而是從頭開頭按挨次逐字顯示。為了實(shí)現(xiàn)這種顯示方法,消息窗口的內(nèi)部構(gòu)
造如以下圖。 首先是用于顯示的
消息窗口。它擁有橘色
的邊框,并且使用特定
的字體一顯示文字。 其次足令消息逐字
顯示的顯示緩沖區(qū)。一
行消息被放入緩沖區(qū)后,將從行首開頭逐字顯示到消息宙日中。 最終是消息隊(duì)列,它用于存儲(chǔ)全部其他玩耍對(duì)象發(fā)來的顯示懇求。 接下來我們來看看消息顯示的處理流程。 (1)首先,玩耍開頭后在窗日
內(nèi)顯示開頭消息。顯示緩沖區(qū)域
和消息隊(duì)列的狀態(tài)均為空。(2)然后收到了從其他玩耍對(duì)象發(fā)
來的兩條顯示消息的懇求。每個(gè)
懇求各一行文本。這些消息都將
被追加到消息隊(duì)列中。(3)從隊(duì)列失部開頭逐個(gè)取出消
息,將其移動(dòng)到緩沖區(qū)中。由于
緩沖區(qū)只能存儲(chǔ)一行文本,所以只會(huì)移動(dòng)隊(duì)列中的第一條消息“CAUTION.“。為了便利后續(xù)處理,我們?cè)谝苿?dòng)消息的同時(shí),還把它依據(jù)字母單位拆分成數(shù)組。6.3消息隊(duì)列和顯示緩沖區(qū)(4)將緩沖區(qū)頭部的字母C顯示到窗日
中。顯示完畢后將文字從隊(duì)列中刪除。(5)接下來,顯示緩沖區(qū)中的其次個(gè)字
母A。這時(shí)假設(shè)有新的消息顯示懇求
到達(dá),就將其追加到消息隊(duì)列的末尾。(6)當(dāng)緩沖區(qū)中的文字全部顯示出來后
,再次將隊(duì)列頭部的消息移動(dòng)到緩沖
區(qū)中。和之前一樣,從頭開頭按挨次
逐個(gè)顯示緩沖區(qū)的文字。固然假設(shè)隊(duì)
列為空l不會(huì)移動(dòng)任何消息。此時(shí)將回
到狀態(tài)(1),連續(xù)等待消息的到來并
將其追加到隊(duì)列中。6.3消息隊(duì)列和顯示緩沖區(qū) 消息隊(duì)列和顯示緩沖區(qū)的關(guān)系,就類似醫(yī)院的“候診室”和“治療室”。治療室中只能有一位病人承受醫(yī)生的診斷治療。假設(shè)沒有候診室治療室,在治療的過程中將有越來越多的患者間續(xù)擠人,或許后來的某些患者只能選擇回家。而假設(shè)設(shè)立了候診室,即使后續(xù)來了很多患者,治療室中照舊能夠有條不紊地進(jìn)展治療。 由于顯示緩沖區(qū)中只能逐字顯示消息,因此處理完全部的消息將會(huì)花費(fèi)一些時(shí)間。這期間可能會(huì)有其他玩耍對(duì)象發(fā)來顯示消息的懇求。在這種狀況下,假設(shè)由于緩沖區(qū)正在處理顯示而不能追加消息,就可能會(huì)降低消息窗口的易用性。 下面我們來看看進(jìn)展消息窗口的處理的相關(guān)代碼。6.3消息隊(duì)列和顯示緩沖區(qū) 首先是從消息隊(duì)列往顯示緩沖區(qū)轉(zhuǎn)送消息的Update方法。
(a)首先確認(rèn)顯示緩沖區(qū)是否正在進(jìn)展消息的處理:假設(shè)顯示緩沖區(qū)正在處理消息,那么將不能移動(dòng)新消息。只有當(dāng)緩沖區(qū)把上一次的消息全部顯示完畢后,才能開頭移動(dòng)下一條消息并進(jìn)展顯示。
(b)將用于表示緩沖區(qū)正在處理的標(biāo)記成員isPrinting設(shè)置為true:當(dāng)顯示緩沖區(qū)的處理完畢后,PlayMessage方法將把isPrinting的值設(shè)為fals
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- OVA-PEG-Cy3-生命科學(xué)試劑-MCE-7080
- JCS-1-生命科學(xué)試劑-MCE-4278
- 二零二五年度廠房物業(yè)管理與員工食堂運(yùn)營(yíng)合同
- 2025年度股權(quán)融資協(xié)議書范本
- 2025年度文化產(chǎn)業(yè)過橋墊資合作協(xié)議書
- 二零二五年度稅務(wù)籌劃與稅務(wù)籌劃財(cái)務(wù)解決方案合同
- 2025年度全屋智能家居裝修質(zhì)保服務(wù)合同模板
- 施工現(xiàn)場(chǎng)施工防自然災(zāi)害侵襲威脅制度
- 醫(yī)療護(hù)理醫(yī)學(xué)培訓(xùn) 小學(xué)二年級(jí)健康課課件
- DB 3705T 49-2024黃河口灘區(qū)肉羊疫病防控技術(shù)規(guī)范
- 秦始皇嬴政人物生平介紹PPT
- 在馬克思墓前的講話說課稿公開課一等獎(jiǎng)市賽課獲獎(jiǎng)?wù)n件
- 骨科無痛病房的建立
- 送養(yǎng)收養(yǎng)合同協(xié)議書
- 塑料成型模具設(shè)計(jì)(第2版)江昌勇課件0-導(dǎo)論
- 漢語拼音發(fā)音口型及配圖
- 績(jī)效考核管理醫(yī)院績(jī)效分配方案包括實(shí)施細(xì)則考核表
- 大學(xué)成績(jī)單(大專)
- 網(wǎng)絡(luò)設(shè)備安裝與調(diào)試(華為eNSP模擬器)整套教學(xué)課件
- GB/T 15234-1994塑料平托盤
- 教科版科學(xué)五年級(jí)下冊(cè)《生物與環(huán)境》單元教材解讀及教學(xué)建議
評(píng)論
0/150
提交評(píng)論