2017-06-18 140 views
1

我試圖在XNA中構建一個很受Unity啓發的簡單遊戲引擎。我目前的工作是可以附加到gameobjects的組件。我有像「PlayerController」和「Collider」這樣的類,它們是組件,因此繼承自Component類。從System.Type變量創建類的實例

我試圖創建方法試圖需要一個組件時相比,可以增加取決於類型參數的新組件,例如:

public void RequireComponent(System.Type type) 
{ 
    //Create the component 
    Component comp = new Component(); 
    //Convert the component to the requested type 
    comp = (type)comp; // This obviously doesn't work 
    //Add the component to the gameobject 
    gameObject.components.Add(comp); 
} 

例如,剛體組件需要遊戲對象有一個對撞機,所以它需要碰撞組件:

public override void Initialize(GameObject owner) 
{ 
    base.Initialize(owner); 

    RequireComponent(typeof(Collider)); 
} 

這可以做或有沒有更好的辦法?

回答

2
public void RequireComponent(System.Type type) 
{ 
    var comp = (Component)Activator.CreateInstance(type, new object[]{}); 

    gameObject.components.Add(comp); 
} 

但是,如果你發現自己傳遞的編譯時間常數,例如typeof(Collider),您不妨這樣做:

public void Require<TComponent>() where TComponent : class, new() 
{ 
    gameObject.components.Add(new TComponent()); 
} 

,並調用它像這樣:

Require<Collider>(); 

而不是第一個版本:

RequireComponent(typeof(Collider)); 
+0

謝謝,你的解決方案真的幫助我。它不僅解決了當前的問題,而且還爲我解決了大量的想法提供了方法。 –

1

要給予Type對象時使用Activator類回答你的問題,得到一個對象的最簡單的方法:

public void RequireComponent(System.Type type) 
{ 
    var params = ; // Set all the parameters you might need in the constructor here 
    var component = (typeof(type))Activator.CreateInstance(typeof(type), params.ToArray()); 
    gameObject.components.Add(component); 
} 

不過,我想這可能是一個XY problem。據我所知,這是您在遊戲引擎中實現模塊化的解決方案。你確定這是你想要做的嗎?我的建議是,在決定採用何種方法之前,需要花點時間閱讀多態和相關概念,以及如何將這些概念應用於C#。