🥾
【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は、
Rigidbody
のUse Gravity
を無効化した設定にしている - 本項目のGIFは、
ForceMode
をImpulse
に設定している
デフォルト引数について
対応関数 | 対応変数 | 何に関係するか | デフォルト値 |
---|---|---|---|
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);
Discussion