亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

修改另一個腳本中的變量

修改另一個腳本中的變量

C#
犯罪嫌疑人X 2023-09-16 17:15:14
我目前正在為 Unity 創建一個包含許多變量的 C# 腳本,并且我希望這些變量可以從其他腳本中更改。為此,我目前編寫了一個函數,該函數詢問變量的名稱(作為字符串),然后對每個變量使用 switchcase。public string charName;public int currentHP;public int maxHP = 100;public int strength;public int defense;public void ChangeValue(string valueToChange, int howMuch){    switch (valueToChange)    {        case "currentHP":            currentHP += howMuch;            break;        case "maxHP":            maxHP += howMuch;            break;        case "strength":            strength += howMuch;            break;        case "defense":            defense += howMuch;            break;    }}有更有效的方法嗎?switch case 看起來效率很低,每次我想向腳本添加新變量時都需要修改它。對我來說最完美的事情是詢問變量作為參數,但我無法找到一種方法來做到這一點。感謝您的時間 !
查看完整描述

2 回答

?
猛跑小豬

TA貢獻1858條經驗 獲得超8個贊

由于您的用例實際上是在每次設置值時執行特定行為,因此我建議最好使用Properties。有兩種選擇,具體取決于您的需要一些示例

// Auto property which doesn't have any behavior

// read and write able

public string charName { get; set; }


// read only property

public int currentHP { get; private set; }


// read only property with a backing field

private int _maxHP = 100;

public int maxHP

{

? ? get { return _maxHP; }

}


// same as before but as expression body

private int _strength;

public int strength { get => _strength; }



// finally a property with additional behaviour?

// e.g. for the setter make sure the value is never negative?

private int _defense;

public int defense

{

? ? get { return _defense; }

? ? set { _defense = Mathf.Max(0, value); }

}

正如您所看到的,屬性在某種程度上取代了 getter 和 setter 方法,在某些情況下甚至充當字段的角色(自動屬性)。在 getter 和 setter 中,您都可以實現其他行為。一旦你這樣做了,你就必須使用支持字段。


例如,您可以像字段一樣使用和訪問它們


someInstance.defense += 40;

執行兩者,首先執行 getter 以便了解 的當前值_defense,然后添加40并使用 setter 將結果寫回到_defense。


作為替代方案并且更接近您原來的方法是如上所述的Dictionary。我會把它與適當的結合起來,enum例如


public enum ValueType

{

? ? MaxHP,

? ? Strength,

? ? Defense,

? ? CurrentHP

}


private Dictionary<ValueType, int> Values = new Dictionary<Value, int>

{

? ? {ValueType.MaxHP, 100},

? ? {ValueType.Strength, 0 },

? ? {ValueType.Defense, 0 },

? ? {ValueType.CurrentHP, 0 }

};


public void ChangeValue(ValueType valueType, int value)

{

? ? Values[valueType] += value;


? ? // do additional stuff

}

將該方法要控制的值添加到enum和 的開銷最小Dictionary。


查看完整回答
反對 回復 2023-09-16
?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

如果變量是公共的,您可以直接更改另一個腳本中的變量值。


假設你有一個玩家對象:


class Player : MonoBehaviour {

    public int currentHP;

    public int maxHP = 100;

}

您可以從另一個類訪問這些值,如下所示


class Enemy : MonoBehaviour {


    public Player player;


    void Start() {

        player.currentHP -= 10;

    }


}

您只需player在 Unity 編輯器中將其拖放到(在本例中)Enemy腳本上即可進行分配。


查看完整回答
反對 回復 2023-09-16
  • 2 回答
  • 0 關注
  • 215 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號