静态函数随每个实例更新

Static Function gets updated with each instances

我正在尝试通过脚本在我的 Unity3d 游戏中实现一些对象。 它们看起来像这样:

public class Building: 
    public int _id;
    public int _level; 

    public Building(int id)
    {
        this._id = id;
        this._level = 0;
    }

    public void UpdateLevel(int target)
    {
        if (target > this._level)
        {
            this._level = target;
        }
    }

地图的每个方块一次只能有一个建筑物。每个图块都有自己的 属性 Build 可以更改。它是在其他脚本上使用静态字典初始化的,如下所示:

脚本:建筑类型

public static Dictionary<int, Building> Types = new Dictionary<int, Building>
{
   { 0, new Building(0) },
   { 10, new Building(10) }
}

脚本:平铺

public class Tile : MonoBehavior
{
    Building Build;
    Vector3 coordinates;
    
    public Tile (Vector3 coord)
    {
        this.coordinates = coord;
        this.Build = BuildingType.Types[0];
    }
}

我的问题是,每次我在特定 Tile 上调用 UpdateLevel 方法时,静态词典也会更新。

例如 有一个按钮可以将建筑物升级到下一个级别。按下时它会调用 UpdateLevel 方法。之后,此建筑物的静态字典条目也更新为新值

> BuildingType.Types[0]._level;
>>> 0

**clicks on button to upgrade the building**
> Tile.Build.UpdateLevel(2);

> BuildingType.Types[0]._level;
>>> 2 

我知道每个运行静态变量只有一个'instance',但我不明白在这种情况下它是如何更新的。我想为每个瓷砖都有一个固定的建筑预设,并能够独立更新它们。有什么办法可以防止这种情况发生吗?

谢谢

发生这种情况是因为 Building 是引用类型。

这意味着当将它分配给不同的变量时,您并没有像使用整数那样创建一个新变量, 您只是将找到变量的位置传递给其他位置。所以分配给瓷砖的建筑物是 同一个字典。

现在有很多方法可以解决这个问题,但我认为这是最简单的。

public class Building : ICloneable
{

    public int _id;
    public int _level;

    public Building(int id)
    {
        this._id = id;
        this._level = 0;
    }

    public object Clone()
    {
        return this.MemberwiseClone();
    }

    public void UpdateLevel(int target)
    {
        if (target > this._level)
        {
            this._level = target;
        }
    }
}

现在你可以在不选择原件的情况下获得建筑物的副本。所以只需像这样更新您的 Tile class:

public class Tile : MonoBehavior
{
    Building Build;
    Vector3 coordinates;
    
    public Tile (Vector3 coord)
    {
        this.coordinates = coord;
        this.Build = (Building) BuildingType.Types[0].Clone();
    }
}

一切都应该按预期工作。