【Unity】少し遅れて移動、回転するオブジェクト【電車の動き】

目次

実装したいこと

動画のように前の車両に遅れてついていく電車を作成します
シューティングのサブ機とかにも使えそうですね
※今回の記事は自分へのメモ用ですので説明は割愛しています
ご了承下さい

事前準備

UniRXというライブラリを使用するので、AssetStoreにてUniRXを探し、ダウンロードします

スクリプト

using UnityEngine;
using UniRx;
using UniRx.Triggers;

public class TrainDelayMove : MonoBehaviour
{
    public Transform target; // 追従したい対象。とりあえずひとつ前の車両を想定
    public float delay; // 動きの遅れ時間

    private Vector3 _offsetPosition; // 追従先とのPosition差分。進行方向に従って更新が必要
    private float _offsetDistance; // 追従先との距離差分。_offsetDistanceは基本的に不変

    [SerializeField]
    float TrainAdjustHor;

    [SerializeField]
    float TrainAdjustVar;

    private void Start()
    {
        this.UpdateAsObservable()
            .Select(_ => (target.position, target.rotation))
            .Delay(System.TimeSpan.FromSeconds(delay))
            .Subscribe(target =>
            {
                UpdateOffset(target.rotation);
                UpdatePosition(target.position);
                UpdateRotation(target.rotation);
            })
            .AddTo(this);

        _offsetPosition = transform.position - target.position;
        _offsetDistance = _offsetPosition.magnitude;
    }

    /**
     * _offsetPositionの更新
     */
    void UpdateOffset(Quaternion delayedTarget)
    {
        Vector3 diffAngle = transform.rotation.eulerAngles - delayedTarget.eulerAngles;
        _offsetPosition = new Vector3(-Mathf.Sin(diffAngle.y), 0, Mathf.Cos(diffAngle.y));
    }

    /**
     * 自身のpositionの更新
     */
    void UpdatePosition(Vector3 delayedTarget)
    {
        //transform.position = delayedTarget + _offsetPosition;
        transform.position = delayedTarget + transform.TransformDirection(Vector3.forward * TrainAdjustHor) + transform.TransformDirection(Vector3.up * TrainAdjustVar);
    }

    /**
     * 自身のrotationの更新
     */
    void UpdateRotation(Quaternion delayedTarget)
    {
        transform.rotation = delayedTarget;
    }
}

各変数の設定

スクリプトは追従させたいオブジェクト(今回の場合は先頭車両に続く車両全て)にスクリプトをアタッチし、

  1. Target : 一つ前の車両をドラッグ&ドロップ
  2. delay : 遅延する時間
  3. TrainAdjustHor : 横軸のずれる量
  4. TrainAdjustVar : 縦軸のずれる量


を入力します

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次