Итак, основная проблема здесь: int
- это тип Value , а не ссылочный тип!
Таким образом, после добавления его в словарь вы, скорее всего, захотите получить только значение из словаря, а не из поля.
например,
Debug.Log(MyDictionary[MyEnum.Speed]);
вместо
Немного более "безопасный" и убедитесь, что никто снаружи не может редактировать словарь напрямую - это только предоставить значение с помощью метода получения, например:
public enum MyEnum {Speed, Intelligence, Strength, Agility}
public class Player
{
// Use these ONLY as the initial value but later they have no function anymore!
private int initialPlayerSpeed = 1;
private Dictionary<MyEnum, int> MyDictionary = new Dictionary<MyEnum, int>();
public void InitializeOrReset()
{
MyDictionary[MyEnum.Speed] = initialPlayerSpeed;
}
public bool ChangePlayerStat(MyEnum whatStatDoYouWantToChange, int howMuch)
{
// Note that "MyEnum.whatStatDoYouWantToChange" would not be valid c# here!
if (MyDictionary.ContainsKey(whatStatDoYouWantToChange))
{
MyDictionary[whatStatDoYouWantToChange] += howMuch;
return true;
}
Debug.LogWarning($"No Stat with key {whatStatDoYouWantToChange} exists in dictionary");
return false;
}
public bool TryGetValue(MyEnum whatStatDoYouWantToGet, out int result)
{
result = int.MinValue;
return MyDictionary.TryGetValue(whatStatDoYouWantToGet, out result);
}
}
, а затем использовать его, например,
if(player.ChangePlayerStat(MyEnum.Speed, 99))
{
Debug.Log("Successfully update stat MyEnum.Speed");
if(player.TryGetValue(MyEnum.Speed, out var result))
{
Debug.Log($"=> New Value is {result}");
}
}
Альтернатива использованию Метод getter будет свойством, упомянутым в Enigmativity (хотя это решение выдает исключения, если их ключ по какой-то причине не существует;))