徒然エンジニアブログ

徒然エンジニアブログ

理系東大生がプログラミングを中心に様々なことについて情報発信していきます!

【Unity】物体を移動させる方法3つを紹介!!

今回はUnityをやっていると絶対にぶつかる物体の移動のさせ方について解説していきたいと思います。

transform.position

まず一つ目は直接transform.positionの値を変更するやり方です。

this.gameObject.transform.position = new Vector3(3,3,3);

このように使って指定の位置に移動させます。
ゲームの開始時になどに指定の位置に置くために使うことなどが多いです。


これをうまく使うと少しずつ移動して動いているように見せることができます。

void Update()
{
    //現在の位置を取得
    Vector3 pos = this.gameObject.transform.position;
    //現在の位置からx方向に1移動する
    this.gameObject.transform.position = new Vector3(pos.x+1,pos.y,pos.z);
}

このように現在の位置を取得してそれを元に1ずつ移動するというのを毎フレームごとに行います。
すると動いてるように見えるというわけです。


transform.positionで取得することができるのはワールド座標です。
これに対してローカル座標というものがあります。


これを取得するときにはtransform.localPositionを使えばいいだけです。


ローカル座標とワールド座標については以下の記事で詳しく説明しています。
turedureengineer.hatenablog.com

transform.Translate

次にtransform.Translateを使って移動させる方法です。

void Update(){
    this.gameObject.transform.Translate(1,1,1);
}

transform.Translateは現在の位置からどれだけ移動するかというものです。
上のように書くと毎フレームごとにx,y,z全ての方向に1ずつ動きます。


transform.Translate自体が現在位置からどれだけ移動するかというものなので先ほどのように現在位置を取得したりする必要はありません。


物体を動かすならこちらの方がわかりやすいですね。

AddForce

これは今までのものとは違いRigidbodyを使って移動させるものです。

そのためまずはRigidbodyを付け加える必要があります。
インスペクタの下のとことに「Add Component」というのがあります。ここを押して「Physics」→「Rigidbody」とすると設定できます。

void Start()
{
    rb = GetComponent<Rigidbody>();
}
void Update()
{
    rb.AddForce(1,1,1);
}

こうするとx,y,z方向に1ずつの力を加えることになります。


今回の例で言えばUpdate関数の中で毎回力を加えることになってしまうので、どんどん加速して行きます。
力を加えるのは一回だけでいいならStart関数の中で力を加えます。


Rigidbodyを使うことに利点はUnityに物理演算を任せることができるという点です。

そのため力を加えるだけでそのあとの移動はUnityが自動で計算してくれます。

特に衝突などを利用したい場合はこれを使うべきです。
なぜならtransform.positionなどを利用して動かすと衝突するべきところもすり抜けてしまうことがあるからです。