(この記事の使用環境: Unity5.5.0f3 Personal、Windows10)


今回はSpringJoint(スプリングジョイント)を使ってみました。
バネのような動きを実現するPhysicsコンポーネントです。

Unity公式マニュアルは こちら

SnapCrab_NoName_2017-3-3_13-34-27_No-00

とりあえず設定してみたのがこんな感じ。黄色のCubeにSpringJointを設定しています。
上から落ちてくるSphereとの衝突を検出して、スクリプトで値を変化させています。


黄色のCubeにSpringJointを設定しています。インスペクタでの設定はこんな感じ。
SnapCrab_NoName_2017-3-3_13-42-17_No-00

アタッチしているスクリプト(「SpringCubeController」)の中身はこんな感じ。
上から落ちてくるSphereとの衝突を検出して、スクリプトで値を変化させています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpringCubeController : MonoBehaviour
{
    SpringJoint springJoint;    // スプリングジョイント
    Vector3 defaultAnchor;      // デフォルトのアンカー位置

    enum eAnchorState       // アンカー位置の状態
    {
        DEFAUTLPOS,         // 元の位置
        NOT_DEFAULTPOS,     // 元の位置じゃない
    }
    eAnchorState anchorState = eAnchorState.DEFAUTLPOS;

    private void Start ()
    {
        springJoint = GetComponent<SpringJoint> ();
        defaultAnchor = springJoint.connectedAnchor;
    }

    private void Update ()
    {
        switch (anchorState)
        {
            case eAnchorState.DEFAUTLPOS:
                break;

            case eAnchorState.NOT_DEFAULTPOS:

                // 徐々に元のアンカー位置に戻す
                springJoint.connectedAnchor = 
                    Vector3.Slerp (springJoint.connectedAnchor, defaultAnchor, 0.03f);

                if (Vector3.Distance(springJoint.connectedAnchor, defaultAnchor) < 0.01f)
                    anchorState = eAnchorState.DEFAUTLPOS;

                break;
        }
    }

    // アンカー位置を上に設定し、衝突した物体を上にはね上げる
    private void OnCollisionStay (Collision collision)
    {
        springJoint.connectedAnchor = new Vector3 (0f, 4f, 0f);
    }

    private void OnCollisionExit (Collision collision)
    {
        anchorState = eAnchorState.NOT_DEFAULTPOS;
    }
}


今回は以上です。