// ベクトルをワールド→ローカル transform.InverseTransformDirection(Vector3); // 位置をワールド→ローカル transform.InverseTransformPoint (Vector3); // ベクトルをローカル→ワールド transform.TransformDirection(Vector3の値); // 位置をローカル→ワールド transform.TransformPoint (Vector3);
「これはTransformのスケールや位置の影響を受けません。 返されたベクトルは direction と同じ長さを持ちます」とリファレンスにあるように、もしローカル座標系が拡縮されている時は注意が必要かも。
RigidBodyを動かす場合
コイン落としのプッシャーのように足場が動く場合、Kinematicで動かしていると上に乗っているコインや人などはその場で滑ってしまい、上に乗ったまま引きずられない。
もし滑らずに引きずられるようにする為にはKinematicsで動かさずにAddForce()(ForceMode.VelocityChangeやMovePosition)やMovePosition()などを使う。
しかしKinematicではないので上に乗ってる物体や押すことになる物体が重いと動きが鈍くなったり止まったりするので注意。
足場に乗ったオブジェクトを足場オブジェクトの子要素にするという方法もある。
速度設定
rigidbody.velocityはワールド座標系での速度なので、ローカル座標でのz軸速度speedを指定したい場合は
rigidbody.velocity = transform.TransformDirection(Vector3(0,0,speed));
というように指定する必要がある。
もし既にローカルオブジェクトに速度があり、その速度のローカル座標軸における速度を変更したい場合は
var locVel = transform.InverseTransformDirection(rb.velocity);//ワールド速度からローカル速度へ変換 locVel.z = -1.0f; rb.velocity = transform.TransformDirection(locVel);//ローカル速度からワールド速度へ変換
というようにする。
コメント