Unityでオブジェクトの移動をする
オブジェクトの移動
フレーム単位での移動
Unityで一番最初に書く人も多いであろうオブジェクトの移動スクリプト。
x方向に動かしたい場合について考えていこうと思う。
書くとしたらこんな感じだろうか?
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { // 変化量 public float dx; void Update() { // dxは任意の値 this.transform.position += new Vector3(dx, 0, 0); } }
これで毎フレーム(dx, 0, 0)の値だけ座標が加算されていく。
this.transform.positionはこのスクリプトが貼り付いてるオブジェクトの
座標(x, y, z)のこと。そこに変化量を加えていく感じ。
Update関数はフレーム毎更新だからFPS(1秒毎の画面の更新回数)の値次第で移動速度が変わって見えてしまう!
つまり処理が遅いと遅く移動しているように見える。処理が早いときはその逆。
できれば等速直線運動してほしいよね~?って人は次の項目へ。
時間単位での移動
等速直線運動の式は距離x、速さv、時間tとするとき
x = v * t
が成り立ってるのは既知だと思われる。
(きのしたのはげおやじ、って覚えたよね?)
これをスクリプトにしたいとき、
x = オブジェクトの位置
v = 任意の速度
t = 経過時間
を設定してあげればいいな~ってことで
書こう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { // 変化量 public float dx; void Update() { // dxは任意の値 this.transform.position += new Vector3(dx * Time.deltaTime, 0, 0); } }
Time.deltaTimeは1フレーム前からの経過時間を表してくれているから
変化量 * 時間の形にすることができた。
これで時間単位で移動してくれるようになる。
変化量dxの変更
変化量dxはpublicな変数だから、Inspector上からも数値を代入できる。
Moveスクリプトに表示されているdxに任意の値を入力したらそれが変化量になる。