今回は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と言う名前にします。おおまかに下記のような感じに設定
後はパラメータにセット
実行すると下記のような動きになります。