【Unity】オブジェクトを移動させる方法まとめ「Translate, Rigidbody, Vector3」

Unity

はじめに

この記事ではUnityの「transform」や「vector3」を使ったオブジェクトの移動方法を紹介します。

 

transformを使った移動

transform.Translate

これは、現在のオブジェクトの位置を基準にして移動したいときに使用します。

GameObject.Find(“Object”).gameObject.transform.Translate(x, y, z); のような使い方をします。スクリプトを直接オブジェクトに取り付けた場合、GameObject.Find(“Object”).gameObject は省略できます。これは以下全て同様です。

なお、GameObject.Find(“Object”)は比較的CPUへの負荷が大きいので、移動のようにUpdateで何度も繰り返す場合はオブジェクトに直接取り付けた方がいいでしょう。

では、以下のコードをコピペして使ってみてください(class名はMoveという名前にしているので、ここだけ自分が使ってるクラス名に変更してください)。

十字キーでオブジェクトが動くようになります。

注意点

上記コードでとりあえず動くようになったと思いますが、実はこのコードは良いコードではありません。

Update()の繰り返しスピードはデバイスの性能によって異なるので、移動速度がパソコンでは早いけど、スマホでみると遅い、といった現象が生じるからです。

そういった場合、FixedUpdate()を使う必要があります。これは一定時間ごとに呼び出される関数ですので、これを使えばどのデバイスでみても同じ移動速度になります。移動処理には必ずFixedUpdate() を利用するようにしてください。

逆に、ボタン入力等は反応が早ければ早い方がいいので、Inputの処理はUpdate()に入れるべきです。

上記の理由から、コードを修正しました。以下のコードをコピペして使ってみてください。

このコードには「辞書型変数」のようにやや高度な構文を使ってますので、すぐには理解できなくても大丈夫ですが、とりあえず移動にはFixedUpdateを使うべきなんだな、ということを覚えておいてください。

 

 

 

transform.position

オブジェクトの座標を指定して移動します。本来は transform.position = new Vector3(0f, 0f, 0f); のような使い方で指定した場所へワープさせたいときに使用することが多いです。

今回のように現在の座標に加算すればtransform.Translateと同じような移動も可能です。

transform.position += transform.forward * 1f * Time.deltaTime; のように使います。

transform.forward はオブジェクトが向いている方向のベクトル、1f * Time.deltaTimeは1 m/s の速さで処理を行うことを示しています。

 

Vector3を使った移動

Vector3.MoveTowards

指定した座標に向かって移動したいときに使います。ターゲットを追いかけたいときに使用することが多いです。

 

Vector3についてさらに詳しく知りたい方はこちらの記事もご覧ください

【Unity】Vector3を使った移動方法や長さを低負荷に取得する方法
はじめに この記事ではUnityのVector3の使い方を紹介します。 — YouTubeなら5分22秒で学べます ―    Vector3とは Vector3とは日本語でベクトルのことで、「大きさ」と「方向」の成分を持っています。 詳しく...

 

Rigidbodyを使った移動

Rigidbody.AddForce

オブジェクトに物理的な力を加えて移動させます。Cube に Rigidbody コンポーネントを取り付け、物理演算や加速度を利用したいときに使います。

これまではInput.GetKey で bool 型の trueを取得し、実行していましたが、

Input.GetAxis(“Vertical”) を使って float の値を取得しています。値の範囲は -1 ~ 1 です。

今回の場合、AddForce(x, 0, z) で x軸方向にInput.GetAxis(“Horizontal”) * speed、z軸方向にInput.GetAxis(“Vertical”) * speedの力を加えます。

FixedUpdate() はRigidbodyを使う際によく用いられます。Update() はパソコンの性能によって処理間隔が異なりますが、FixedUpdate() は性能に関わらず一定となります。

もしFixedUpdate()  を使わないと、Addforceする間隔が機械によって異なるため、移動速度が変化してしまいます。

 

ホームへ戻る

タイトルとURLをコピーしました