该怎么样用C++来实现类Unity3d的AddComponent
2015-04-25 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517184
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
首先介绍1下Unity 的1些原理:
(1) 我们编写1个类继承自MonoBehavior ,然后添加 Start 、Update 这些函数。但是这些函数实际上是私有的,其实不是从MonoBehavior中继承而来,那这几个函数是在哪里调用的?
Unity中通过反射来判断1个类中有无对应的函数,引自知乎中的1个回答:
Unity的确是通过反射来调用脚本的方法的,并且这1进程会在运行时不停对所有MonoBehaviour遍历进行。 Unity之所以统1地使用这1套固定的函数命名方案,便于明确地划出了每一个函数需要做些甚么。 这样做的目的我猜想是有益用保存脚本的灵活性。 这类做法被惯称为“事件机制”,1旦某个脚本被履行完成以后,它的控制权会重新回到调度管理处,可以轻松地再去履行下1个, 并且也能在运行时通过反射方式让其它脚本使用Component.SendMessage进行调用。 如果采取了抽象方式让子类去实现这样的方法,那末对Unity本身的对象管理是没有任何好处的,并且对具有多个脚本组件的对象来讲,保护本钱不但增加了, 还可能让脚本之间的管理变得混乱。 使用反射或许会丢失1些性能,但却能让每一个不同的MonoBehaviour之间看起来都是独立的,只需要在它提供的几个内置方法中关注自己的逻辑就能够了。
那 C++ 呢?C++判断类是不是有某个函数不好弄,所以还是采取继承的方式来简单实现 AddComponet 。
这类方法的关键就是如何使用类名来创建类实例。
其中1种方式就是 , 让通过类名实例化的类 继承自 基类 ,然后通过静态函数在程序最开始运行的时候,向基类注册,然后在调用 AddComponet 的时候,通过基类的函数在最开始注册的子类中寻觅是不是有对应名字的子类,如果有的话就实例化子类。
终究简单实现Unity3d中的AddComponet 函数。
int main() { GameObject* obj=new GameObject("Cube"); NewMonoBehaviour* newmono=(NewMonoBehaviour*)obj->AddComponent("NewMonoBehaviour"); MyMonoBehaviour* mymono=(MyMonoBehaviour*)obj->AddComponent("MyMonoBehaviour"); for (int i=0;i<obj->m_componentVec.size();i++) { std::pair<string,Component*> compmap=obj->m_componentVec[i]; MonoBehaviour* mono=(MonoBehaviour*)compmap.second; mono->Awake(); } system("pause"); return 0; }
(1) 我们编写1个类继承自MonoBehavior ,然后添加 Start 、Update 这些函数。但是这些函数实际上是私有的,其实不是从MonoBehavior中继承而来,那这几个函数是在哪里调用的?
Unity中通过反射来判断1个类中有无对应的函数,引自知乎中的1个回答:
Unity的确是通过反射来调用脚本的方法的,并且这1进程会在运行时不停对所有MonoBehaviour遍历进行。 Unity之所以统1地使用这1套固定的函数命名方案,便于明确地划出了每一个函数需要做些甚么。 这样做的目的我猜想是有益用保存脚本的灵活性。 这类做法被惯称为“事件机制”,1旦某个脚本被履行完成以后,它的控制权会重新回到调度管理处,可以轻松地再去履行下1个, 并且也能在运行时通过反射方式让其它脚本使用Component.SendMessage进行调用。 如果采取了抽象方式让子类去实现这样的方法,那末对Unity本身的对象管理是没有任何好处的,并且对具有多个脚本组件的对象来讲,保护本钱不但增加了, 还可能让脚本之间的管理变得混乱。 使用反射或许会丢失1些性能,但却能让每一个不同的MonoBehaviour之间看起来都是独立的,只需要在它提供的几个内置方法中关注自己的逻辑就能够了。
那 C++ 呢?C++判断类是不是有某个函数不好弄,所以还是采取继承的方式来简单实现 AddComponet 。
这类方法的关键就是如何使用类名来创建类实例。
其中1种方式就是 , 让通过类名实例化的类 继承自 基类 ,然后通过静态函数在程序最开始运行的时候,向基类注册,然后在调用 AddComponet 的时候,通过基类的函数在最开始注册的子类中寻觅是不是有对应名字的子类,如果有的话就实例化子类。
终究简单实现Unity3d中的AddComponet 函数。
int main() { GameObject* obj=new GameObject("Cube"); NewMonoBehaviour* newmono=(NewMonoBehaviour*)obj->AddComponent("NewMonoBehaviour"); MyMonoBehaviour* mymono=(MyMonoBehaviour*)obj->AddComponent("MyMonoBehaviour"); for (int i=0;i<obj->m_componentVec.size();i++) { std::pair<string,Component*> compmap=obj->m_componentVec[i]; MonoBehaviour* mono=(MonoBehaviour*)compmap.second; mono->Awake(); } system("pause"); return 0; }
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询