Unity

【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 : 縦軸のずれる量


を入力します

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

このサイトについて

ここには、自己紹介やサイトの紹介、あるいはクレジットの類を書くと良いでしょう。

検索

-Unity

執筆者:


comment

メールアドレスが公開されることはありません。

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

関連記事

no image

敵を全員倒したらクリア

using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class GameCle …

Unityでのジャンプ【Rigidbody,CharacterControllerどちらも対応】

はじめに Unityでジャンプを実装する場合にはいくつかの方法があります その中でも、よく使われるのが、 ①CharacterControllerを使用したジャンプ ②Rigidbodyを使用したジャ …

no image

C#の構造とルール

Unityのデフォルトのスクリプト using System.Collections; using System.Collections.Generic; using UnityEngine; pub …

UnityでTilemapを使って2Dステージを作る

Tilemapとは? マップチップを登録してお手軽に2Dマップが作れるツールです Tilemapに使う素材を入れる

no image

一定距離で追従するカメラ

using UnityEngine; using System.Collections; public class CameraFollowPlayer : MonoBehaviour { publi …

ゲタバコ倶楽部へようこそ

  • 312199総閲覧数:
  • 15今日の閲覧数:
  • 241044総訪問者数:
  • 13今日の訪問者数:

住所
Akita,Japan

営業時間
月~日: 10:00 AM – 10:00 PM

このページはゲタバコ先生の日々思うことや活動、プログラミングの習得方法を発信するページです。
仕事のご依頼、メッセージ等、サービス概要をご覧の上で、お気軽にご連絡ください。

getabakosensei@gmail.com