こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「Unityでキャラクターを移動させたい!」
「オブジェクトを動かすスクリプトを書いてみたい!」
というお悩みの方に向けた内容となっています。
Unityで配置したキャラクターやオブジェクトを動かしたい場合、スクリプトにそのプログラムの内容を書いていく必要があります。
オブジェクトを移動させるスクリプトの書き方はいくつかありますが、その中の一つにtransform.Translateを使って書く方法があります。
このtransform.Translateは、簡単に言えばそのオブジェクトの座標を移動させるためのものになっています。
そこで、このページでは、オブジェクトを移動させるために使うtransform.Translateの仕組みと使い方、また注意点までをまとめていきます。
なお、このページでは、
Windows11
Unity Hub3.11.0
Unity6
のバージョンで解説しています。
transform.Translateとは?座標を移動させることができる
transform.Translateは、前述の通りオブジェクトを移動させるためのものです。
最初の「transform」は、座標や回転を管理している「Transform」コンポーネントというものを呼び出すために記述しています。
そして、後ろの「Translate」は、Transformコンポーネントの中にある座標を移動させる「Translate」メソッドという機能を使うために記述することで、オブジェクトの移動が行えるようになっています。
もう少しそれぞれについて、詳しく説明してみます。
座標や回転を管理するTransformコンポーネント
まずは、Transformコンポーネントがどういうものなのかについてまとめていきます。
Transformコンポーネントとは?
Transformコンポーネントとは、そのオブジェクトの座標や回転、大きさを管理しているコンポーネントのことです。
実際に、Unityに配置したオブジェクトを選択してインスペクターウィンドウを見てみると、一番上にTransformという項目があり、これがTransformコンポーネントです。

このTransformコンポーネントには、オブジェクトの座標を表す「Position」、オブジェクトの回転を表す「Rotation」、オブジェクトの大きさを表す「Scale」が管理されています。
コンポーネントとは、Unityが提供しているオブジェクトに必要な機能を追加できる拡張パーツのようなものになっています。
このコンポーネントの中には、情報やデータが入っている「変数」や、実際に操作や処理を行う「メソッド」というものがたくさん含まれていて、これらの変数やメソッドを使うことでオブジェクトに機能を追加していくことができます。
コンポーネントは、Transformの他にも、物理挙動を表す「Rigidbody」や音を出す「AudioSource」などがあり、自分で追加していくことができます。
Transformコンポーネントにアクセスするための「transform」変数
コンポーネントの中にある変数やメソッドを使いたい場合、コンポーネントを呼び出す必要があります。
Transformコンポーネントを呼び出すためには、「transform」と小文字で書くだけで呼び出すことができます。
通常、コンポーネントを呼び出すためには、GetComponent(コンポーネント名)と記載する必要があるのですが、Transformコンポーネントは呼び出すことが多いため、Unity側で変数の「transform」と書けばTransformコンポーネントを呼び出せるように用意されています。
そのため、後ほど出てくるTranslateメソッドを使うために、最初に「transform」と記載してTransformコンポーネントを呼び出しています。
座標を移動させるTranslateメソッド
次に、Translateメソッドがどういうものなのかをまとめていきます。
Translateメソッドとは?
Translateとは、座標を移動させる機能を持つTransformコンポーネントのメソッドです。
メソッドとは、プログラムの処理をまとめているもので、メソッドを書くことでオブジェクトに対してその処理を行うことができます。
そのため、Translateメソッドは、座標を移動させるという処理が行われるメソッドということになります。
Translateメソッドの引数に移動させたい座標を設定
Translateメソッドを使って座標を移動させる場合、どのくらい移動させるのかの情報をメソッドに渡してあげる必要があります。
具体的には、
Translate(X座標, Y座標, Z座標);
Translate(Vector3値);
と、動かしたい座標の数値やVector3の値を後ろの()に入れてあげることで、その値分を移動させることができます。
なお、このように、メソッドに渡す値のことを引数(ひきすう)と呼び、引数は
メソッド(引数)
と書いてあげることで、メソッドにその値を渡すことができ、そしてその値を元に処理を行ってくれます。
ローカル座標かワールド座標か?
Translateメソッドを使う際に、座標の移動をローカル座標で動かすのか、ワールド座標で動かすのかを考えておく必要があります。
通常、Translateメソッドを使って移動させる場合、ローカル座標つまりそのオブジェクト目線で座標を動かすことになります。

その際、オブジェクトの向きが回転していると、同じ座標の移動でも方向が変わってしまいます。

これを防ぐためには、Translateメソッドの引数に「Space.World」と追記することで、ワールド座標で動かす必要があります。
Translate(X座標, Y座標, Z座標, Space.World);
Translate(Vector3値, Space.World);

