很多时候,如果在做引擎的时候,不考虑编辑器怎么做,将来会是一件极其痛苦的事情。
简单的举例如下:
1. 很多物体有很多的属性要编辑,比如粒子系统的发射器属性,效果器属性。这些大量的属性,如果你没有一套很好的机制来描述的话,做编辑器的时候,将会是灾难。
2. 很多时候,引擎的扩展性带来得一个问题是,物体的类型是未知的,如何在编辑器里做编辑?比如你的粒子系统的发射器类型未知,效果器未知(都是可以扩展的嘛),这些未知的物体有未知的属性。另外,材质系统中,shader参数(不同的 shader有不同的参数)的编辑等等。
如果说1是还可以补救的灾难,那么问题2就是无法解决的。
在C#中,可以采用property的方式,给物体暴露出property就可以了。这个property可以被property grid控件直接识别。
但是在 C++中没有property关键字。但是我们可以自己实现一个。
具体实现注意以下几个事情:
1. 如果没人用到属性系统,就不要去创建它。就是说默认的对象没有属性系统的,只有有人要使用该对象的属性系统的时候,才会创建Property的实例。
2. 描述性尽量强大一些。我的引擎采用xml辅助来描述。
3. 尽量使用的时候简单一些,比如Property->setValue() 就能直接改变物体的属性。
4. 消息通知机制, setValue完后,可以采用一定的方式通知 物体本身,对属性的修改做出反应。
5. 将这套Property系统和一个控件链接起来,默认只要把Property对象丢给控件,就可以自动显示了。