Unityでゲーム開発を行う上で、オブジェクトを動かすことは基本中の基本です。
Transform.positionを移動させる方法は色々な方法があり、それぞれに特徴があります。
今回はTransform.positionの色々な移動方法の中でもTransformコンポーネントのみで行える移動方法についてまとめてみました。
Transformとは
既にUnityに触れている人なら既にご存じかと思いますが、
Transformコンポーネントは、全てのGameObjectに自動的に含まれる基本コンポーネントです。
Transform.positionプロパティはオブジェクトのワールド座標における位置を示します。
UnityではVector3型で表され、X,Y,Zの3つの不動小数点数で構成されます。
Transformコンポーネントによる移動
Transformコンポーネントによる移動は物理計算を考慮しません。
そのため、RigidbodyやColliderなどによる物理挙動を用いている場合、Transformコンポーネントによる移動で思わぬ挙動をすることがありますので注意が必要です。
例えば、直接positionを変更させて物理判定がある者同士を重ねてしまうと、その直後の物理計算でかなりぶっ飛んでしまう、といったことが起こり得ます。
直接移動先のpositionを指定
transform.position = new Vector3(5, 0, 0);
直接位置を指定してその位置に移動させます。
一瞬で移動させたいときはこの方法を使うことも多いと思います。
Vector3の加算/減算による移動
void Update()
{
transform.position += Vector3.right * 3 * Time.deltaTime;
}
こちらの例では毎フレームtransform.positionにVector3を加算することで移動しています。
毎フレーム加算することで一定速度で移動させることが出来ます。
Transform.positionはワールド座標なので、オブジェクトが回転していても同じ方向に移動します。
基本的に毎フレーム加算する場合は、フレーム落ちによる速度の変化が起こらないようにTime.deltaTime(1フレーム間の経過時間)を掛け合わせることが一般的です。
Transform.Translate(Vector3)による移動
void Update()
{
transform.Translate(3 * Time.deltaTime, 0, 0);
//transform.Translate(Vector3.right * 3 * Time.deltaTime);と同じ
}
Transform.Translate()メソッドでは、オブジェクトを現在の位置から相対的に移動させることが出来ます。
Translate(x,y,z)でそれぞれfloat型で指定するか、
Translate(new Vector3(x, y, z))でVector3型で指定します。
オブジェクトのローカル座標系に基づいて移動するため、オブジェクトが回転している場合でもそのローカル座標軸に沿って移動が出来ます。
プレイヤーの操作を独自で実装する際などはこちらを使うと、直感的に実装出来そうです。
Vector3.Lerpによる移動
private Vector3 _startPosition;
private Vector3 _endPosition;
private float _speed = 3.0f;
private float _startTime;
private float _distance;
void Start()
{
_startPosition = transform.position;
_endPosition = _startPosition + new Vector3(5f, 0, 0);
_distance = Vector3.Distance(_startPosition, _endPosition);
_startTime = Time.time;
}
void Update()
{
float elapsedTime = (Time.time - _startTime) * _speed;
float timeRate = Mathf.Clamp01(elapsedTime / _distance);
transform.position = Vector3.Lerp(_startPosition, _endPosition, timeRate);
}
Vector3.Lerp(Vector3 start, Vector3 end, float t)関数では
始点と終点、始点から終点までの割合を0~1で指定することで
2つの値の間を指定した割合で補完し、滑らかな移動をさせることが出来ます。
始点と終点を指定できるので、特定の位置から特定の位置までの移動を時間経過などで行いたいときなどに活用できます。
Vector3.MoveTowardsによる移動
[SerializeField] private Transform _target;
private float _speed = 3.0f;
void Update()
{
transform.position = Vector3.MoveTowards(transform.position, _target.position, _speed * Time.deltaTime);
}
Vector3.MoveTowards(Vector3 currentPosition, Vector3 targetPosition, float maxDistanceDelta)関数では
現在位置、終点、1フレーム間の最大移動距離の指定をすることで移動が出来ます。
移動速度を指定できるため、一定の速度で目的地まで移動させたいときに活用できます。
何かしらのオブジェクトを追跡させたいときなどにも活用できますね。
コメント