1

在示例游戏引擎服务器中,游戏世界可以由 World 对象表示。游戏可能有多个游戏世界,一个世界中的玩家只需要接收该世界中单位的位置数据。

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

然而,一段代码还需要能够轻松地查找一个单元所在的世界,因此单元对象本身会跟踪世界引用。

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

这适用于查找,但是当程序员不知道正在发生的对象之间的关系时更改数据时很快就会出现问题,因此我将其更改UnitsWorld只读并在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);
    }
}

这行得通,但感觉有更好的方法来做到这一点。特别是当我添加更多需要以相同方式链接的东西时(aWorld也有Structures 和Players),会出现很多重复的功能。有没有更好的方法来实现这种一对多的关系,而无需手动更新双方?

4

1 回答 1

0

在像 C++ 这样没有如此复杂的引用管理和 GC 的语言中,像这样的循环引用无论如何都是一个问题(例如 SharedPtr)。这对于例如游戏状态的序列化也是问题。

这使我相信可能有更好的方法来解决这个问题。例如,这些单位真的需要了解他们的世界吗?也许看看那些让你认为你需要它的代码,也许你可以改变它,不再需要它。

因此,也许实现一个实体管理系统,并且只通过抽象 ID 或句柄引用您的游戏实体。在没有对象之前解析 ID/句柄,但没有实体保留对另一个实体的引用。如果您发现自己想要序列化游戏的状态,这也将有很大帮助。

否则:

你正在做的事情并不是完全错误或任何事情。如果它正在工作并且不是太痛苦,那就保持这样。

于 2014-09-08T14:19:45.490 回答