我正在嘗試通過腳本在我的 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
可以更改的屬性。它是在其他腳本上使用靜態字典初始化的,如下所示:
腳本:BuildingType
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];
}
}
我的問題是,每次我呼叫UpdateLevel
特定Tile
靜態字典上的方法時,也會更新。
例如 ,有一個按鈕可以將一個建筑物升級到下一個級別。按下時它會呼叫該UpdateLevel
方法。之后,該建筑物的靜態字典條目也更新為新值
> BuildingType.Types[0]._level;
>>> 0
**clicks on button to upgrade the building**
> Tile.Build.UpdateLevel(2);
> BuildingType.Types[0]._level;
>>> 2
我知道靜態變數每次運行只有一個“實體”,但我不明白在這種情況下它是如何更新的。我想為每個圖塊設定一個固定的建筑預設,并能夠獨立更新它們。有什么辦法可以防止這種情況發生嗎?
謝謝
uj5u.com熱心網友回復:
發生的事情是因為 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 類:
public class Tile : MonoBehavior
{
Building Build;
Vector3 coordinates;
public Tile (Vector3 coord)
{
this.coordinates = coord;
this.Build = (Building) BuildingType.Types[0].Clone();
}
}
一切都應該按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/475315.html
上一篇:獲取具有反射的實體時如何包含值?