今回は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と言う名前にします。おおまかに下記のような感じに設定

後はパラメータにセット

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

