目錄:
- 家具與家具碰撞檢測
- 家具是否全部在可放置區域內
2.1 標記可放置區域
2.2 家具部分出界檢測
2.3 為什么要選擇這種射線檢測方案?不采用觸發器 - 家具的拾取拖動
1. 家具與家具碰撞檢測
檢測方案:Rigidbody + BoxCollider, 剛體設置不受物理學影響,僅用于碰撞/觸發功能;
家具間碰撞檢測-未碰撞.png
家具間碰撞檢測-已碰撞.png
選中的家具 與 放下作為障礙的家具 區分處理;
- 選中的家具
包含組件:Rigidbody+BoxCollider(isTrigger = false) - 放下作為障礙的家具
包含組件:BoxCollider(isTrigger = true)
注意事項
- Rigidbody-isKinematic
僅用于碰撞/觸發功能.
self.rigidbody.isKinematic = true
isKinematic: Controls whether physics affects the rigidbody.
控制物理學是否夠影響這個剛體。如果isKinematic啟用,力、碰撞或關節將不會影響這個剛體。剛體將通過改變transform.postion根據動畫或腳本完全控制。
- 選中的家具BoxCollider(isTrigger = false),這樣只有與(isTrigger = true)的 BoxCollider才會觸發OnTriggerStay事件。
void OnTriggerStay (Collider collider)
{
// 檢測collider.gameObject的layer和tag等標記
...
}
2. 家具是否全部在可放置區域內
2.1 標記可放置區域, Mesh Collider
標記可放置區域.png
2.2 家具部分出界檢測
家具在房間邊界.png
家具部分出界.png
家具部分出界檢測方案:
- 獲取家具下的Collider list: transform.GetComponentsInChildren<Collider> ();
- 獲取Collider下的bounds.max,bounds.min坐標點作為檢測點
- Ray射線檢測, Physics.RaycastAll (shootRay, range),在檢測點上方一定高度發射一條射線,與放置區域的Mesh Collider檢測,判斷是否在可放置區域內。
2.3 為什么要選擇這種射線檢測方案?不采用觸發器
- 檢測的精度較高(取決于碰撞盒數量)。可降低檢測頻率 控制性能消耗。
- 一個家具的碰撞盒數量1-6個,數量可控,若要優化可減少家具碰撞盒數量,制定
家具制作規范
。 - 只需對地圖標記可放置區域,容易擴展,且復雜度不高;對配置者來說,工作量可接受。
若采用觸發器檢測,則需要在不可放置區域全部都加上BoxCollider(isTrigger = true),增加很多額外配置工作,一旦地圖布局修改,改動太大,不利于擴展。 - 不需要再額外配置家具。
3. 家具的拾取拖動
使用EasyTouch 的On_Drag事件來監聽家具的拾取,獲取到家具的屏幕坐標,再通過射線檢測獲取對應地圖坐標。 如何設置?