• [转]CharacterController与Rigidbody


    From: http://blog.csdn.net/czlilove/article/details/9139103

    今天下午碰到个问题纠结了很久:
    人物加上了Rigidbody并使用了重力,遇到悬崖居然不掉下,如履平地地走了过去。
    想了很久又请教了别人,花了很长时间才发现,CharacterController与Rigidbody两个组件有冲突。
    Unity圣典中的说法是:
     角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。(个人理解:用CharacterController组件,它包含Rigidbody组件的一些属性,就不用用Rigidbody组件了)。  角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。
    下面说说我自己的理解:
    1.添加了CharacterController组件后,人物将不受力影响,这时即使加上Rigidbody组件,并启用Use Gravity,人物也不会受重力影响,在脚本中通过rigidbody对人物施加力也是无效的。
    也就是说CharacterController屏蔽了Rigidbody的所有属性和方法。
    要控制CharacterController移动,可以通过在脚本中调用Move方法使其移动。
    2.虽然CharacterController不受力,但是有个例外是,它受碰撞的影响。
    一般的碰撞发生条件是:碰撞的两个物体必须都有Collider,并且其中一个有Rigidbody。
    但是如果一方有CharacterController,则不需要。这时碰撞发生的条件为:
    一方有CharacterController,另一方有Collider。CharacterController本身就继承自Collider。

    3.碰撞发生时,CharacterController不会推动其它物体移动,也就是说CharacterController不会对它所碰撞的物体施加物理作用。除非我们在脚本中添加了OnControllerColliderHit()函数,在该函数中使用被碰撞物体的rigidbody对被碰撞物体施加力。

    补充:仅仅加上CharacterController组件还不行,还必须在脚本中调用CharacterController的方法,这样才能屏蔽Rigidbody

    // this script pushes all rigidbodies that the character touches
    // 这个脚本推动所有的角色碰撞到的刚体。
    var pushPower = 2.0;
    function OnControllerColliderHit (hit : ControllerColliderHit) {
       var body : Rigidbody = hit.collider.attachedRigidbody;
       // no rigidbody
       // 没有刚体。
       if (body == null || body.isKinematic)
         return;   
    
       // We dont want to push objects below us
       // 我们不想推动在我们下边的物体。
       if (hit.moveDirection.y < -0.3) 
         return; 
    
       // Calculate push direction from move direction, 
       // we only push objects to the sides never up and down
       // 通过移动方向计算推动方向,我们只把物体推到两侧,从不向上和向下推。
       var pushDir : Vector3 = Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
       
       // If you know how fast your character is trying to move,
       // then you can also multiply the push velocity by that.
       // 如果你知道你的角色移动的有多快,那么你也可以用它乘以推动速度。
       // Apply the push
       // 应用推力。
       body.velocity = pushDir * pushPower;
    }
  • 相关阅读:
    TCP发送窗口更新tcp_ack_update_window
    关于nginx
    通过导出表找导出函数
    导出表
    静态链接库、动态链接库
    数据目录
    扩大节、合并节
    新增一个节
    用程序在代码节空白处加代码
    节空白处添加代码
  • 原文地址:https://www.cnblogs.com/willbin/p/3415304.html
Copyright © 2020-2023  润新知