0.0 はじめに
オブジェクトを移動させる方法はいろいろとありますが、代表的な方法をまとめたいと思います。
Unityでオブジェクトを移動させるには、大きく2つの方法があります。
1つは、座標を変更して移動させる方法。もう1つは、オブジェクトに力を加えて移動させる方法です。
1.0 座標を変更させることによる移動
transformを使用して座標を直接変更します。オブジェクトを移動させるのに一番簡単で単純な方法です。ただし物理演算を無視した座標の変更は自然な動きに反しますので注意しましょう。
1.1 positionの変更による移動
直接座標を変えて移動するシンプルな方法です。
👍ポイント
transform.position(transform.position.x または y, z)には直接値を代入出来ないので注意が必要です。
Vector3(Vector2)の変数を介してtransform.positionを変更します。
Vector3 pos = transform.position; // 現在のポジションを代入
pos.x = 1.0f; // x座標変更
pos.y = 2.0f; // y座標変更
pos.z = -1.0f; // z座標変更
transform.position = pos; // 変更後の座標を代入
または下記のように変更します。
transform.position = new Vector3(1.0f, 2.0f, -1.0f);
1.2 Translate関数を使った移動
transform.Translate(x, y, z)を使用してオブジェクトの現在の位置を基準に移動する方法です。
Translate()の引数で指定したベクトルx・y・z分だけオブジェクトの位置を移動させることができます。
transform.Translate(1.0f, 2.0f, -1.0f);
1.3 Vector3.MoveTowards関数を使った移動
Vector3クラスにMoveTowards関数があります。MoveTowards関数は現在地から目的地まで一定速度で移動させてくれる関数です。引数には順番に “current” に現在地(Vector3)、”target” に目的地(Vector3)、”maxDistanceDelta” に1フレームの距離(一定速度)をfloatで指定します。
Vector3 current = transform.position;
Vector3 target = new Vector3(10, -5, 0);
float step = 2.0f * Time.deltaTime;
transform.position = Vector3.MoveTowards(current, target, maxDistanceDelta);
1.4 Vector3.Lerp関数を使った移動
Vector3クラスにはLerp関数もあり、これを使用してオブジェクトを移動させることができます。
Lerp(a, b, t)関数の引数は a : 始まりの位置, b : 終わりの位置, t : aからの現在の位置の割合です。
👍ポイント
tが0の時はaの地点、tが1の時はbの地点です。
Vector3 start = transform.position;
Vector3 target = new Vector3(10, -5, 0);
float timer = 0;
timer += Time.deltaTime;
transform.position = Vector3.Lerp(start, target, timer); // timerの変化分だけ移動させる(1秒で目的地)
2.0 力を加えることによる移動
オブジェクトにRigidbody(リジッドボディ)コンポーネントを追加することで、物理演算で移動させることができます。
InspectorウインドウでAdd Componentボタンを押して検索窓でRigidbodyを検索して追加しましょう。※2Dの場合はRigidbody 2Dを選びます。
👍ポイント
RigidbodyにはUse Gravity、Rigidbody2DにはGravity Scaleのパラメータがあり、重力の影響を調節できます。
2.1 速度を変更するVelocity関数を使う
一定の速度でオブジェクトを移動させたり、移動する速度を制限することができます。
Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = Vector3.right * 2f; // 速さを直接入れる
2.2 力を加え加速度を変更するAddForce関数を使う
オブジェクトに力を加えて物理演算を元に移動させることができます。現実世界と同じようにオブジェクトを自然な動きで移動させることができます。衝突のふるまいなど物理現象を使用している場合はこのAddForce関数を使いましょう。
👍ポイント
加える力が小さいとオブジェクトがうまく動かない場合があります。この場合はオブジェクトの質量を軽くするか、与える力を大きくすることで、オブジェクトを移動させることができます。
Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForce(1.0f, 2.0f, -1.0f); // 加える力のベクトルをVectorで入れる