There are usually two possible explanations for this:
The simple one is that it’s being included indirectly because it’s included by something you are including.
The more complicated explanation involves the unity build (nothing to do with Unity the engine ) which doesn’t build source directly, but combines cpp files into larger cpp and compiles those instead. Some of the reasons for this include build time, link time and other optimizations during compilation. The downside is that it can really mess with your builds because it’s an automated process. You can be building just fine, edit A.cpp and suddenly B.cpp will have a compile error because of a missing include because B was getting one of it’s includes from another cpp in the unity source file but B is now in a different unity file or it’s been re-ordered!
Ultimately, if it compiles you don’t really have to worry about it. If you add includes for IWYU pre-emptively it doesn’t matter since everything is "#pragma once"d and including the same thing from different places won’t matter. If you don’t include a header and don’t get a compile error, there’s no real harm, you may just have to include it later when you get a mysterious compile error about using an unknown type. If this is a solo project, you’re probably fine with the latter. In a team environment I recommend an automated build process that builds the project with the unity option disabled, so like a more conventional C++ program. I think I saw a GDC talk from the Fortnite team and they were doing this as well (which made me feel good for advocating for it at work before seeing that video).