Thank you for your help and suggestions.
My biggest question is which approach do you think would best suit an online multiplayer environment?
I have limited experience with coroutines and even less with async tasks as I have always found both confusing. I will try learning more about them.
Iāve never heard of UniTask or Awaitables. I assume they are more recent additions/features?
My initial thought on the approach is similar to yours, that being creating an Action class with an execution method and any parameters as variables for this method, and an ability class/scriptable object which contains a list of actions and all the parameters for each action to pass onto them. Understanding and conceiving the exact implementation is the biggest struggle and has made me doubt my understanding and capabilities.
I have worked with scriptable objects a decent bit and the thought crossed my mind of actions being a scriptable object, inside of an ability scriptable object. Although, the idea sounds redundant and not very effective (to me at least).
As you mentioned, passing the information to an action (ex. damage/distance/duration) is likely the most difficult part, especially when every ability is made to be modular. Therefore, every ability will need to store information somewhat differently based on the actions it uses, unless there is a better method of handling this data.
If there is a way for a class to dynamically contain more information while directly associating it with something (ex. an integer for damage is somehow dynamically added and associated to an action when it is added), that would be ideal, but to my understanding, that is not possible or would require A LOT of work to pull off, well above my capabilities.
I donāt think information such as target objects/layers will be a big issue. Characters casting the abilities can find what layer they are on and based on that, target the layer of the opposing team, or a similar process.
I do believe this project would benefit greatly from a flexible and modular system like this. Many abilities are planned to be made, upwards of 50 and likely over 100. Additionally, some team members would either struggle greatly or lack the skills needed to āhard codeā every ability. This pseudo-drag-and-drop or building-block style would be much easier to understand and design with and can be used in other projects, especially when paired with an editor UI.