マグネットのような動きを作成(吸い込むような動作)|Unityゲーム制作

Unity2Dゲームでマグネットのようなものを実装してみます。

はじめに

Unityのバージョンは「2021.3.14f1」で作成しています。

2Dゲームで「マグネット」のような動きを実装していきます。一定の距離に近づくとアイテムを吸い込むような動きです。

下記の画像を利用していきます。inkscapeで簡単に作成したものです。

実装開始

画像をUnityに取り込んでHierarchyにドラッグアンドドロップします。Rigidbody2Dを追加してGravityScaleを0にします。

下記スクリプトを作成します。マグネットの画像をキー操作で動かせるようにしています。

using UnityEngine;

public class Magnet : MonoBehaviour
{
    private Rigidbody2D rb;
    private Vector2 direction;

    private float speed = 5.0f;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        direction.x = Input.GetAxisRaw("Horizontal");
        direction.y = Input.GetAxisRaw("Vertical");
    }

    private void FixedUpdate()
    {
        rb.MovePosition(rb.position + direction * speed * Time.fixedDeltaTime);
    }
}

スクリプトを追加します。

実行してみて、下記のようにマグネットを動かすことが出来たらOK。

回収アイテムの作成

次にマグネットで回収するアイテムを作成します。「2DObject」→「Sprites」→「Circle」を追加します。

名前をCoinに変更して黄色にします。

Tagに「Coin」をセットして、CircleCollider2Dを追加して、「IsTrigger」にチェックを入れます。また、同名でスクリプトも追加します。

スクリプトの中は下記に変更します。マグネットの方に動くスクリプトです。

using UnityEngine;

public class Coin : MonoBehaviour
{
    private Transform Magnet;
    private float speed = 10.0f;

    void Start()
    {
        Magnet = GameObject.Find("magnet").GetComponent<Transform>();
    }

    void Update()
    {
        transform.position = Vector3.MoveTowards
            (transform.position, Magnet.position, speed * Time.deltaTime);
    }
}

実行すると下記のようにマグネットに近づきます。

「magnet」のスクリプトに下記を追加して、マグネットにコインが触れたら消えるようにします。

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Coin")
        {
            Destroy(collision.gameObject);
        }
    }

下記のように「PolygonCollider2D」をセットします。BoxCollider2Dでもよいかも。

Coinのスクリプトを下記に変更して、ある程度の距離までマグネットが近づいたらコインを移動するようにします。

using UnityEngine;

public class Coin : MonoBehaviour
{
    private Transform Magnet;
    private float speed = 10.0f;
    private float distance = 5.0f;

    void Start()
    {
        Magnet = GameObject.Find("magnet").GetComponent<Transform>();
    }

    void Update()
    {
        if (Vector3.Distance(transform.position, Magnet.position) < distance)
        {
            transform.position = Vector3.MoveTowards
                (transform.position, Magnet.position, speed * Time.deltaTime);
        }
    }
}

適当にコインを増やして、実行して下記のような感じに、コインにある程度近づいたときに回収すればOK。

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