のののーと

ライフワークとライスワークの割合

Addforceを使って疑似引力

タイトルの通り、RigidbodyのAddforceメソッドを使って疑似引力を表現。こんな感じ。 赤マル(目標地点)に対して青マル(Ball)が近づくと引き付けられる様子。

f:id:nonoui:20180218232101g:plain

※unity version 2017.2.1

仕組み

近づいているかどうか判断するために,赤マルにColliderをアタッチ。同様に青マルにもColliderとRigidbodyをアタッチ(今回は2Dなので2D用のものを)。

f:id:nonoui:20180218232910p:plain

赤マルには以下のスクリプトもアタッチ。

using UnityEngine;

public class Goal : MonoBehaviour {
    [SerializeField] float gravitation = 1f;
    Vector2 center;

    // Use this for initialization
    void Start () {
        center = transform.position;
    }
    
    void OnTriggerStay2D(Collider2D coll) {
        if (coll.tag != "Player") return;

        var ballPos = (Vector2)coll.transform.position;
        var diff = center - ballPos;
        var force = diff.normalized * gravitation;
        if (force == Vector2.zero) return;
        Debug.Log("force:"+force);
        coll.GetComponent<BallProvider>().Push(force);
    }
}

やってることは、青マルの中心から赤マルの中心までのベクトルを算出して,その方向に力を加えるだけ。変数forceがそのベクトル。

f:id:nonoui:20180218234156p:plain

青マル側はforceを受け取って、AddForceに適応させるだけ。

public void Push(Vector2 force) {
    rigidbody2D.AddForce(force);
}

docs.unity3d.com

以上!

冒頭の画像は、パターゴルフで、ボールがカップインする様子(を表現したつもり)。ゴルフ以外にも、重力もののゲームに応用できそうかな...?