Общий метод для изменения значения приватных переменных в классе

Рейтинг: -1Ответов: 1Опубликовано: 08.05.2023

Пишу систему сохранения в игре. Создал класс, где хранятся все необходимые и используемые в игре переменные (различных типов). Переменные, естественно, все приватные. Так вот в чем суть вопроса: для изменения значений этих переменных внутри класса необходимо создавать методы, в которых указанные параметры будут принимать указанные значения, чтобы их можно было изменять в других классах, и под каждую переменную нужно прописать свой отдельный метод - а нельзя ли сделать один "шаблонный" метод, куда отправлять, скажем, название переменной и ее значение и присваивать там и назначать все соответственно? Или ничего так не получится и нужно писать миллион методов (по количеству используемых переменных в игре) без вариантов?

Приведу пример:

//Мы хотим изменить значение переменной param1, (который отвечает за силу) в основном классе (приведен дальше ниже) из этого класса:
public class Someclass
{
    int param1; (отвечает за силу, например)
    string param2;

    //Отправляем переменную в метод основного класса чтобы ее значение там изменилось
    ChangeValues(param1, param1.name);
}

//Есть основной класс и в нем находятся переменные и методы
public class Mainclass
{
    //Переменные различных типов, используемые в игре
    int param1 { get; private set; } //Отвечает за силу
    string param2 { get; private set; }

    //Пишем так званый Общий метод для изменения переменных
    public ChangeValues(param, param.name)
    {
        param.name = param;
    }

}

Код, естественно, с ошибками - я просто попытался донести в таком виде логику происходящего, чтобы было понятнее (надеюсь). У кого какие варианты будут? Или я зря трачу время и лучше бы потратил его на написание методов?

Ответы

▲ 0

Интерфейс для сохранения:

public interface ISaveLoad
{
    void Save(ISerialization serialization);
    void Load(IDeserialization deserialization);
}

Для сохранения/загрузки данных:

public interface ISerialization
{
    void SaveInt(int value);
    void SaveFloat(float value);
    void SaveVector3(Vector3 value);
}

public interface IDeserialization
{
    int LoadInt();
    float LoadFloat();
    Vector3 LoadVector3();
}

Реализуешь интерфейс ISaveLoad в том месте, где нужно сохранить поля объекта

public class Character : ISaveLoad
{
    private float _power;
    private int _level;
    private Vector3 _position;
        
    public void Save(ISerialization serialization)
    {
        serialization.SaveFloat(_power);
        serialization.SaveInt(_level);
        serialization.SaveVector3(_position);
    }

    public void Load(IDeserialization deserialization)
    {
        _power = deserialization.LoadFloat();
        _level = deserialization.LoadInt();
        _position = deserialization.LoadVector3();
    }
}

В методе сохранения игры проходишься по всему, что нужно сохранить, вызываешь Save. В методе загрузки вызываешь Load.

Куда и как сохранять данные (ISerialization/IDeserialization) решай сам, хоть в playerprefs, хоть json, хоть в бинарном виде.