Unity 2D 圖層碰撞關係
分類
說明
最近我在開發遊戲時剛好遇到這個狀況,場景中存在許多球,但我不想球和球之間發生碰撞,但需要和其他遊戲物件發生碰撞,這時就可以使用 Unity 內建圖層設定碰撞關係,解決這個問題。
實例演練
接來將示範,球和自身不發生碰撞,其餘保持預設。
上圖可看到球有 Rigidbody 2D 和 Circle Collider 2D,並且沒有勾選 Is Trigger。
點擊紅框 Layer 下拉選項選擇 Add Layer…,新增 Ball 圖層,並且將球設定為此圖層。
點擊菜單 Edit -> Project Settings -> Physics 2D -> Layer Collision Matrix
取消勾選 Ball 對 Ball 的選項
以上就已完成設定,若需要測試的話,可以新增兩個球遊戲物件,將它們垂直排列,上面的 Rigidbody 2D Gravity Scale 為 5,下面的 Rigidbody 2D Gravity Scale 為 0,點擊 Play 就可以做碰撞測試了。
節省效能
當你的場景有成千上百個碰撞器的時候,管理圖層碰撞就顯的非常重要,我在開發打磚塊遊戲時,場景中有32x32個磚塊,而每個磚塊其實有兩個碰撞器,磚塊設計是建立一個空的遊戲物件,裡面包含三個子遊戲物件,其中兩個子遊戲物件包含碰撞器,可以假設光磚塊我最多就會存在2x32x32個碰撞器,這些碰撞器在底層的物理運算已經非常龐大,假設磚塊彼此之間本來就不打算發生碰撞,我可以新增兩個圖層 Brick, BrickTrigger,然後設定 Brick 和自身還有 BrickTrigger 不會碰撞,BrickTrigger 也一樣,光這樣的設定就節省了很多物理運算。
如果使用 Profiler 效能分析的話,應該會看到一個 Physics2D.FindNewContacts 就是物理運算,太多碰撞器就可能會導致此運算時間龐大,在 https://forum.unity.com/threads/profiler-physics2d-findnewcontacts.611584 可以看到相關的討論。
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!