I formerly wrote for Unity, but have decided to come to unreal, mostly because I do not like Unity’s object management. Unfortunately, a lot of the architecture I used to use is now entirely useless. Not just because its in the wrong language or not set up for Unreal’s API yet, but because it conceptually impossible to my knowledge in C++.
A lot of what I wrote in Unity was centered around delegates and Interfaces galore. The example of which I am most proud is the [FONT=courier new]Affliction class which was totally dynamic and flexible. At every point along the pipeline, every portion of the game was entirely ignorant. Each component knew the absolute minimum needed to function, and that was all.
The [FONT=courier new]Affliction represented all status effects on the character at any given time. They would be passed through the [FONT=courier new]Afflict(Affliction affliction) method inherited from [FONT=courier new]IAfflictable. The method would then add the affliction to a [FONT=courier new]List<Affliction> of afflictions on the Character, the character would generate an anonymous method to remove the [FONT=courier new]Affliction from the list, and then assign that to its [FONT=courier new].OnExpire() delegate. Lastly the [FONT=courier new]OnStart() and [FONT=courier new]OnProc() [FONT=arial, helvetica, sans-serif]Delegates would be called and their co-routine started respectively. As a result, the object which assigned the affliction has complete event access to when the Affliction Ticks, Expires, Starts, and everything else about it along the way to extrapolate any data it needs.
For example, when the [FONT=courier new]Affliction was instantiated by something like an AoE Slow [FONT=courier new]Spell, the [FONT=courier new]SpellEffect class has no need to be aware of who or how the [FONT=courier new]IAfflictable handled the [FONT=courier new]Affliction. It doesn’t need to know the name of the list where it stored it, and no kind of recursive checking of said list is ever needed. Because the [FONT=courier new]Affliction was created by the [FONT=courier new]AoESlowSpell, it can assign the [FONT=courier new]affliction.Expire to the [FONT=courier new]OnTriggerExit(Character) when it leaves the space. Total and absolute separation of concern, with no conflicting references or double assignments, while still making everything accessible and readable from all conceivable relevant scopes.
The issue I now encounter in C++ is I have no idea how to recreate this type of flexibility and dynamic behavior. I have no idea where to go from here, oddly the best sounding answer so far is to write in C# and have my code push data to a barebones C++ setup which listens on a Stream coming over some local port. While doable, this osunds like a lot of work, any suggestions on porting over my architecture to C++ so i can maintain the same streamlined quality?