そのため、オブジェクトの向きを回転させながら、Translateメソッドで移動する場合などは注意しておきましょう。
transform.Translateの書き方
transform.Translateによる移動を行う場合、
・スクリプトにアタッチしているオブジェクトを移動させるのか?
・スクリプトにアタッチしていないオブジェクトを移動させるのか?
によって書き方が変わってきます。
なお、スクリプトのアタッチがよく分からない場合は、以下のページも参考にしてみてください。
アタッチしているオブジェクトを移動させる場合
スクリプトに直接アタッチしているオブジェクトを移動させたい場合は、移動させたいタイミングで、
transform.Translate(X座標, Y座標, Z座標);
transform.Translate(X座標, Y座標, Z座標, Space.World);
と、記述してあげれば移動させることができます。
アタッチしていないオブジェクトを移動させる場合
スクリプトに直接アタッチしていないオブジェクトを移動させたい場合は、まずオブジェクトを探してくる必要があります。
オブジェクトを探すには、Findメソッドを使って以下のように書く必要があります。
GameObject.Find(“オブジェクト名”)
そして、このオブジェクトの中のTransformコンポーネントを取得してくることになるので、
GameObject.Find("オブジェクト名").transform.Translate(X座標, Y座標, Z座標);
GameObject.Find("オブジェクト名").transform.Translate(X座標, Y座標, Z座標, Space.World);
と記述してあげることで、アタッチしていないオブジェクトを移動させることができます。
ただし、Findメソッドは負荷がかかってしまい、常に移動させるような場合には毎回Findメソッドの処理が行われてしまい、非常に不向きなため、常に移動させるのであれば、オブジェクトに直接スクリプトをアタッチするようにしましょう。
transform.Translateの実際の使い方
ここでは、transform.Translateを実際に使ってみます。
2Dゲームでの使用になりますが、3Dゲームでも設定は同じです。
例①Enterキーを押すと移動する
キーボードのEnterキーを押すと、オブジェクトを移動させることができるスクリプトです。
using UnityEngine;
public class Test1 : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Return)) // Enterキーを押したかどうか
{
transform.Translate(0.5f, 0, 0); // X座標を0.5移動させる
}
}
}
実際に、上のコードを記述したスクリプトファイルをオブジェクトにアタッチして、ゲームを実行してみます。
Eneterキーを押す度に、オブジェクトのX座標が0.5ずつ移動しているのがわかりますね。
なお、ifは条件分岐とも呼ばれ、()内の条件を満たしたら{}内の処理を行うことができる書き方で、今回はEnterキーを押した場合の条件分岐を行っています。
また、指定している座標の数値の最後が「f」となっているのは、小数点を浮動小数型(float型)として扱ってもらうためです。
例②WASDキーのボタンに合わせて移動する
キャラクターの移動などで使われることが多いですが、
- Wキーを押している間、上に移動する
- Aキーを押している間、左に移動する
- Sキーを押している間、下に移動する
- Dキーを押している間、右に移動する
という動きを、transform.Translateで作ったスクリプトになります。
using UnityEngine;
public class Test1 : MonoBehaviour
{
float playerSpeed = 0.05f; // float型のplayerSpeed変数を作成し0.05を代入
void Update()
{
if (Input.GetKey(KeyCode.W)) // Wキーを押しているかどうか
{
transform.Translate(0, playerSpeed, 0); // Y座標をプラス側に移動させる
}
if (Input.GetKey(KeyCode.A)) // Aキーを押しているかどうか
{
transform.Translate(-playerSpeed, 0, 0); // X座標をマイナス側に移動させる
}
if (Input.GetKey(KeyCode.S)) // Sキーを押しているかどうか
{
transform.Translate(0, -playerSpeed, 0); // Y座標をマイナス側に移動させる
}
if (Input.GetKey(KeyCode.D)) // Dキーを押しているかどうか
{
transform.Translate(playerSpeed, 0, 0); // X座標をプラス側に移動させる
}
}
}
先ほどと異なる点として、playerSpeedという変数を作成していて、この変数をTranslateの座標の値として設定しています。
変数については別の記事でまとめますが、こうやって書いておくことで、後でスピードを変えたい場合に、7行目の数値を変更するだけで済みます。
先ほどと同様に、このスクリプトをオブジェクトに直接アタッチしてゲーム実行をしてみます。
これで、WASDキーを使って移動することができました。
なお、オブジェクトが動いているように見えますが、細かく座標を移動させることで、動いているように見えています。
物理演算の機能を取り入れる場合は注意
transform.Translateは、オブジェクトの座標を簡単に移動させることができますが、そのオブジェクトが物理演算の機能を使用している場合は、注意しておく必要があります。
物理演算と聞くと難しそうですが、そのオブジェクトの落下や衝突などの際に、よりリアルな挙動にさせるために、重さ・重力・摩擦係数などを使って動きを計算している機能です。
例えば、物理演算を使うと、通常はキャラクターが横に移動していて壁があったら、そこで衝突して止まることになります。
しかし、これをtransform.Translateで移動させてしまうと、壁があろうが無かろうが半強制的に座標を移動させることになるため、壁にめり込むような形になって物理演算に不具合が生じることになります。
そのため、物理演算の機能を入れる際の移動では、挙動がおかしくならないように、transform.Translateは原則使わず、オブジェクトに対して力を加えて動かすAddForceメソッドを使っていくようにしましょう。
物理演算やAddForceメソッドについては、今後記事にしていく予定です。
まとめ
このページでは、Unityでキャラクターなどの移動として使えるtransform.Translateについて、どんな仕組みなのか、使い方や注意点をまとめていきましたが、いかがでしたでしょうか?
transform.Translateは、オブジェクトの座標を移動させることができます。
具体的には、Transformコンポーネントが持っているTranslateメソッドを使って、動かしたい座標を引数に持たせることで、オブジェクトを動かすことができます。
ただし、物理演算を使って物理的な挙動をしているオブジェクトを動かす場合には、不向きとなるので注意しておきましょう。
最後までお読みいただきまして、ありがとうございました!
コメント