MovePosition
- 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();