🥾

【Unity】オブジェクト移動まとめ_Ver2【GIFアリ,コピペ可】

に公開

この記事は何?

  • オブジェクトを動かす手段やTipsなどを掲載
  • 各機能の「画像のコード」のコードはコピペで使用することができる
  • 「これ載せてほしい🤩」,「ここ間違ってるやないか👹」等のコメントOKOK
更新予定と履歴
  • 2025/05/20 Ver2.0 DOTween系のGIF追加
  • 2025/05/20 Ver1.05 Rigidbody系のGIF追加
  • 2025/05/19 Ver1.04 Vector系のGIF追加
  • 2025/05/19 Ver1.03 Transform系のGIF追加
  • 2025/05/19 Ver1.02 解説追加(Spaceの違いについて)
  • 2025/05/19 Ver1.01 デフォルト引数の解説追加
  • 2025/05/18 Ver1 投稿

Transform系

デフォルト引数について
対応関数 対応変数 何に関係するか デフォルト値
Translate coordinate ワールド座標系かローカル座標系か Space.World
Space.World, Space.Self の違いを具体的に

  • 中央の四角を親オブジェクト, 左下の火星人(かわいい)をその子オブジェクトとする
  • 四角はZ軸の正方向に回転する
  • 火星人はTransform.Translate(new(1,0,0))によって右へ移動する


Transform.Translate(new(1,0,0), Space.World) の場合

  • Space.Worldワールド座標系での移動を示し、親の回転等に影響されない
  • このため、Transform.Translate()自体で進む方向は常に同じ


Transform.Translate(new(1,0,0), Space.Self) の場合

  • Space.Selfローカル座標系での移動を示し、親の座標, 回転, スケール に追従する
  • このため、Transform.Translate()で進む方向が親オブジェクトの影響を受けている

Translate

  • 指定距離 移動

画像のコード
using UnityEngine;

public class Translate_Test : MonoBehaviour
{
    [SerializeField] private float speed;

    private void Update()
    {
        transform.Translate(speed * Time.deltaTime * Vector3.right);
    }
}
Vector3 target = Vector3.right;
Space coordinate = Space.World;
transform.Translate(target, coordinate);

//軸ごとに指定することも可能
transform.Translate(target.x, target.y, target.z, coordinate);

//他のTransformのローカル座標系で移動
Transform reference = otherTransform;
transform.Translate(target, reference);

position, localPosition を直接扱う

  • 指定距離 移動
  • Translate と全く絵面が同じなのでGIFは省略
実際のコード
public class OperatePosition_Test : MonoBehaviour
{
    [SerializeField] private float speed;

    private void Update()
    {
        transform.Translate(speed * Time.deltaTime * Vector3.right);
        transform.position += speed * Time.deltaTime * Vector3.right;
    }
}
Vector target = Vector3.right;
transform.position      += target;
transform.localPosition += target;

Vector系

デフォルト引数について
対応関数 対応変数 何に関係するか デフォルト値
SmoothDamp maxSpeed 最大速度 Mathf.Infinity
SmoothDamp deltaTime SmoothDampを最後に用いてからの経過時間 Time.deltaTime

MoveTowards

  • 指定位置へ指定速度で移動

画像のコード
using UnityEngine;

public class MoveTowards_Test : MonoBehaviour
{
    [SerializeField] private Vector3 target;
    [SerializeField] private float speed;

    private void Update()
    {
        Vector3 current = transform.position;
        transform.position = Vector3.MoveTowards(current, target, speed * Time.deltaTime);
    }
}
Vector3 current = transform.position;
Vector3 target  = new(1f, 2f, 3f);
float speed = 0.1f;

transform.position = Vector3.MoveTowards(current, target, speed * Time.deltaTime);

Slerp

  • 開始, 目標位置の間を球面線形補間


両サイドのキューブは開始, 目標位置をわかりやすくするために置いており、コードには特に関係ない

画像のコード
using UnityEngine;
using System.Threading.Tasks;

public class Slerp_Test : MonoBehaviour
{
    [SerializeField] private Vector3 start;
    [SerializeField] private Vector3 end;
    [SerializeField] private float duration = 3.0f;

    private void Start()
    {
        MoveAsync(start, end, duration);
    }

    private async void MoveAsync(Vector3 start, Vector3 end, float duration)
    {
        float elapsed = 0f;
        while (elapsed < duration)
        {
            float t = elapsed / duration;
            transform.position = Vector3.Slerp(start, end, t);
            elapsed += Time.deltaTime;
            await Task.Yield();
        }
        transform.position = end;
    }
}
Vector3 start = transform.position;
Vector3 end   = Vector3.right;
float t = 0.1f; //開始, 目標位置までの割合

