• Unity - Rigidbody刚体


    MovePosition

    1. rigid.MovePosition(targetPosition)        移动到目标位置

    调用执行后

            1)rigidbody.position 会立即改变,而transform.position并不会立即生效改变

            2)transform.position 需要等到下一次的FixedUpdate执行完毕后才会生效改变,即可在LateUpdate中打印看见

    1. rigid.position = Vector3.zore;
    2. transform.position = Vector3.zore;
    3. int index = 0;
    4. void Update()
    5. {
    6. Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //Vector3.zore|Vector3.zore
    7. Rigid.MovePosition(Rigid.position + Vector3.right);
    8. Debug.Log($"2 : T={transform.position} b={Rigid.position}");//Vector3.zore|new Vector3(1,0,0)
    9. index = 1
    10. }
    11. void FixedUpdate()
    12. {
    13. Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //Vector3.zore|new Vector3(1,0,0)
    14. index = 2
    15. }
    16. void LateUpdate()
    17. {
    18. if(index != 2)
    19. {
    20. Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //Vector3.zore|new Vector3(1,0,0)
    21. }
    22. else
    23. {
    24. Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //new Vector3(1,0,0)|new Vector3(1,0,0)
    25. }
    26. }

            

     Physics.autoSyncTransforms

    Physics.autoSyncTransforms = true;

    开启后,当使用Rigid.position = xxx时,transform会立即和rigidbody位置同步

    否则transform会和rigidbody短暂不同步,需要等到下一次FixedUpdate执行完毕后才同步改变

     collisionDetectionMode

    连续检测,防止穿透
    Rigid.collisionDetectionMode = CollisionDetectionMode.Continuous;

    interpolation 

    transform 是否插值移动表现:None(无插值) , 其他选项(插值平滑移动) | 只针对kinematic刚体
    Rigid.interpolation = RigidbodyInterpolation.None;

     isKinematic

    设置为true,不接收任何力的作用

    可以使用MovePosition移动,但是为true时 只能在FixedUpdate中生效,反之Update中也生效
    Rigid.isKinematic = true;

    Physics.SyncTransforms()

    若直接设置transform.position,则需要调用该函数后,rigidbody.position才会同步改变
    Physics.SyncTransforms();

    freezeRotation 

    Rigid.freezeRotation = true

    冻结刚体旋转,刚体不会在受力下改变旋转

    constraints 

    Rigid.constraints         刚体约束

    m_Rigidbody.collisionDetectionMode = CollisionDetectionMode.None;无任何约束

    m_Rigidbody.collisionDetectionMode = CollisionDetectionMode.FreezeRotation;冻结所有旋转

    m_Rigidbody.collisionDetectionMode = CollisionDetectionMode.FreezeRotationX/Y/Z;冻结指定轴旋转

    m_Rigidbody.collisionDetectionMode = CollisionDetectionMode.FreezePosition;冻结所有移动

    m_Rigidbody.collisionDetectionMode = CollisionDetectionMode.FreezePositionX/Y/Z;冻结指定轴移动

     OnCollisionXXX函数

    双方都是 IsTrigger=false

    1.Rigidbody与 Rigidbody:

            若双方均为isKinematic=true,则不会触发

            其他情况会触发

    OnTriggerXXX函数

    双方有一方 IsTrigger=true

    1.Rigidbody 与 Rigidbody :

            任何情况均会触发,包括isKinematic=true的情况

    2.CharacterController 与 Collider:

            若Collider为IsTrigger=true,则会触发

     地址记录:【Unity笔记】刚体、碰撞器和触发器 - 哔哩哔哩

     IgnoreCollision

     Physics.IgnoreCollision(collider1, collider2, ignore: true);        碰撞忽略

    参数1:自身碰撞体

    参数2:目标碰撞体

    参数3:是否忽略

    IgnoreLayerCollision

    Physics.IgnoreLayerCollision(layer1, layer2, ignore: true);        碰撞层级忽略

    参数1:自身碰撞层级

    参数2:目标碰撞层级

    参数3:是否忽略

  • 相关阅读:
    NLP实践!文本语法纠错模型实战,搭建你的贴身语法修改小助手 ⛵
    【docker下安装jenkins】(一)
    ros develop 相关
    NanoPC-T4 RK3399:uboot cmd与boot加载
    springboot @Validated验证
    数据库系列16:MyISAM与InnoDB的索引对比
    基于Springboot外卖系统08:员工账号状态管理功能+对象转换器+扩展Spring mvc的消息转换器
    c++代码:文件的读写实现_txt文本数据流
    利用servlet实现对书籍书名、单价、数量等信息的添加,计算总价
    【考研线代】二. 矩阵
  • 原文地址:https://blog.csdn.net/smile_otl/article/details/133807925