静态函数随每个实例更新
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();
}
}
一切都应该按预期工作。
我正在尝试通过脚本在我的 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();
}
}
一切都应该按预期工作。