共同点:都可以用作在游戏中的角色移动。
CharacterController
有重力效果,不能受其他物理力。本身自带了一个胶囊碰撞体,可以用来产生碰撞。只有调用Move或SimpleMove,对象才能移动。所以它被称为角色控制器,一般的角色操作类游戏用这个比较合适。
1、CharacterController相比于Rigidbody,可以直接设置爬梯子的高度,对于不是完全水平的地图,这一特性非常好用。
Rigidbody
是用来模拟真实物理效果的,它可以设置重力,可以为对象施加外力。注意它和各种Collider的关系:只有Rigidbody才能被施加外力,这个力可能是被直接施加的,也可能是被其它Rigidbody碰撞产生的间接力;而Collider是用来设置碰撞的一些参数。简单说:没有Rigidbody就不会动,没有Collider就不能碰撞或被碰撞。这个用于赛车类需要真实物理效果的游戏比较合适。
1、Rigidbody有更好的物理特性,比如想要有击飞,击退,浮空效果时,Rigidbody更容易实现,且更加方便。而用CharacterController去实现则相对困难一些。
2、Rigidbody有SweetTest,对于想检测地图边界,是否有障碍物等比较方便。
NavMeshAgent
属于寻路系统,它也带有一个圆柱体形的碰撞体。如果你的角色要寻路,那么添加了NavMeshAgent后就不要再添加Rigidbody或CharacterController,如果要对另外一个动态对象产生碰撞,就为那个对象加上Navmesh Obstacle组件。
if (!navAgent.pathPending)
{
if (navAgent.remainingDistance <= navAgent.stoppingDistance)
{
if (!navAgent.hasPath || navAgent.velocity.sqrMagnitude == 0f)
{
//find path done!
}
}
}
总结
如果不进行寻路操作,那么CharacterController和Rigidbody也不要混用。如果对象之间需要产生真实的推力效果,就用Rigidbody;否则,用CharacterController。如果真有复杂的混用情况,也可以在代码中根据情况,启用或禁用相应组件。
网友评论