物をつかんで動かして離す(箱を運ぶ)【Unityメモ】

今回はUnity2Dで物をつかんで離す(物を運ぶ)のを実装してみます。

はじめに

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

スペースキーで箱をつかみ、もう一度スペースキーを押すと離すのを実装していきます。

実装開始

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

一つは名前をGroundに変更して、スケール、色を変更。AddComponentから、BoxCollider2Dをアタッチします。

もう一つはPlayerに名前を変更して、スケールを変更。AddComponentからBoxCollider2DとRigidbody2Dをアタッチします。

最後は名前をBoxに変更して、色を変更。AddComponentからBoxCollider2DとRigidbody2Dをアタッチします。

ゲーム画面が下記のような感じになるようにします。茶色っぽいのが地面、白がプレイヤーで青色が箱です。

掴んで離すスクリプト

Playerに「PlayerMove」と「Grab」と言う名前でスクリプトを2つアタッチします。

PlayerMoveのスクリプトの中身を下記に変更します。左右のキー入力でプレイヤーが移動します。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    private float _speed = 5.0f;
    private Rigidbody2D _rb;

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

    void Update()
    {
        float InputX = Input.GetAxisRaw("Horizontal");
        _rb.velocity = new Vector2(InputX * _speed, 0);
    }
}

Grabのスクリプトの中身は下記に変更します。スペースキーを押した時に、つかむor離す動作をします。

using UnityEngine;

public class Grab : MonoBehaviour
{

    [SerializeField] private Transform grabPoint;
    [SerializeField] private Transform rayPoint;

    private float rayDistance = 0.2f;
    private GameObject grabObj;
    RaycastHit2D hit;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (grabObj == null)
            {
                hit = Physics2D.Raycast(rayPoint.position, transform.right, rayDistance);
                if (hit.collider != null && hit.collider.tag == "Box")
                {
                    grabObj = hit.collider.gameObject;
                    grabObj.GetComponent<Rigidbody2D>().isKinematic = true;
                    grabObj.transform.position = grabPoint.position;
                    grabObj.transform.SetParent(transform);
                }
            }
            else
            {
                grabObj.GetComponent<Rigidbody2D>().isKinematic = false;
                grabObj.transform.SetParent(null);
                grabObj = null;
            }
        }
    }
}

Raycastの公式リファレンスは下記。SetParentでPlayerの配下に移動するため、Playerと一緒に動くようになります。そのため掴んでいる(運んでいる)動きになります。

最終設定

BoxオブジェクトのTagにBoxを設定。

Playerの配下に「CreateEmpty」で空のオブジェクトを2つ追加。RayPointとGrabPointと言う名前にします。おおまかに下記のような感じに設定

後はパラメータにセット

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

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