Factories, serialization and the editor
Hi guys!
I've got a question regarding the project I'm currently working on. I'll try to describe the problem as exact as possible and maybe you can tell me your ideas on that:
I have an environment model, consisting of a Model-class which is responsible for adding and removing objects to the environment representation. These objects are empty GameObjects at first and the Model keeps track of them by storing them in a list. When an object is created, it is put into the appropriate subtree in the hierarchy. Means: If I want to create an object of type "car", it is created in Environment/Cars/Car#.
The actual creation of objects (such as cars) is done by a factory class. In the case of the cars, it is the car factory of course. The car factory gets all data from my data model and when a new car is detected, it is responsible for creating a new car object in the environment model. The object created by the factory now updates itself with it's new position, rotation, etc. by polling the data model until it is destroyed by the factory again.
This is the current state in my project now. The implementation is done so far and its working well.
Every object in the environment model should then be able to have components attached which add different skills to the objects, for example: Visualization of speeds, etc. Because these skills should be configured the same for a single type of object, I want another factory to attach them. Let's say all cars should have a red outline and all pedestrians should have a green. The factory now adds an outline component with configuration "red" to all newly created cars and one with configuration "green" to all pedestrians. For obvious reasons, I want to be able to configure this at a single point in the editor, ideally in the factory creating these objects (the car factory and the pedestrian factory).
To be able to add new components later easily, I don't want to have to implement these things twice: In the actual factory for the module and the factory creating the objects. So here is my idea:
The folder with the modules is scanned by Unity using GetFiles() or some .NET method. For each found class, the public (and serialized) fields, such as color, are somehow received (maybe using reflection) and (here is the difficulty!) automatically listed in all the factories where I can enable the module and configure it.
Example: For the outline module, a checkbox automatically appears in the car and in the pedestrian factory. Enabling the checkbox makes the factory add this module to it's created object. The outline module consists of the field "Color" which can be configured in these factories. I thought about writing a custom property drawer, so I can set the properties for each module.
This means: I have to get all classes in the modules folder and register them somehow in a serialized class which is displayed with a custom property drawer as a field in my factories. Is this even possible? Suggestions how to solve this are deeply appreciated.