ボールをマウスドラッグではじくような動きを実装【Unityメモ】

今回はUnity2Dでボールをマウスドラッグではじく動きを実装してみます。

はじめに

Unityのバージョンは2021.3.14f1です。

ボールをマウスドラッグで引っ張り、離すとはじくような動きを実装していきます。下記のような感じですね。

実装開始

Hierarchyで右クリック、「2DObject」→「Sprites」→「Circle」を追加します。

名前をBallに変更し、「Rigidbody2D」と「CircleCollider2D」をアタッチします。Rigidbody2DのGravityScaleは0にしておきます。

下記のスクリプトを作成してアタッチします。ボールの上でマウスドラッグ、離すと力を加えます。

using UnityEngine;

public class BallShoot : MonoBehaviour
{
    private Rigidbody2D _rb;

    private float power = 2.0f;
    private float maxPower = 5.0f;

    private Vector2 StartPos;
    private Vector2 EndPos;

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

    private void OnMouseDown()
    {
        StartPos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
    }
    private void OnMouseDrag()
    {
        transform.position = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
    }
    private void OnMouseUp()
    {
        EndPos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);

        Vector2 force = Vector2.ClampMagnitude((StartPos - EndPos), maxPower);
        _rb.AddForce(force * power, ForceMode2D.Impulse);
    }
}

実行すると下記のような動きになります。

引っ張った線を引く

マウスドラッグで引っ張っているのが分かりやすいように線を引いていきます。

LineRendererをアタッチし、Width、EndCapVertices、Materialsなどを変更します。

スクリプトを下記のように変更して、LineRendererのPositionをセットします。

using UnityEngine;

public class BallShoot : MonoBehaviour
{
    private Rigidbody2D _rb;
    private LineRenderer _rend;

    private float power = 2.0f;
    private float maxPower = 5.0f;

    private Vector2 StartPos;
    private Vector2 EndPos;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
        _rend = GetComponent<LineRenderer>();
    }

    private void OnMouseDown()
    {
        StartPos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
    }
    private void OnMouseDrag()
    {
        transform.position = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
        _rend.SetPosition(1, transform.position);
    }
    private void OnMouseUp()
    {
        _rend.enabled = false;
        EndPos = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);

        Vector2 force = Vector2.ClampMagnitude((StartPos - EndPos), maxPower);
        _rb.AddForce(force * power, ForceMode2D.Impulse);
    }
}

これで実行すると原点とボールの間に線が引かれます。

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