CGBoxの一部の記事にはアフィリエイト広告が含まれております。
【Unity】ゲームオブジェクトの回転操作方法まとめ
Unityで開発をしていると、オブジェクトを回転させたい場面は非常に多いです。
カメラを回転させたり、キャラクターの向きを変えたり、回るオブジェクトを作ったり…など数えればきりがありません。
今回はそんな、オブジェクトの回転のさせ方について解説していきます!
オブジェクトを回転させる方法
オブジェクトを回転させる方法について、以下のような順番で解説していきます。
- オブジェクトの回転値を取得する
- オブジェクトを回転させる
- 回転軸を指定して回転
なお、オブジェクトの回転を扱う際には、ワールド座標での回転なのか、ローカル座標での回転なのかによってスクリプトが違ってきますので要注意です。
本記事では両方のパターンを紹介していきます。
オブジェクトの回転を取得する
オブジェクトのインスペクターには、ローカル座標でのRotationの値が表示されています。
ここではこのRotationの値をスクリプトから取得する方法を紹介します。
Vector3 _Rotation = gameObject.transform.localEulerAngles
これで、_RotationにVector3型で値が格納されます。
gameObject.transform.localEulerAngles.xで、x軸だけの値を取得することもできます。
下のコードでCubeのRotationの値をコンソールに表示させてみましょう。
void Start()
{
Vector3 _Rotation = transform.localEulerAngles;
Debug.Log(_Rotation);
Debug.Log(transform.localEulerAngles.x);
Debug.Log(transform.localEulerAngles.y);
Debug.Log(transform.localEulerAngles.z);
}
Rotationの値が表示されました。
ワールド座標でのRotationの値を取得したい場合には、各コードの
localEulerAngles→eulerAngles
のように変更することで可能になります。
オブジェクトを回転させるスクリプト
オブジェクトの回転の方法として、以下の2つを紹介します。
- 角度を代入して変更する
- Rotate関数を使って現在の角度に加算させる
あるオブジェクトのローカル座標のRotationの値を、(20,20,20)に変更したい時には以下のようなコードで実現できます。
void Update () {
// 自身のtranformを取得
Transform myTransform = this.transform;
//ローカル座標での回転を取得
Vector3 localAngle = myTransform.localEulerAngles;
localAngle.x = 20.0f;
localAngle.y = 20.0f;
localAngle.z = 20.0f;
//x,y,zをそれぞれ20度に変更
myTransform.localEulerAngles = localAngle;
}
Rotationが(0,0,0)のCubeにこのコードをアタッチすると、このように変化します。
ワールド座標での回転を変更したい場合は、localEulerAngles→eulerAnglesと変えるだけです。
void Update () {
Transform myTransform = this.transform;
Vector3 worldAngle = myTransform.eulerAngles;
worldAngle.x = 20.0f;
worldAngle.y = 20.0f;
worldAngle.z = 20.0f;
myTransform.eulerAngles = worldAngle;
}
あるオブジェクトを回転させ続けたい場合に利用できます。
void Update () {
// 自身のtranformを取得
Transform myTransform = this.transform;
// 現在の回転に加算する
myTransform.Rotate (0.1f, 0.1f, 0.1f);
}
こちらのコードをUpdate内に書くことで、毎フレーム(0.1,0.1,0.1)ずつ回転することになります。
Cubeにこのコードをアタッチするとこのような動きになります。
ワールド座標での回転をさせたい場合は
myTransform.Rotate (0.1f, 0.1f, 0.1f, Space.World );
このようにSpace.Worldを指定することで実現できます。
中心・回転軸を指定してオブジェクトを回転
RotateAround関数を使えば、中心を指定してオブジェクトを回転させることができます。
これにより、円を描くような運動が実現できます。
RotateAround (Vector3 point, Vector3 axis, float angle);
これはワールド座標の(point)を中心とした軸(axis)で (angle)度回転させる関数です。
試しに以下のように中心(0,0,0)に青球を配置し、そこを中心にCubeを円運動させてみます。
void Update () {
transform.RotateAround (Vector3.zero, Vector3.up, 180*Time.deltaTime);
}
これをCubeに適応すると、以下のように円運動するようになりました。
マウスドラッグでオブジェクトを回転
ここでは、マウスドラッグでオブジェクトを回転させるスクリプトを紹介します。
void Update()
{
transform.Rotate(new Vector3(0, 0, Input.GetAxis("Mouse X") * 10));
}
これをCubeオブジェクトにアタッチすると、このような動きになります。
マウスをx軸方向に動かした分だけ、Cubeが回転しているのが分かります。
オブジェクトを回転させない方法
中には回転させたくないオブジェクトもあるかと思います。
ここではオブジェクトを回転させない設定方法も紹介します。
RigidBodyを設定しているオブジェクトの場合
RigidBody内、ConstraintsのFreeze Rotation項目にチェックを入れることで回転を抑制できます。
これで回転してほしくないオブジェクトを固定することができます。
特定の軸だけ回転させたくない場合は、その軸にだけチェックを入れましょう。
オブジェクトが回転するアニメーション作成方法
ここでは、オブジェクトが回転するアニメーションを作成する方法について、簡単にですが紹介します。
まずはCubeを作成しましょう。
今回は、CubeがZ軸周りに回転するアニメーションを作成していきます。
プロジェクトビューで右クリックして「Create」→「Animation」でアニメーションを作成します。
アニメーションが作成できたら、Projectタブを右クリックして「AddTab」→「Animation」でアニメーションタブを追加しましょう。
このようにアニメーションタブが追加されます。
ここでアニメーションが作成できます。
一度Projectビューに戻り、先ほど作成したアニメーションをCubeにドラッグアンドドロップします。
すると自動で「Cube」という名前のアニメーターが作成されました。
これでCubeにアニメーションが設定できましたが、まだアニメーションの中身は空の状態です。
ここからアニメーションを設定していきます。
Animationタブを開き、Cubeオブジェクトを選択してから、「Add Property」をクリック。
「Transform」→「Rotation」右にある+ボタンを押すと、Cube:Rotationという項目が追加されます。
下のように、アニメーションタブのすぐ下の入力欄の数値を「0」→「60」に変更します。
Cube:Rotationを開き、Rotation.zの値を180に変更します。
これで、一秒かけてZ軸周りに180度回転するアニメーションが作成できました。
ここまで設定できたら、実行して動作を確認してみましょう。
回転はしていますが、一度回転すると止まってしまいます。
連続で回転させるためには、アニメーションのインスペクターにある「LoopTime」の項目にチェックを入れましょう。
再度実行してみると、連続して回転するようになりました。
おすすめアセット
DOTween (HOTween v2)
有名アセットのDOTweenですが、DORotateという回転に関する機能が用意されています。
こちらは無料版のアセットになります。
何秒でZ軸を何度回転させる、といったことが簡単にできるのでオススメです!
Look Animator
Look Animatorは顔を対象の方に向けることに特化したアセットです。
こちら有料アセットになりますが、人や動物のオブジェクトを回転させたい人にオススメです!
まとめ
- 回転を扱うときはローカル座標とワールド座標を区別する
- 回転には角度を直接指定する方法と、現在の角度に加算する方法がある
- RotateAround関数で中心を指定して回転できる
今回はオブジェクトを回転させる方法について解説してきました。
回転は使う場面が非常に多いので、しっかりマスターしたいですね!