(Unity)落ちた床を、一定時間経過後、元の位置(角度)に戻す。

(スクリプト)

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

public class FallBlock : MonoBehaviour
{
    private Rigidbody rb;

    // ★追加
    private Vector3 initialPos;
    private Quaternion initialRot;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();

        // ★追加
        // 最初の位置情報を取得する。
        initialPos = transform.position;

        // 最初の角度を取得する。
        initialRot = transform.rotation;
    }
    private void OnCollisionExit(Collision collision)
    {
        if(collision.gameObject.CompareTag("Player"))
        {
            Invoke("Fall", 0.2f);
        }
    }
    void Fall()
    {
        rb.isKinematic = false;

        // ★追加
        // 10秒後にリセット
        Invoke("BlockReset", 10.0f);
    }

    // ★追加
    // リセット(元の位置に戻す)
    private void BlockReset()
    {
        transform.position = initialPos;
        transform.rotation = initialRot;
        rb.isKinematic = true;
    }
}

(実行結果)

  • 落ちた床が、10秒経過するごとに元の位置に戻ってくれば成功


(改良)

  • 上記は、ブロックが「瞬間移動」で元の位置に戻ります。
  • これを「元に位置に向かってゆっくり移動」する方式に改良します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FallBlock : MonoBehaviour
{
    private Rigidbody rb;
    private Vector3 initialPos;
    private Quaternion initialRot;

    // ★★改良
    private bool moveON = false;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        initialPos = transform.position;
        initialRot = transform.rotation;
    }

    private void Update()
    {
        // ★★改良
        // moveONがtrueの時、元の位置に向かって移動させる。
        if(moveON)
        {
            transform.position = Vector3.MoveTowards(transform.position, initialPos, 1.5f);

            // テクニック
            // 元の位置との距離が0.1未満になったらmoveONをfalseにする。
            if(Vector3.Distance(transform.position, initialPos) < 0.1f)
            {
                moveON = false;
            }
        }
    }

    private void OnCollisionExit(Collision collision)
    {
        if(collision.gameObject.CompareTag("Player"))
        {
            Invoke("Fall", 0.2f);
        }
    }
    void Fall()
    {
        rb.isKinematic = false;
        Invoke("BlockReset", 10.0f);
    }

    private void BlockReset()
    {
        // ★★改良
        // 下記のコードはコメントアウト
        //transform.position = initialPos;

        // ★★改良
        moveON = true;

        transform.rotation = initialRot;
        rb.isKinematic = true;
    }
}

(実行結果)

  • 落ちた床が、10秒経過後、ゆっくり元に位置まで移動すれば成功です。