(スクリプト)
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秒経過後、ゆっくり元に位置まで移動すれば成功です。