CharacterController 不會受到scene的重力影響,自帶物理碰撞檢測,在脫離導航網格的應用場景下(好比飛行),是頗有優點的Unity原生工具組件。若是在複雜的應用場景裏,會有多種CC碰撞檢測的需求,記錄下我碰到的三種碰撞需求和解決方案。ide
1、和場景碰撞器工具
須要產生碰撞效果,讓CC中止。只須要在場景裏刷上碰撞器,並加上OnControllerColliderHit回調,處理邏輯。this
2、和UI碰撞器spa
CC遇到UI上的BoxCollider也會產生碰撞效果,有個小招是把UI的Collider的物理效果去掉3d
勾上IsTrigger,就不會和CC產生碰撞,然而這種方法實在上不了檯面,還會影響UI。Unity的物理管理器提供了多種數據配置,能夠設置層碰撞矩陣blog
在相互不做用的層上勾去。接口
3、CharacterController 和CharacterController之間的碰撞it
CC之間 大部分時候都不須要碰撞做用的吧,不理解爲何CharacterController沒有一個明顯的屏蔽基佬的標誌,io
一開始看介紹覺得CharacterController.detectCollisions 可讓CC之間相互影響,看聖典上是這麼介紹class
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); } }