2014-03-05 59 views
1

在示例遊戲引擎服務器中,遊戲世界可以由世界對象來表示。遊戲可能有多個遊戲世界,而一個處於世界中的玩家只需要接收該世界中單位的位置數據。如何在C#中正確自動更新一對多雙向關係

class World 
{ 
    public List<Unit> Units { get; set; } 
} 

然而一段代碼也需要能夠查找一個單元是容易什麼世界,所以單位對象本身跟蹤世界參考的。

class Unit 
{ 
    public World World { get; set; } 
} 

這適用於查找,但很快改變時數據當程序員不知道對象之間的關係的事情,所以我在World改變Units成爲問題的是隻讀的,有下面的代碼在Unit

public virtual World World 
{ 
    get { return _world; } 
    set 
    { 
     // Unit must always be in a world 
     Contract.Requires<ArgumentNullException>(value != null); 

     // If already this, don't do anything 
     if (value == _world) return; 

     var oldWorld = _world; 
     _world = value; 

     if(oldWorld != null) oldWorld.UpdateUnitEntry(this); 
     _world.UpdateUnitEntry(this); 
    } 
} 

這可行,但感覺就像有更好的方法來做到這一點。特別是當我添加更多需要以相同方式鏈接的東西時(World也有Structure s和Player s),會有很多重複的功能進來。是否有更好的方法來實現這種一對多關係而無需手動更新雙方?

+0

[codereview.se]也許? – user1306322

回答

0

在像C++這樣的語言中,它沒有這樣複雜的引用管理和GC,無論如何循環引用都是一個問題(例如SharedPtr)。 這也是一個問題,例如遊戲狀態的序列化。

這使我相信可能有更好的方法來處理這個問題。 例如單位真的需要知道他們的世界嗎? 也許看看那些讓你覺得你需要的代碼,也許你可以改變它,這樣就不再需要它了。

所以,也許實現一個實體管理系統,只能通過抽象的ID或句柄來引用你的遊戲實體。在不操作對象之前解析ID /句柄,但沒有實體存儲對另一個實體的引用。 如果你發現自己想要序列化遊戲的狀態,這也會有很大的幫助。

否則:

你在做什麼並不是嚴格的錯誤或任何事情。如果它在工作而不是太多的痛苦,那就保持這樣。

相關問題