How would i create a database of attacks for an RPG?

Hey all, for the previous few days ive been theorycrafting an RPG system for a game i want to make. I don’t actually have any of this written out in code yet, so here is my issue. I want to create a database of different “Skills” the player can use on their turn, such as healing powers, magic attacks, etc. And i thought of it working something along these lines:

-The player selects the skill to use and its target
-This would search the database for the skill in question and retrieve information on it, such as base damage, element, flavor text etc.
-All of this information would then be fed to a DamageCalc function, which would handle the rest of the calculations from there.

The problem comes in that second step. I can’t come up with a decent way to create a database. I thought of creating a class called “Skill” containing info about the skill in the form of variables and then making a Database script with an array of the skill class, and customizing each of those from within the editor. But i realized from making an array of custom classes a while ago that this would not work because while you can indeed make an array of custom classes in your script, you can not, to my knowledge, edit the contents of each individual class within the array, simply which classes are in the array.

as seen here: an array of a custom class named unit which contains several variables involving names, stats, etc. it does not allow for customization of each object within the array, but rather expects slots to be filled with pre-made objects of that class. Placing the script which makes the unit itself allows for customization, but an array will not. I don’t want to make an individual script inheriting from the skill class for each individual skill, because that would be cumbersome, and i am certain there is a better way to do this.

So, I probably wouldn’t want to try to do this within the inspector. More on that in a moment. If I had to do this all using objects with an inspector, I would create a ScriptableObject base class that has all of the properties you want. Then you can create instances of those, one per attack type. And then, instead of placing these into some array, I’d probably find all of them via asset lookup using Addressables or AssetBundles.

But, I don’t think I’d create assets for this. That sounds nice, in theory, to be able to add new attacks by creating assets for the attacks. But my fear would be that somewhere down the line, I’ll want to refactor the class that stores all of this data. I’ll want to rename a field, or change the structure in some way. If these are all saved as assets, all that data gets lost* if you change the structure of the scriptable objects. (* The data is technically still in the asset files, but it’s a burden to migrate into the new structure.) Compare that to the refactoring ease of creating a static class of Attacks, all defined in code. I guess it depends on how many attacks there might be, but beyond a certain number I just wouldn’t feel comfortable having that all in assets. This approach would definitely make certain things more difficult, though, like referencing an image asset within the process, so some level of indirection would be needed, and this approach might not be so attractive anymore.

Anyway, just something to consider.