/// <summary>
        /// Initialize selected object.
        /// </summary>
        /// <param name="_prefab"> Prefab asset reference. </param>
        /// <param name="_callBack"></param>
        /// <returns> False if there is no this prefab type in PoolHandler setup.
        /// True if you setted this type up. </returns>
        private bool InitializeObject(AssetReference _prefab, Action <PoolObject> _callBack)
        {
            PoolObject _poolObject = null;
            int        _poolIndex  = -1;

            if (TryFindPoolObjectDataByAssetReference(_prefab, ref _poolIndex) == false)
            {
                Debug.LogWarning("There is no this prefab type in setup");
                return(false);
            }

            ObjectsRegister _register = objectPools[_poolIndex].Register;

            if (_register.TryGetAvailableObject(ref _poolObject) == true)
            {
                objectPools[_poolIndex].UpdateRegister(_register);
                _poolObject.OnHandlerReturnInvoke += ReturnToPool;
                _callBack?.Invoke(_poolObject);
                _poolObject.GetFromPool(_poolIndex);
                return(true);
            }

            ObjectInstatniationCallback _instatniationCallback = InitializeNewPoolObject;

            InvokeData _invokeData = new InvokeData(_poolObject, _poolIndex, _callBack);

            StartCoroutine(InstantiateObject(_prefab, _instatniationCallback, _invokeData));

            return(true);
        }
        /// <summary>
        /// Initialize all pre-instantiated objects.
        /// </summary>
        private void InitializePools()
        {
            for (int i = 0; i < objectPools.Length; i++)
            {
                if (objectPools[i].InstantiateObjectOnAwake == false)
                {
                    continue;
                }

                for (int j = 0; j < objectPools[i].MaxInstancesAmount; j++)
                {
                    ObjectInstatniationCallback _callback = InitializeNewPoolObjectOnAwake;

                    InvokeData _invokeData = new InvokeData(null, i, null);

                    StartCoroutine(InstantiateObject(objectPools[i].Prefab, _callback, _invokeData));
                }
            }
        }
        /// <summary>
        /// Instantiate prefab and make it as a child.
        /// </summary>
        /// <param name="_prefab"> Prefab to instantiate. </param>
        /// <param name="_callback"> Instantiation callback. </param>
        /// <param name="_invokeData"> Invoke callback. </param>
        private IEnumerator InstantiateObject(
            AssetReference _prefab,
            ObjectInstatniationCallback _callback,
            InvokeData _invokeData)
        {
            AsyncOperationHandle <GameObject> _handle = _prefab.InstantiateAsync(transform);

            while (_handle.Status == AsyncOperationStatus.None)
            {
                yield return(null);
            }

            GameObject _object = _handle.Result;

            PoolObject _poolObject = _object.GetComponent <PoolObject>();

            _invokeData.PoolObject = _poolObject;

            _callback?.Invoke(_invokeData);
        }