Vector3 result = Vector3.Slerp(start, end, t);

Lerp

  • 開始, 目標位置の間を線形補間(一定速度で移動)


両サイドのキューブは開始, 目標位置をわかりやすくするために置いており、コードには特に関係ない

画像のコード
using UnityEngine;
using System.Threading.Tasks;

public class Lerp_Test : MonoBehaviour
{
    [SerializeField] private Vector3 start;
    [SerializeField] private Vector3 end;
    [SerializeField] private float duration = 3.0f;

    private void Start()
    {
        MoveAsync(start, end, duration);
    }

    private async void MoveAsync(Vector3 start, Vector3 end, float duration)
    {
        float elapsed = 0f;
        while (elapsed < duration)
        {
            float t = elapsed / duration;
            transform.position = Vector3.Lerp(start, end, t);
            elapsed += Time.deltaTime;
            await Task.Yield();
        }
        transform.position = end;
    }
}
Vector3 start = transform.position;
Vector3 end   = new(1f, 2f, 3f);
float t = 0.1f; //開始, 目標位置までの割合

Vector3 result = Vector3.Lerp(start, end, t);

SmoothDamp

  • 開始, 目標位置間を補間(加減速しながら)

画像のコード
using UnityEngine;

public class SmoothDamp_Test : MonoBehaviour
{
    [SerializeField] private Vector3 target;
    [SerializeField] private float smoothTime = 1.0f;
    private Vector3 currentVelocity = Vector3.zero;

    void Update()
    {
        transform.position = Vector3.SmoothDamp(transform.position, target, ref currentVelocity, smoothTime);
    }
}
Vector3 current  = transform.position;
Vector3 target   = new(1f, 2f, 3f);
Vector3 velocity = Vector3.zero;
float smoothTime = 0.1f;
float maxSpeed   = 5f;
float deltaTime  = Time.deltaTime;

transform.position = Vector3.SmoothDamp(current, target, ref velocity, smoothTime, maxSpeed, deltaTime);

Rigidbody系

  • 本項目のGIFは、RigidbodyUse Gravity を無効化した設定にしている
  • 本項目のGIFは、ForceModeImpulse に設定している
デフォルト引数について
対応関数 対応変数 何に関係するか デフォルト値
AddForce, AddRelativeForce, AddExplosionForce mode 力の適用の仕方 ForceMode.Force
AddExplosionForce upwardsModifier 上向きの力の影響 0.0f

MovePosition

  • 指定位置へ瞬時に移動

画像のコード
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class MovePosition_Test : MonoBehaviour
{
    [SerializeField] private float speed;
    private Rigidbody rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        //現在位置から右へspeed分だけ移動
        Vector3 moveVec = transform.position + speed * Time.deltaTime * Vector3.right;
        rb.MovePosition(moveVec);
    }
}
Rigidbody rb = GetComponent<Rigidbody>();
rb.MovePosition(new(1f, 2f, 3f));

AddForce

  • 指定方向へ力を加える

画像のコード
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class AddForce_Test : MonoBehaviour
{
    [SerializeField] private ForceMode mode;
    [SerializeField] private float speed;
    private Rigidbody rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        rb.AddForce(speed * Time.deltaTime * Vector3.right, mode);
    }
}
Rigidbody rb = GetComponent<Rigidbody>();
ForceMode mode = ForceMode.Impulse;
rb.AddForce(new(1f, 2f, 3f), mode);

AddRelativeForce

  • 指定方向へ力を加える(相対移動)
実際のコード
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class AddRelativeForce_Test : MonoBehaviour
{
    [SerializeField] private ForceMode mode;
    [SerializeField] private float speed;
    private Rigidbody rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        rb.AddRelativeForce(speed * Time.deltaTime * Vector3.right, mode);
    }
}
Rigidbody rb = GetComponent<Rigidbody>();
ForceMode mode = ForceMode.Impulse;
rb.AddRelativeForce(new(1f, 2f, 3f), mode);

AddExplosionForce

  • 爆発が起きたように、力を加える

画像のコード
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class AddExplosionForce_Test : MonoBehaviour
{
    [SerializeField] private Vector3 explosionPosition;
    [SerializeField] private float explosionForce  = 500f;
    [SerializeField] private float explosionRadius = 5f;
    [SerializeField] private float upwardsModifier = 0.5f;
    [SerializeField] private ForceMode mode;

    private void Start()
    {
        Rigidbody rb = GetComponent<Rigidbody>();
        rb.AddExplosionForce(explosionForce, explosionPosition, explosionRadius, upwardsModifier, mode);
    }
}
//爆発の設定
float upwardsModifier = 2f;
float explosionForce  = 1000f;
float explosionRadius = 5f;
Vector3 explosionPosition = new(1f, 2f, 3f);
ForceMode mode = ForceMode.Impulse;

