該怎么樣用C++來實現類Unity3d的AddComponent
來源:程序員人生 發布時間:2015-04-15 09:08:25 閱讀次數:3478次
Unity3d 愈來愈完善,朝著它學習的人也愈來愈多。1是由于Unity3d是1整套開發工具,使用起來簡單快捷。2是 Mono C#的快速開發上手簡單。
在Unity編輯器中,添加1個GameObject , 然后把1個繼承自MonoBehavior的腳本拖到GameObject上,便可對GameObject進行操作。或在代碼中new 1個GameObject,然后用AddComponet 掛載1個腳本到GameObject上。
AddComponet 這個函數,可以通過傳遞 String 來實例化1個類。該如何用C++來實現類似的功能呢?
首先介紹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;
}
代碼下載:
http://pan.baidu.com/s/1i3rcYPZ
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