CharacterController 不會受到scene的重力影響,自帶物理碰撞檢測,在脫離導航網格的應用場景下(比如飛行),是很有優勢的Unity原生工具組件。如果在復雜的應用場景里,會有多種CC碰撞檢測的需求,記錄下我碰到的三種碰撞需求和解決方案。
一、和場景碰撞器
需要產生碰撞效果,讓CC停止。只需要在場景里刷上碰撞器,並加上OnControllerColliderHit回調,處理邏輯。
二、和UI碰撞器
CC遇到UI上的BoxCollider也會產生碰撞效果,有個小招是把UI的Collider的物理效果去掉
勾上IsTrigger,就不會和CC產生碰撞,然而這種方法實在上不了台面,還會影響UI。Unity的物理管理器提供了多種數據配置,可以設置層碰撞矩陣
在相互不作用的層上勾去。
三、CharacterController 和CharacterController之間的碰撞
CC之間 大部分時候都不需要碰撞作用的吧,不理解為什么CharacterController沒有一個明顯的屏蔽基佬的標志,
一開始看介紹以為CharacterController.detectCollisions 可以讓CC之間相互影響,看聖典上是這么介紹
Should other rigidbodies or character controllers collide with this character controller (By default always enabled)
其他的剛體和角色控制器是否能夠與本角色控制器相碰撞(默認值通常是enabled)
然而用各種姿勢試了試都沒有什么卵用,最后用了萬能的Physics.IgnoreCollision,看到這個接口的時候我都樂了,Unity Is Funny
public void IgnoreCollision(Actor actor) { Component[] colliders = actor.GetFigTrans().GetComponents(typeof(Collider)); for (int i = 0; i < colliders.Length; i++) { Physics.IgnoreCollision(m_MidlayerDancer.m_charactor_controller, colliders[i] as Collider); } colliders = GetFigTrans().GetComponents(typeof(Collider)); for (int i = 0; i < colliders.Length; i++) { Physics.IgnoreCollision(actor.GetCharacterController(), colliders[i] as Collider); } }