【Unity】プレイヤーが移動する台から滑り落ちる時の対処法

おはようございやす。

現在、Unityで2D横スクロールアクションを開発しています。
そこで、ギミックとして横に移動する台を作成しました。

その時にプレイヤーがその台に乗り、台が移動すると、なんとプレイヤーは一緒に移動せず、その場で硬直状態ではありませんか。

そこで、移動する台にプレイヤーが乗った時に、プレイヤーも一緒に運びたい。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 動く床
///
/// 横移動と縦移動の2種類
/// </summary>
[RequireComponent(typeof(Rigidbody2D))]
public class MoveFloor : MonoBehaviour
{
    [Header("縦方向に移動させる")] public bool isVertical; // 縦方向に移動するかどうか
    [Header("横方向に移動させる")] public bool isHorizontal; // 横方向に移動するかどうか

    [Header("縦方向の移動速度")] public float moveSpeedY; // 縦方向の移動速度
    [Header("横方向の移動速度")] public float moveSpeedX; // 横方向の移動速度

    [Header("左端の座標")] public float leftPos; // 左端の座標
    [Header("右端の座標")] public float rightPos; // 右端の座標

    [Header("上端の座標")] public float upPos; // 上端の座標
    [Header("下端の座標")] public float downPos; // 下端の座標

    private bool movingPositive = true; // 正の方向に移動しているかどうか
    private Rigidbody2D rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        rb.isKinematic = true; // 物理挙動の影響を受けないようにする
    }

    private void FixedUpdate()
    {
        // 現在地を取得する
        Vector2 currentPos = rb.position;

        // 横方向の移動処理
        if (isHorizontal)
        {
            // 正の方向に移動しているなら、
            if (movingPositive)
            {
                // 右方向に移動
                currentPos.x += moveSpeedX * Time.fixedDeltaTime;

                // 右端まで行った時は、
                if (currentPos.x >= rightPos)
                {
                    // 移動方向を反転させる
                    currentPos.x = rightPos;
                    movingPositive = false;
                }
            }
            // 負の方向に移動しているなら、
            else
            {
                // 左方向に移動
                currentPos.x -= moveSpeedX * Time.fixedDeltaTime;

                // 左端まで行った時は、
                if (currentPos.x <= leftPos)
                {
                    // 移動方向を反転させる
                    currentPos.x = leftPos;
                    movingPositive = true;
                }
            }
        }

        // 縦方向の移動処理
        if (isVertical)
        {
            // 正の方向に移動しているなら、
            if (movingPositive)
            {
                // 上方向に移動
                currentPos.y += moveSpeedY * Time.fixedDeltaTime;

                // 上端まで行った時は、
                if (currentPos.y >= upPos)
                {
                    // 移動方向を反転させる
                    currentPos.y = upPos;
                    movingPositive = false;
                }
            }
            // 負の方向に移動しているなら、
            else
            {
                // 下方向に移動
                currentPos.y -= moveSpeedY * Time.fixedDeltaTime;

                // 下端まで行った時は、
                if (currentPos.y <= downPos)
                {
                    // 移動方向を反転させる
                    currentPos.y = downPos;
                    movingPositive = true;
                }
            }
        }

        // 新しい位置を適用する
        rb.MovePosition(currentPos);
    }
}

このように書いたら、プレイヤーも一緒に台と移動してくれるようになった。
汚いし、参考になるかわからないコードだが、よかったらぜひ。

コメント

タイトルとURLをコピーしました