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);
                }
            }
        }
Пример #2
0
 /// <summary>
 /// Sets the selectable prefab.
 /// </summary>
 /// <param name="sel">The selectable prefab.</param>
 public void SetSelectablePrefab(Selectable sel)
 {
     _selectablePrefab = sel;
 }
Пример #3
0
 /// <summary>
 /// Despawns the selectable boject.
 /// </summary>
 /// <param name="sel">The selectable object.</param>
 public void DespawnSelectable(Selectable sel)
 {
     _activeSelectables.Remove(sel);
     sel.Delete();
 }
Пример #4
0
        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);
            }
        }