Modern system should have no problem handling 20000 objects that can potentially collide (Sweep and Prune algorithm), however, I’m not sure how would I go about handling network load in this case and I’d expect PhysX to already do something like that.
The reason why I asked kamrann about collisions and invisible object removal is because that’s area of the engine I have not properly investigated yet. For example, if physics and occlusion is decoupled from AActor, you might get away with using one AActor-based class for all projectiles. However, if occlusion is handled on AActor level and not on, say, component level, then you’ll hit lots of trouble if you do that. You could end up trying to draw lots of invisible objects, for example, and you might end up reimplementing lots of physx-related stuff that already exists in the engine.
Either way, I think the easiest way to go about it is probably forking engine, and moving some of the private methods into “protected” section of the AActor. Maintaining your own fork might be a hassle, but hey, at least you’ll have full control in that situation.