private void OnEnable()
 {
     if (_isActivated)
     {
         GrenadeList.Register(this);
     }
 }
        private void OnDisable()
        {
            if (_preview != null)
            {
                GameObject.Destroy(_preview);
                _preview = null;
            }

            GrenadeList.Unregister(this);
        }
        /// <summary>
        /// Sets the grenade to explode on collision.
        /// </summary>
        public void Activate(GameObject attacker, float delay = 0)
        {
            if (delay <= float.Epsilon)
            {
                _isActivated  = true;
                _isActivating = false;
                _timer        = Timer;
                GrenadeList.Register(this);
            }
            else
            {
                _isActivating  = true;
                _activateTimer = delay;
            }

            _attacker = attacker;
        }
        private void Update()
        {
            if (_isActivating)
            {
                _activateTimer -= Time.deltaTime;

                if (_activateTimer < float.Epsilon)
                {
                    _isActivating = false;
                    _isActivated  = true;
                    GrenadeList.Register(this);
                    _timer = Timer;
                }
            }

            if (_isActivated)
            {
                if (_timer < float.Epsilon)
                {
                    explode();
                }
                else
                {
                    _timer -= Time.deltaTime;

                    if (_timer < Timer - PreviewTime)
                    {
                        if (_preview == null)
                        {
                            _preview = GameObject.Instantiate(ExplosionPreview);
                            _preview.transform.parent = null;
                            _preview.SetActive(true);
                        }

                        if (_preview != null)
                        {
                            _preview.transform.localScale = Vector3.one * ExplosionRadius * 2;
                            _preview.transform.position   = transform.position;
                        }
                    }
                    else if (_preview != null)
                    {
                        GameObject.Destroy(_preview);
                        _preview = null;
                    }
                }
            }

            if (_isFlying)
            {
                var position = transform.position;

                var previousOffset = _offset;
                _offset   = Vector3.Lerp(_offset, Vector3.zero, Time.deltaTime * 2);
                position += _offset - previousOffset;

                GrenadePath.Step(ref position, ref _velocity, Time.deltaTime, _gravity, Bounciness);

                transform.position = position;
            }
        }