void Update() { GetInput(); if (_waitingForRelease && _clickUp) { _waitingForRelease = false; if (_pickedUp.velocity.y > 0) { _pickedUp.velocity = new Vector3(_pickedUp.velocity.x, 0f, _pickedUp.velocity.z); } _pickedUp.useGravity = true; //_pickedUp.freezeRotation = false; _pickedUp = null; _offset = Vector3.zero; if (_closestColliderBelow) { _closestColliderBelow.enabled = false; _closestColliderBelow = null; } } Ray ray = _cam.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; Vector3 offsetBase = Vector3.zero; if (Physics.Raycast(ray, out hitInfo, _distance, _interactSurfaceMask)) { offsetBase = hitInfo.point; if (_pickedUp) { float closestColliderY = float.MinValue; if (_closestColliderBelow && _closestColliderBelow._closestTransform) { closestColliderY = _closestColliderBelow._closestTransform.position.y; } Vector3 desiredPos = offsetBase + _offset; desiredPos.y = Mathf.Max(desiredPos.y, closestColliderY + _bufferDistance); Vector3 diff = desiredPos - _pickedUp.position; _pickedUp.velocity = diff.normalized * _velocityCurve.Evaluate(diff.magnitude / _maxVelocityDistance) * _maxVelocity; } } if (Physics.Raycast(ray, out hitInfo, _distance, _interactableMask)) { Selectable i = hitInfo.collider.GetComponentInChildren <Selectable>(); if (_clickDown && !_waitingForRelease && i && i._canBePickedUp) { _waitingForRelease = true; _pickedUp = hitInfo.collider.GetComponent <Rigidbody>(); if (_pickedUp) { _pickedUp.useGravity = false; //_pickedUp.freezeRotation = true; } else { _waitingForRelease = false; } _offset = _pickedUp.position - offsetBase + _pickUpOffset; _closestColliderBelow = hitInfo.collider.GetComponent <ClosestColliderBelow>(); if (_closestColliderBelow) { _closestColliderBelow.enabled = true; } Debug.Log("Picked up " + hitInfo.collider.name + ". With offset " + _offset); } } }
void Update() { GetInput(); // Pickup release if (_waitingForRelease && _pickupUp) { _waitingForRelease = false; if (_pickedUp.velocity.y > 0) { _pickedUp.velocity = new Vector3(_pickedUp.velocity.x, 0f, _pickedUp.velocity.z); } _pickedUp.useGravity = true; _pickedUp = null; _offset = Vector3.zero; if (_closestColliderBelow) { _closestColliderBelow.enabled = false; _closestColliderBelow = null; } } Ray ray = _cam.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; Vector3 offsetBase = Vector3.zero; if (Physics.Raycast(ray, out hitInfo, _distance, _selectableSurfaceMask)) { offsetBase = hitInfo.point; if (_pickedUp) { float closestColliderY = float.MinValue; if (_closestColliderBelow && _closestColliderBelow._closestTransform) { closestColliderY = _closestColliderBelow._closestTransform.position.y; } Vector3 desiredPos = offsetBase + _offset; desiredPos.y = Mathf.Max(desiredPos.y, closestColliderY + _bufferDistance); Vector3 diff = desiredPos - _pickedUp.position; _pickedUp.velocity = diff.normalized * _velocityCurve.Evaluate(diff.magnitude / _maxVelocityDistance) * _maxVelocity; } } if (Physics.Raycast(ray, out hitInfo, _distance, _selectableMask)) { Selectable sel = hitInfo.collider.GetComponentInChildren <Selectable>(); if (sel) { // Pickup if (_pickupDown && !_waitingForRelease && sel._canBePickedUp) { _waitingForRelease = true; _pickedUp = hitInfo.collider.GetComponent <Rigidbody>(); if (_pickedUp) { _pickedUp.useGravity = false; } else { _waitingForRelease = false; } _offset = _pickedUp.position - offsetBase + _pickUpOffset; _closestColliderBelow = hitInfo.collider.GetComponent <ClosestColliderBelow>(); if (_closestColliderBelow) { _closestColliderBelow.enabled = true; } //Debug.Log("Picked up " + hitInfo.collider.name + ". With offset " + _offset); } // Select if (_selectDown) { Selectable selectable = hitInfo.collider.GetComponentInChildren <Selectable>(); if (selectable.IsSelected()) { _selected.Remove(selectable); _selectedTransforms.Remove(selectable.transform); selectable.Deselect(); } else { _selected.Add(selectable); _selectedTransforms.Add(selectable.transform); selectable.Select(); } } } } if (_scrollWheel != 0f) { RotateSelected(_scrollWheel * 10f); } }