MovePosition
1. rigid.MovePosition(targetPosition) 移动到目标位置
调用执行后
1)rigidbody.position 会立即改变,而transform.position并不会立即生效改变
2)transform.position 需要等到下一次的FixedUpdate执行完毕后才会生效改变,即可在LateUpdate中打印看见
rigid.position = Vector3.zore; transform.position = Vector3.zore; int index = 0; void Update() { Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //Vector3.zore|Vector3.zore Rigid.MovePosition(Rigid.position + Vector3.right); Debug.Log($"2 : T={transform.position} b={Rigid.position}");//Vector3.zore|new Vector3(1,0,0) index = 1 } void FixedUpdate() { Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //Vector3.zore|new Vector3(1,0,0) index = 2 } void LateUpdate() { if(index != 2) { Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //Vector3.zore|new Vector3(1,0,0) } else { Debug.Log($"1 : T={transform.position} b={Rigid.position}"); //new Vector3(1,0,0)|new Vector3(1,0,0) } }
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:是否忽略文章来源地址https://www.toymoban.com/news/detail-726029.html
IgnoreLayerCollision
Physics.IgnoreLayerCollision(layer1, layer2, ignore: true); 碰撞层级忽略
参数1:自身碰撞层级
参数2:目标碰撞层级文章来源:https://www.toymoban.com/news/detail-726029.html
参数3:是否忽略
到了这里,关于Unity - Rigidbody刚体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!