前回:[Unity初心者日記] キューブを動かしてみる 2.ゲームパッド編
オブジェクトの移動の次は回転をしてみます。
回転もgameObject.transformを操作します。
Rotateメソッドを使う
positionみたいにgameObject.transform.rotationを直接代入する方法もあるのですが、操作するメソッドが用意されているのでそちらを使います。
このメソッドは、現在のオブジェクトを指定した角度だけ回転させるというものです。
新しくCubeを作って、前回のようにControllerスクリプトをつけます。
そのUpdateのところに次の記述を追加。
gameObject.transform.Rotate( Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"), 0 ); if (Input.GetButton("Fire1")) { gameObject.transform.Rotate(0, 0, 0.5f); } if (Input.GetButton("Fire2")) { gameObject.transform.Rotate(0, 0, -0.5f); }
Rotateは回転角度をx, y, zの順で指定していますが、Vertical(縦、十字キーでいう上下)がxに、Horizontal(横、十字キーでいう左右)がyに当てられています。
これは、「x方向に角度だけ回す」ではなく、「x方向を軸として角度を与える」ためで、つまり縦方向の回転がx、横方向の回転がyとなります。
これを実行してみると、上下左右でキューブが回転してくれます。
ただ回転をさせているとなんか違う…
キーで回転させるときに、たとえば右に回転させ、
上に回転させると、カメラ目線ではこうなることを期待する。
だが現実はこう。
ワールド軸とローカル軸
このように回転するのは間違いではなくて、どこを基準にして回転を行っているか、という話になります。
Rotateはデフォルトではローカル軸、つまり自分自身の向きを軸としているので、右に回転→上に回転、としたときも「オブジェクトが右を向いて、その状態で上を向いた」という回転をしたということです。
これは実行中にSceneタブに切り替えて、移動または回転ツールにしてみるとわかりやすいと思います。「2D」にするとよりわかりやすいかも。
このとき左上の回転軸が「Local」になっていることを確認してください。
移動にしてみた場合。赤がX、緑がY、青がZの向きになります。
Rotateで当てられる角度は、この方向を軸として適用されます。
回転にしてみた場合。この曲線にそって回転が適用されます。
一方で、カメラ目線の時に期待していた回転はこうではなく、「右を向いた状態のオブジェクトが、上に回転」ということでした。
そのための軸はワールド軸を使用することになります。
ここで左上の「Local」をクリックすると、表示が「Global」となり、望んでいた回転軸が出ると思います。
ワールド軸、ワールド座標は3D空間の絶対座標となり、その方向は統一されています。
Rotateでワールド軸を基準に回転する
ではどうするか。といっても簡単な話で、ワールド軸で適用することを引数で指定します。
gameObject.transform.Rotate( Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"), 0 , Space.World ); if (Input.GetButton("Fire1")) { gameObject.transform.Rotate(0, 0, 0.5f, Space.World); } if (Input.GetButton("Fire2")) { gameObject.transform.Rotate(0, 0, -0.5f, Space.World); }
最後にSpace.Worldをつけるだけ。
これで見た目通りの回転をしてくれます。
ここまででとりあえず回転させることができました。
ここまでの見た目の話での注意として、カメラ目線でということで説明していましたが、これはカメラが初期位置でワールド軸と一致していたからそうなった、という話です。
カメラ位置や角度を変えれば当然見える角度も違ってくるので、ワールド軸でも違和感があるようになると思います。
また移動にもワールド座標とローカル座標があり、前回のpositionはワールド座標の指定になります。
ローカル座標、つまりオブジェクトの向きを基準に移動させる場合はlocalPositionを使用します。
positionにはRotateみたいなメソッドはないようなので、この2つのプロパティを使い分けることになると思います。
参考: