void Update() { GetInput(); Ray ray = _cam.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if (_waitingForRelease) { Plane plane = new Plane(Vector3.up, _holdingOrigin); float enter = 0f; // hitPoint may not be set correctly if the ray is perfectly // parallel to the ground. Hopefully this won't be an actual issue! Vector3 hitPoint = Vector3.zero; if (plane.Raycast(ray, out enter)) { hitPoint = ray.GetPoint(enter); } if (_clickUp) { Debug.Log("Released " + _holding.name); Vector3 diff = hitPoint - _holdingOrigin; _holding.velocity = diff.normalized * _velocityCurve.Evaluate((diff.magnitude - _minVelocityDistance) / _maxVelocityDistance) * _maxVelocity; _waitingForRelease = false; _holding = null; _holdingOrigin = Vector3.zero; _lineRenderer.positionCount = 0; } else { _lineRenderer.SetPosition(1, hitPoint); } } if (Physics.Raycast(ray, out hitInfo, _distance, _selectableMask)) { Selectable sel = hitInfo.collider.GetComponentInChildren <Selectable>(); if (_clickDown && !_waitingForRelease && sel && sel._canBePushed) { _waitingForRelease = true; _holding = hitInfo.collider.GetComponent <Rigidbody>(); if (_holding) { _holdingOrigin = hitInfo.point; _lineRenderer.positionCount = 2; _lineRenderer.SetPosition(0, hitInfo.point); _lineRenderer.SetPosition(1, hitInfo.point); } else { _waitingForRelease = false; } Debug.Log("Holding " + hitInfo.collider.name); } } }
/// <summary> /// Sets the selectable prefab. /// </summary> /// <param name="sel">The selectable prefab.</param> public void SetSelectablePrefab(Selectable sel) { _selectablePrefab = sel; }
/// <summary> /// Despawns the selectable boject. /// </summary> /// <param name="sel">The selectable object.</param> public void DespawnSelectable(Selectable sel) { _activeSelectables.Remove(sel); sel.Delete(); }
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); } }