When your levels are defined in sourcecode, then you can't add more levels without releasing a new version of the complete game build. So instead of hardcoding your level setups, move the layout of each level to a file in a format of your choice.
You can then download those files from a webserver when your game starts using the WWW
class.
In order to not having to download all the levels again and again on each game restart, the game should store any already downloaded level on the hard drive. I would recommend to first download a text file which lists all the available level files. Check which files are already on the local hard drive, and then download only the missing ones with additional WWW requests. But keep in mind that not all the build targets supported by Unity allow filesystem access. If you want to publish for the platforms which don't support it, you need to find a different solution.
The only persistent storage system which is guaranteed to work everywhere is PlayerPrefs
. But this system is designed to hold a handful of configuration keys. It's not designed to hold large amounts of data.
If your distribution channel supports incremental updates of game assets, you can might also be able to use these to only update the level file(s).
Another side-effect of having levels in form of files is that it allows your community to create their own levels. An active community of level designers can be great for you. It means your game gets a constant stream of more and more content and you don't need to pay a cent for that. The downside is that you will now have a harder time to sell more levels in form of DLC, because your new levels compete with the free levels provided by the community. But you still have the advantage that only you can release DLC which adds new game features.
Asset Bundles
: docs.unity3d.com/Manual/AssetBundlesIntro.html \$\endgroup\$ – Galandil Mar 14 '18 at 22:39