Unity之CharacterController 碰撞問題總結


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);
        }
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM