Like everything else (graphics, multiplayer, AI, etc.), it’s all about data management, isn’t it. There are two facets of data management, often in opposition: how humans work with the data and how algorithms work with the data.
You don’t want your algorithm to loop through the entire tile list every time your procedural generator needs to select a new tile for the map. If you only have a few tiles, this might be fine. But if you have hundreds of tiles it could really drag down performance. Depending on your generation algorithm, each tile could have references to other tiles that are allowed to connect to it, with conditions and/or probabilities. You could even have an additional data structure that defines the general attributes of a region larger than a tile, such as a choke point made of a 9x9 block of tiles that meet certain criteria. It takes a little more memory to store this metadata, but it can make it faster to generate maps on the fly.
All this would be a major pain for you to define by hand. You could write a preprocessor to generate that tile metadata based on attributes that you’ve set up. For example, say you’ve defined a Mud tile with this metadata: movement speed 50%, connects to the same type of file 60% of the time, connects to an open tile 80% of the time, contains a monster 5% of the time. Your preprocessor could automatically find all other tiles that meet these criteria and add it to this tile’s list of possible connections. If that’s too much data, you could instead generate lists by attribute (e.g., open tiles) and reference those lists instead.
I like to manage data all in Unity when possible. A custom editor would be great for this, either a custom editor for your scriptable object class or a more general editor that lets you manage all of your tiles in one window.
However, you can probably find plenty of people who’d prefer to manage the data in an Excel spreadsheet. You could have a row for each tile. Then just export it as CSV and process it to generate your tile metadata.
I have a question: when you say you have a bunch of scriptable objects, are they all using the same script? Have you considered using prefabs instead? They’d probably work really well for this. In either case, I recommend pooling your objects. Don’t instantiate scriptable objects or prefabs when you need them. Instead, keep reusable pools of instantiated objects in memory instead.