Rigidbody rb = GetComponent<Rigidbody>();
rb.AddExplosionForce(explosionForce, explosionPosition, explosionRadius, upwardsModifier, mode);

velocityを直接扱う

  • 速度自体を変更する

画像のコード
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class Velocity_Test : MonoBehaviour
{
    [SerializeField] private float speed;
    private Rigidbody rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        rb.velocity = new(speed, 0);
    }
}
Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = new Vector3(1f, 2f, 3f);

DoTween系

デフォルト引数について
対応関数 対応変数 何に関係するか デフォルト値
DOMove, DOLocalMove, DOBlendableMoveBy, DOAnchorPos, DOJump snapping 座標を整数に丸め込むか false
DOPath type 経路の種類 PathType.CatmullRom
DOPath mode パスの種類 PathMode.Full3D
DOPath resolution 解像度 10

DOMove

  • 指定座標に移動

画像のコード
using DG.Tweening;
using UnityEngine;

public class DOMove_Test : MonoBehaviour
{
    [SerializeField] private Ease ease = Ease.InOutExpo;
    [SerializeField] private Vector3 target;
    [SerializeField] private float duration;

    private void Start()
    {
        transform.DOMove(target, duration)
            .SetEase(ease);
    }
}
Vector3 target = new(1f, 2f, 3f);
float duration = 0.1f;
bool snapping = true;

transform.DOMove(target, duration, snapping);

DOLocalMove

  • 指定座標に移動(相対移動)
実際のコード
using DG.Tweening;
using UnityEngine;

public class DOLocalMove_Test : MonoBehaviour
{
    [SerializeField] private Ease ease = Ease.OutBounce;
    [SerializeField] private Vector3 target;
    [SerializeField] private float duration;

    private void Start()
    {
        transform.DOLocalMove(target, duration)
            .SetEase(ease);
    }
}
Vector3 target = new(1f, 2f, 3f);
float duration = 0.1f;
bool snapping = true;

transform.DOLocalMove(target, duration, snapping);

DOBlendableMoveBy

  • 指定座標に移動(累積可能)
Vector3 target = new(1f, 2f, 3f);
float duration = 0.1f;
bool snapping = true;

transform.DOBlendableMoveBy(target, duration, snapping);

DOAnchorPos

  • 指定座標に移動(RectTransform用)
実際のコード

using DG.Tweening;
using UnityEngine;

public class DOAnchorPos_Test : MonoBehaviour
{
[SerializeField] private Ease ease = Ease.InBounce;
[SerializeField] private Vector2 target;
[SerializeField] private float duration;
private RectTransform r;

private void Start()
{
    r = GetComponent<RectTransform>();
    r.DOAnchorPos(target, duration);
}

}

Vector2 target = new(1f, 2f);
float duration = 0.1f;
bool snapping = true;

rectTransform.DOAnchorPos(target, duration, snapping);

DOPath

  • 指定座標に沿って移動

画像のコード
using DG.Tweening;
using UnityEngine;

public class DOPath_Test : MonoBehaviour
{
    [SerializeField] private Vector3[] points;
    [SerializeField] PathType type = PathType.CatmullRom;
    [SerializeField] private float duration;

    private void Start()
    {
        transform.DOPath(points, duration, type);
    }
}
Vector3[] points = new[]
{
    new(0f, 0f, 0f),
    new(1f, 1f, 1f),
    new(1f, 2f, 2f),
    new(1f, 2f, 3f)
};
float duration = 0.1f;
PathType type = PathType.CatmullRom;
PathMode mode = PathMode.Full3D;
float resolution = 1f;

transform.DOPath(points, duration, type, mode, resolution);

DOJump

  • ジャンプ移動

画像のコード
using DG.Tweening;
using UnityEngine;

public class DOJump_Test : MonoBehaviour
{
    [SerializeField] private Vector3 target;
    [SerializeField] private float jumpPower;
    [SerializeField] private int jumpNum;
    [SerializeField] private float duration;

    private void Start()
    {
        transform.DOJump(target, jumpPower, jumpNum, duration);
    }
}
Vector3 target = new(1f, 2f, 3f);
float jumpPower = 1f;
int numJump = 2;
float duration = 1f;
bool snapping = true;

transform.DOJump(target, jumpPower, numJump, duration, snapping);

参考リンク

Transform系

Rigidbody系

共通

DoTween系

Discussion