Unity之CharacterController 碰撞問題總結

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);
        }
    }
相關文章
相關標籤/搜索