transform.positionとtransform.Translateの違いと処理速度
オブジェクトを移動させようとしたときにどっちを使おうかなー?といった感じで考えた事はないでしょうか。自分はあります。
両方ポジションを移動する事が出来るのですが、いったい何が違うのでしょうか?
transform.Translate
Translate()メソッドは移動したい位置のVector3型の数値を入れるpositionと違い移動量を表すVector3型のベクトルを指定します。
どう違うかと言えば下のgifを見てみましょう。
このスクリプトは
private GameObject _cube;
private Vector3 _directionCube;
void Start () {
_cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
_directionCube = Vector3.right;
}
void Update () {
if (_cube.transform.position.x > 3)
_directionCube = Vector3.left;
if (_cube.transform.position.x < -3)
_directionCube = Vector3.right;
_cube.transform.Translate (_directionCube * 0.1f);
}
を使っています。Cubeオブジェクトのポジションがx = 3を超えたら_directionCubeの中は(-0.1,0.0,0.0)となり、逆にいけば(0.1,0.0,0.0)となります。
ここでpositionと違うのは移動量を入れる事によってマイフレーム指定されたベクトルへ移動する事になります。
_cube.transform.Translate (_directionCube * 0.1f);
最後の*0.1fはなくてもいいですが、ものすごい早く移動してしまうので今回は入れています。
transform.position
Translateとは違いtransform.positionは移動する先を指定してその位置に移動します。急激に大きな数字を入れればその位置に一瞬でワープする事も可能です。
今回は上のTranslateと同じように動くようにしました。
private GameObject _sphere;
private Vector3 _directionSphere;
bool _left;
void Start(){
_sphere = GameObject.CreatePrimitive (PrimitiveType.Sphere);
_directionSphere = Vector3.right;
}
void Update(){
if (_sphere.transform.position.x > 3){
_left = true;
} else if (_sphere.transform.position.x < -3){
_left = false;
}
if (_left){
_sphere.transform.position = (_directionSphere += Vector3.left)*0.1f;
} else {
_sphere.transform.position = (_directionSphere += Vector3.right)*0.1f;
}
}
Translateよりも長くなってしまってます。
positionだと毎回移動する先を指定しないといけないのと、boolを使って3以上か3以下に行ったかどうかの判断が必要になります。
if (_sphere.transform.position.x > 3){
_left = true;
} else if (_sphere.transform.position.x < -3){
_left = false;
}
の内側にtransform.positionをいれても内側に戻ってきたらこの中を通らなくなるので途中で動きが止まってしまいます。
左がtransform.Translateで右がtransform.position
処理速度ですが、Translateの方が実装は楽なのですが、transform.positionで同じ動きを作った場合はtransform.posiitonの方が処理は早く終わってしまいました。100周分なのでまだまだ足りないかもしれませんが...
という事で1000週してみました
それでも変わらずtransform.positionの方が若干処理は早いという事で決着がつきました。
コードがぐちゃぐちゃっとしてしまう事を考えると軽いゲームであればTranslateを使ってしまいたいですよね(´・ω・`)