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. 使い方

  1. Prefabの元にこのスクリプトをアタッチ
  2. 必要に応じて、Inspectorで「moveDirection」「moveDistance」「speed」を設定 
  3. 例:
    • 横に3m移動 → moveDirection: (1, 0, 0), moveDistance: 3
    • 斜め右上に2m移動 → moveDirection: (1, 1, 0), moveDistance: 2
    • 縦に5m移動 → moveDirection: (0, 1, 0), moveDistance: 5
  4. Prefabを複数シーンに配置 or Instantiate()で動的生成
  5. 各インスタンスごとにInspectorで値を変えられる

4. さらにカスタマイズしたい場合

  • 停止時間を設けたい場合→ CoroutineでWaitを入れる
  • EaseIn/Out→ Mathf.SmoothStepなどを使う
  • 特定のタイミングで動作開始したい場合→ publicメソッドで制御

5. ポイント

  • PrefabのInspectorから値を編集すれば、個別インスタンスごとに独自の動きを実現
  • プログラムを一切書き換えずに、「速い床」「ゆっくりな床」「遠くまで動く床」などを1種類のPrefabから量産可能

6. ヒント

  • Prefab Variantを使えば、ベースPrefabを継承しつつ個別パターンも管理しやすいです。
  • 自動でXYZにガイド線を出したい場合はOnDrawGizmosSelectedも活用できます(例が必要なら追加します)。

訪問数 10 回, 今日の訪問数 1回

C#,Unity

Posted by hidepon