using UnityEngine; /// /// CubePickupController implments the logic for picking up and moving cubes in the game. /// [RequireComponent(typeof(Rigidbody2D), typeof(Collider2D))] public class CubePickupController : MonoBehaviour { public float followSpeed = 250f; public float maxDistance = 3f; public Vector2 offset = new (0.5f, 1f); public float pickupAngularDamping = 2f; private Rigidbody2D _pickedUpCube; private float _originalAngularDamping; private Collider2D _playerCollider; private Vector2 _mapSwitchOffset = Vector2.zero; private void Awake() { _playerCollider = GetComponent(); } private void Update() { if (!Input.GetKeyDown(KeyCode.E)) return; if (_pickedUpCube != null) DropCube(); else PickUpCube(); } private void FixedUpdate() { if (_pickedUpCube != null) MoveCube(); } private void DropCube() { Collider2D blockCollider = _pickedUpCube.GetComponent(); Physics2D.IgnoreCollision(blockCollider, _playerCollider, false); _pickedUpCube.angularDamping = _originalAngularDamping; _pickedUpCube = null; } private void PickUpCube() { foreach (var collider in Physics2D.OverlapCircleAll(transform.position, 1f)) { if (collider.CompareTag("Cube")) { _pickedUpCube = collider.GetComponent(); _originalAngularDamping = _pickedUpCube.angularDamping; _pickedUpCube.angularDamping = pickupAngularDamping; Physics2D.IgnoreCollision(collider, _playerCollider, true); return; } } } private void MoveCube() { if (_mapSwitchOffset != Vector2.zero) { _pickedUpCube.position += _mapSwitchOffset; _mapSwitchOffset = Vector2.zero; return; } if (Vector2.Distance(_pickedUpCube.position, transform.position) > maxDistance) { DropCube(); return; } Vector2 targetPosition = (Vector2)transform.position + offset; _pickedUpCube.linearVelocity = (targetPosition - _pickedUpCube.position) * (followSpeed * Time.fixedDeltaTime); } private void OnEnable() { GameManager manager = GameManager.Instance; manager.onMapSwitch.AddListener(OnMapSwitch); } private void OnDisable() { GameManager manager = GameManager.Instance; manager.onMapSwitch.RemoveListener(OnMapSwitch); } private void OnMapSwitch(int idx, Vector3 o) { if (_pickedUpCube != null) { _mapSwitchOffset = o; _pickedUpCube.GetComponent().currentMap = idx; } } }