In your case shared ownership is what makes sense:
std::unique_ptr<Resource> resource;
Resource* resource_ptr = resource.get();
resourceManager.add(std::move(resource));
resource_ptr->doStuff();
You are passing the pointer on to the manager but than calling an operator on the underlying object outside the resource manager... that is plain bad, for all you know resource_ptr might now be a pointer to garbage since ressourceManager destroyed the unique_ptr you moved into it.
With shared ownership:
std::shared_ptr<Resource> resource;
resourceManager.add(resource);
resource->doStuff();
You are 100% guaranteed that resource is still there when you call "doStuff"... well, unless you cast the shared_ptr to a raw one and delete it in resourceManager, but that would be bad practice.
People will often say uniq_ptr is prefered over share_ptr because using uniq_ptr leads to better design (e.g. not having a RessourceManager class but also managing resources outide of it :P...) however a good rule of thumb to go by is asking yourself:
"Do I need to get a raw pointer from this smart pointer at any point in time ?" If the answer is yes, you are likely using the wrong smart pointer, since casting it to a raw pointer invalidates all safety guards the smart pointer has in place to help you write predictable code.