? 精品一精品国产一级毛片,日韩真人一级毛片在线,迅雷亚洲第成色999久久网站
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

如何使用collision pipeline提升游戲開發(fā)優(yōu)勢

來源: 未知 | 責(zé)任編輯:六月芳菲 | 發(fā)布時間: 2018-03-02 09:17 | 瀏覽量:
更多精彩unity教程:http://www.594ljc.cn/resource/

當(dāng)我在移動設(shè)備上工作的時候,我遇到了一個二維的基于網(wǎng)格的動作難題,我遇到了一個復(fù)雜的問題,但是使用Unity3D的collision pipeline,我可以用一種可靠的方式來解決它。
 
好的,想象一下你有一個2D的基于網(wǎng)格的游戲,玩家可以在直線上運行,然后撞到墻上,你需要讓玩家在游戲中運行一些基于這樣原理的關(guān)卡。
 
 
 
我們使用一個帶有一個BoxCollider2D的精靈來制作一個“塊”,并附加一個“塊”腳本,當(dāng)玩家碰到它時,它會將這個玩家反射到相反的方向上。
 
 
01
02
03
04
05
06
07
08
09
10
11
public class Block : MonoBehaviour
{
   void OnCollisionEnter2D(Collision2D coll)
   {
      if (coll.gameObject.tag == "Player")
      {
         Player player = coll.gameObject.GetComponent <PLayer> ();
 
         if (player) player.direction = Opposite(direction);
      }
   }
}
 
更多精彩unity教程:http://www.594ljc.cn/resource/

現(xiàn)在你可以在場景周圍放置幾個這樣的“方塊”,效果很好。
 
但這還不夠,你想要加快速度,所以你要在你的項目中包含一個2D地圖編輯工具。這個工具使你可以在你的場景中直接繪制出與網(wǎng)格直接對齊的瓷磚,你甚至可以一次在多個圖層上工作。太棒了!現(xiàn)在,讓這個層次成為一種輕而易舉的事情,你可以把設(shè)計層次的任務(wù)委托給關(guān)卡設(shè)計師,
最終,關(guān)卡設(shè)計師說:“嘿!我們需要一個能在玩家撞到他的時候殺死玩家的蜘蛛,這樣我就能創(chuàng)造出更有趣的關(guān)卡。”這對你來說不是問題,所以你要敲出一個小的“SpikeyBlock”腳本,當(dāng)玩家撞到它時,它就會殺死玩家。有了“SpikeyBlock”腳本,不久你就會有“粘塊”、“buttonblock”等等
 
 
 
 
一切都很順利,直到不可思議的事情發(fā)生。關(guān)卡設(shè)計人員需要一個塊,在一邊是spikey,在另一邊是sticky。換句話說,塊現(xiàn)在應(yīng)該有邊了!邊! !而級別設(shè)計人員希望能夠以不同的方式添加大量的邊。那么你會怎么做呢?
 
一開始,您考慮向塊類添加額外的變量和沖突邏輯,但是很快意識到這種方法將使塊類變得復(fù)雜且難以擴(kuò)展。這也會使那些現(xiàn)在不得不在檢查器窗口中設(shè)置值的關(guān)卡設(shè)計人員變得更加困難。這不僅是一個緩慢的過程,而且還會讓可愛的小地圖編輯工具毫無意義。
 
然后,您提出了另一個想法,來創(chuàng)建一個“Edge”類,它封裝了不同的行為,并可以添加到一個塊中。更好。這解決了保持代碼整潔的問題,但是對于仍然需要在檢查器窗口中添加邊緣組件的關(guān)卡設(shè)計人員來說,這并不能使事情變得更容易。
 
解決方案
這讓我們了解了本文的關(guān)鍵,即利用Unity3D pipeline的解決方案。
 
首先,你將一個邊緣的概念分解成一個單獨的對象,這個對象可以使用不同的timap層來放置在tilemap的任何地方。通過小心的預(yù)制結(jié)構(gòu),邊緣可以放置在一塊磚的旁邊,看起來就像它的一部分一樣。這解決了級別設(shè)計人員的工作流程問題。
其次,我們用一種稍微不同的方式構(gòu)造邊界,把它們的碰撞器標(biāo)記為檢查器的觸發(fā)器區(qū)域。這讓我們有機會在與區(qū)塊碰撞前處理與邊的碰撞,因為,等待它,在管道中發(fā)生固體碰撞之前,觸發(fā)大碰撞,如果你不相信的話,請檢查Unity的“事件頁面的執(zhí)行順序”。我們只是將OnCollision函數(shù)的代碼移到OnTrigger函數(shù)中。
但是,等一下,如果玩家正在擦過其中的一個邊,并觸碰到一個觸發(fā)區(qū)域,會怎么樣呢?我們只想處理碰撞,如果玩家撞到邊緣,而不是越過它。如果玩家在一個有兩種不同邊的角上呢?我們應(yīng)該打哪邊?現(xiàn)在我們要做一系列的計算來檢驗我們是否真的擊中了邊緣。這是不對的,Unity是一個游戲引擎!我們不需要做這些檢查,我們只是想知道什么時候發(fā)生了碰撞,然后做一些很酷的事情。我們?nèi)匀豢梢赃M(jìn)一步利用pipeline。
 
 
 
假設(shè)玩家有一個Edges數(shù)組,當(dāng)玩家進(jìn)入一個邊緣的觸發(fā)區(qū)域時,它會被添加到數(shù)組中,當(dāng)玩家離開該區(qū)域時,它會被移除。就是這樣,這就是我們所做的,我們不需要做任何檢查就能知道我們什么時候到達(dá)了Block的邊緣。相反,我們讓Unity告訴我們,當(dāng)我們撞到這個街區(qū)的時候,因為我們會收到一個碰撞事件,因為它的固體碰撞器。然后我們要做的就是讓玩家檢查數(shù)組中的任何邊(最大的3條邊),如果任何邊都朝向相反的方向(我使用了一個enum),玩家就會與這條邊發(fā)生碰撞,否則我們就會與這個方塊發(fā)生碰撞。請記住, OnTrigger是在OnCollision之前處理的,因此我們確信,當(dāng)玩家到達(dá)塊時,他們的數(shù)組中已經(jīng)有了邊緣。
玩家的碰撞檢查很簡單:
 
[C#] 純文本查看 復(fù)制代碼
?
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
// in the Player script
OnHitBlock(Block block)
{
   // check the edges
   foreach (Edge edge in edges)
   {
      if (edge.direction == Opposite(player.direction))
      {
         Hit(edge); // handle edge collision
 
         return;
      }
   }
 
   Hit(block); // otherwise handle the block collision
}
 
結(jié)論
好了,這可能需要一段時間才能達(dá)到這個目的,但我最終到達(dá)了這里,希望你們已經(jīng)看到了如何使用流水線上的執(zhí)行順序來幫助解決復(fù)雜的問題。
 
無論如何,我試圖保持這篇文章的光芒(盡管主題是一些技術(shù)性的),并希望它能在某種程度上有所幫助。歡迎發(fā)表任何問題或評論,我將盡我所能做出回應(yīng)。

更多精彩unity教程:http://www.594ljc.cn/resource/

相關(guān)文章
網(wǎng)友評論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊

關(guān)閉

全部評論:0條

推薦
熱門