private NodeHandle Allocate(PoolObjectFeature featureKey, Node node)
        {
            if (_free.TryGetValue(featureKey, out Stack <NodeHandle> pool) && pool.Count > 0)
            {
                var res = pool.Pop();
                res.node = node;

                // init
                res.gameObject.SetActive(true);
                res.gameObject.hideFlags = HideFlags.None;

                return(res);
            }

            var go = new GameObject();

            var nh = go.AddComponent <NodeHandle>();

            nh.node       = node;
            nh.featureKey = featureKey;



            return(nh);
        }
        private NodeHandle CreateNodeHandle(Node node, PoolObjectFeature feature)
        {
            var nodeHandle = Allocate(feature, node);

            nodeHandle.name = node.GetName();

            if (string.IsNullOrEmpty(nodeHandle.name))
            {
                nodeHandle.name = node.GetType().Name;
            }

            return(nodeHandle);
        }