UnityでPrefabインスタンスごとに往復移動の挙動を変える方法
1. 基本方針
- 移動方向・距離・速度などをpublicな変数でInspectorから個別設定可能にする
- インスタンスごとに値を変えてOK(Prefab元は同じ)
2. サンプルスクリプト
たとえば移動方向も自由(XYZで指定)、移動距離・速度も個別にできるバージョン:
using UnityEngine;
public class CustomPingPongMover : MonoBehaviour
{
[Tooltip("移動する方向(例: X方向なら(1,0,0)、斜めなら(1,1,0) など)")]
public Vector3 moveDirection = Vector3.right;
[Tooltip("片道の移動距離")]
public float moveDistance = 3f;
[Tooltip("移動速度")]
public float speed = 2f;
private Vector3 startPoint;
private Vector3 endPoint;
private Vector3 target;
void Start()
{
startPoint = transform.position;
// 正規化して距離を乗算 → どの方向でも距離が正しく反映される
endPoint = startPoint + moveDirection.normalized * moveDistance;
target = endPoint;
}
void Update()
{
transform.position = Vector3.MoveTowards(transform.position, target, speed * Time.deltaTime);
if (Vector3.Distance(transform.position, target) < 0.01f)
{
target = (target == startPoint) ? endPoint : startPoint;
}
}
}
3. 使い方
- Prefabの元にこのスクリプトをアタッチ
- 必要に応じて、Inspectorで「moveDirection」「moveDistance」「speed」を設定
- 例:
- 横に3m移動 → moveDirection: (1, 0, 0), moveDistance: 3
- 斜め右上に2m移動 → moveDirection: (1, 1, 0), moveDistance: 2
- 縦に5m移動 → moveDirection: (0, 1, 0), moveDistance: 5
- Prefabを複数シーンに配置 or Instantiate()で動的生成
- 各インスタンスごとにInspectorで値を変えられる
4. さらにカスタマイズしたい場合
- 停止時間を設けたい場合→ CoroutineでWaitを入れる
- EaseIn/Out→ Mathf.SmoothStepなどを使う
- 特定のタイミングで動作開始したい場合→ publicメソッドで制御
5. ポイント
- PrefabのInspectorから値を編集すれば、個別インスタンスごとに独自の動きを実現
- プログラムを一切書き換えずに、「速い床」「ゆっくりな床」「遠くまで動く床」などを1種類のPrefabから量産可能
6. ヒント
- Prefab Variantを使えば、ベースPrefabを継承しつつ個別パターンも管理しやすいです。
- 自動でXYZにガイド線を出したい場合はOnDrawGizmosSelectedも活用できます(例が必要なら追加します)。
訪問数 10 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません