Advertisement
waygeek

MVVM parssing

Jan 16th, 2024 (edited)
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.46 KB | Software | 0 0
  1. public class ReactiveProperty<T>
  2. {
  3.     public event Action<T> OnChanged;
  4.  
  5.     private T _value;
  6.  
  7.     public T Value
  8.     {
  9.         get => _value;
  10.         set
  11.         {
  12.             _value = value;
  13.             OnChanged?.Invoke(_value);
  14.         }
  15.     }
  16. }
  17.  
  18. [Serializable]
  19. public class StatsModel
  20. {
  21.     public readonly ReactiveProperty<int> STR = new ReactiveProperty<int>();
  22.     public readonly ReactiveProperty<int> INT = new ReactiveProperty<int>();
  23.     public readonly ReactiveProperty<int> DEX = new ReactiveProperty<int>();
  24.  
  25.     public int StatsAvailable;
  26.  
  27.     public StatsModel()
  28.     {
  29.         STR.Value = 0;
  30.         INT.Value = 0;
  31.         DEX.Value = 0;
  32.         StatsAvailable = 10;
  33.     }
  34. }
  35.  
  36. public class StatsView : MonoBehaviour
  37. {
  38.     private StatsViewModel _statsViewModel;
  39.  
  40.     [SerializeField] private TextMeshProUGUI _STRValText;
  41.     [SerializeField] private TextMeshProUGUI _INTValText;
  42.     [SerializeField] private TextMeshProUGUI _DEXValText;
  43.     [SerializeField] private TextMeshProUGUI _statsAvailableText;
  44.  
  45.     [SerializeField] private Button _addSTRButton;
  46.     [SerializeField] private Button _addINTButton;
  47.     [SerializeField] private Button _addDEXButton;
  48.  
  49.     [SerializeField] private Button _resetButton;
  50.     [SerializeField] private Button _submitButton;
  51.  
  52.     [SerializeField] private Button _saveButton;
  53.     [SerializeField] private Button _loadButton;
  54.  
  55.     public void Init(StatsViewModel statsViewModel)
  56.     {
  57.         _statsViewModel = statsViewModel;
  58.  
  59.         _statsViewModel.STRView.OnChanged += DisplaySTRView;
  60.         _statsViewModel.INTView.OnChanged += DisplayINTView;
  61.         _statsViewModel.DEXView.OnChanged += DisplayDEXView;
  62.  
  63.         _statsViewModel.StatsAvailableView.OnChanged += DisplayStatsAvailable;
  64.  
  65.         _statsViewModel.STRButtonEnabled.OnChanged += OnSTRButtonEnabled;
  66.         _statsViewModel.INTButtonEnabled.OnChanged += OnINTButtonEnabled;
  67.         _statsViewModel.DEXButtonEnabled.OnChanged += OnDEXButtonEnabled;
  68.  
  69.         // Обработка нажатия на кнопок "+"
  70.         _addSTRButton.onClick.AddListener(_statsViewModel.OnIncreaseSTRBtnClicked);
  71.         _addDEXButton.onClick.AddListener(_statsViewModel.OnIncreaseDEXBtnClicked);
  72.         _addINTButton.onClick.AddListener(_statsViewModel.OnIncreaseINTBtnClicked);
  73.  
  74.         // Обработка нажатия на кнопки RESET и SUBMIT
  75.         _resetButton.onClick.AddListener(_statsViewModel.OnResetButtonClicked);
  76.         _submitButton.onClick.AddListener(_statsViewModel.OnSubmitBtnClicked);
  77.  
  78.         // Save & Load
  79.         _saveButton.onClick.AddListener(_statsViewModel.OnButtonSave);
  80.         _loadButton.onClick.AddListener(_statsViewModel.OnButtonLoad);
  81.  
  82.         _STRValText.SetText(_statsViewModel.STRView.Value.ToString());
  83.         _DEXValText.SetText(_statsViewModel.DEXView.Value.ToString());
  84.         _INTValText.SetText(_statsViewModel.INTView.Value.ToString());
  85.         _statsAvailableText.SetText(_statsViewModel.StatsAvailableView.Value.ToString());
  86.     }
  87.  
  88.     // Команды на отрисовку значений
  89.     private void DisplaySTRView(int value)
  90.     {
  91.         _STRValText.SetText(value.ToString());
  92.     }
  93.  
  94.     private void DisplayINTView(int value)
  95.     {
  96.         _INTValText.SetText(value.ToString());
  97.     }
  98.  
  99.     private void DisplayDEXView(int value)
  100.     {
  101.         _DEXValText.SetText(value.ToString());
  102.     }
  103.  
  104.     private void DisplayStatsAvailable(int value)
  105.     {
  106.         _statsAvailableText.SetText(value.ToString());
  107.     }
  108.  
  109.     // Команды на отрисовку кнопку
  110.     private void OnSTRButtonEnabled(bool value)
  111.     {
  112.         OnButtonEnabled(_addSTRButton, value);
  113.     }
  114.  
  115.     private void OnINTButtonEnabled(bool value)
  116.     {
  117.         OnButtonEnabled(_addINTButton, value);
  118.     }
  119.  
  120.     private void OnDEXButtonEnabled(bool value)
  121.     {
  122.         OnButtonEnabled(_addDEXButton, value);
  123.     }
  124.  
  125.     private void OnButtonEnabled(Button button, bool value)
  126.     {
  127.         button.interactable = value;
  128.     }
  129.  
  130.     // Відписка
  131.     private void Dispose()
  132.     {
  133.         _statsViewModel.STRView.OnChanged -= DisplaySTRView;
  134.         _statsViewModel.INTView.OnChanged -= DisplayINTView;
  135.         _statsViewModel.DEXView.OnChanged -= DisplayDEXView;
  136.  
  137.         _statsViewModel.StatsAvailableView.OnChanged -= DisplayStatsAvailable;
  138.  
  139.         _statsViewModel.STRButtonEnabled.OnChanged -= OnSTRButtonEnabled;
  140.         _statsViewModel.INTButtonEnabled.OnChanged -= OnINTButtonEnabled;
  141.         _statsViewModel.DEXButtonEnabled.OnChanged -= OnDEXButtonEnabled;
  142.     }
  143.  
  144.     private void OnDestroy()
  145.     {
  146.         Dispose();
  147.     }
  148. }
  149.  
  150. public class StatsViewModel
  151. {
  152.     protected StatsModel _statsModel;
  153.  
  154.     // Максимальное значение STR, DEX и INT
  155.     private const int MAX_STAT_VALUE = 7;
  156.  
  157.     // наш вид
  158.     public ReactiveProperty<int> STRView = new();
  159.     public ReactiveProperty<int> INTView = new();
  160.     public ReactiveProperty<int> DEXView = new();
  161.     public ReactiveProperty<int> StatsAvailableView = new();
  162.  
  163.     // Активність кнопок STR+, DEX+, INT+
  164.     public ReactiveProperty<bool> STRButtonEnabled = new();
  165.     public ReactiveProperty<bool> INTButtonEnabled = new();
  166.     public ReactiveProperty<bool> DEXButtonEnabled = new();
  167.  
  168.     public StatsViewModel(StatsModel statsModel)
  169.     {
  170.         _statsModel = statsModel;
  171.  
  172.         _statsModel.STR.OnChanged += OnModelSTRChanged;
  173.         _statsModel.INT.OnChanged += OnModelINTChanged;
  174.         _statsModel.DEX.OnChanged += OnModelDEXChanged;
  175.  
  176.         StatsAvailableView.OnChanged += OnModelStatsToSpendViewChanged;
  177.  
  178.         OnResetButtonClicked();
  179.     }
  180.  
  181.     public void OnIncreaseSTRBtnClicked()
  182.     {
  183.         IncreasePropertyValue(STRView);
  184.     }
  185.  
  186.     public void OnIncreaseINTBtnClicked()
  187.     {
  188.         IncreasePropertyValue(INTView);
  189.     }
  190.  
  191.     public void OnIncreaseDEXBtnClicked()
  192.     {
  193.         IncreasePropertyValue(DEXView);
  194.     }
  195.  
  196.     /// Сброс до состояния модели
  197.     public void OnResetButtonClicked()
  198.     {
  199.         STRView.Value = _statsModel.STR.Value;
  200.         INTView.Value = _statsModel.INT.Value;
  201.         DEXView.Value = _statsModel.DEX.Value;
  202.  
  203.         StatsAvailableView.Value = _statsModel.StatsAvailable;
  204.  
  205.         DefineButtonsStatus();
  206.     }
  207.  
  208.     /// Подтверждение изменений
  209.     public void OnSubmitBtnClicked()
  210.     {
  211.         _statsModel.STR.Value = STRView.Value;
  212.         _statsModel.INT.Value = INTView.Value;
  213.         _statsModel.DEX.Value = DEXView.Value;
  214.  
  215.         _statsModel.StatsAvailable = StatsAvailableView.Value;
  216.     }
  217.  
  218.     public void OnButtonSave()
  219.     {
  220.         SaveManager.Save(nameof(StatsModel), _statsModel);
  221.     }
  222.  
  223.     public void OnButtonLoad()
  224.     {
  225.         StatsModel statsModel = SaveManager.Load<StatsModel>(nameof(StatsModel));
  226.         _statsModel.STR.Value = statsModel.STR.Value;
  227.         _statsModel.INT.Value = statsModel.INT.Value;
  228.         _statsModel.DEX.Value = statsModel.DEX.Value;
  229.         _statsModel.StatsAvailable = statsModel.StatsAvailable;
  230.  
  231.         OnResetButtonClicked();
  232.     }
  233.  
  234.     public void Dispose()
  235.     {
  236.         _statsModel.STR.OnChanged -= OnModelSTRChanged;
  237.         _statsModel.INT.OnChanged -= OnModelINTChanged;
  238.         _statsModel.DEX.OnChanged -= OnModelDEXChanged;
  239.  
  240.         StatsAvailableView.OnChanged -= OnModelStatsToSpendViewChanged;
  241.     }
  242.  
  243.     private void OnModelSTRChanged(int value)
  244.     {
  245.         STRView.Value = value;
  246.     }
  247.  
  248.     private void OnModelINTChanged(int value)
  249.     {
  250.         INTView.Value = value;
  251.     }
  252.  
  253.     private void OnModelDEXChanged(int value)
  254.     {
  255.         DEXView.Value = value;
  256.     }
  257.  
  258.     private void IncreasePropertyValue(ReactiveProperty<int> property)
  259.     {
  260.         property.Value += 1;
  261.         StatsAvailableView.Value -= 1;
  262.     }
  263.  
  264.     /// Проверяем, активны или неактивны кнопки "+"
  265.     private void DefineButtonsStatus()
  266.     {
  267.         STRButtonEnabled.Value = STRView.Value < MAX_STAT_VALUE;
  268.         INTButtonEnabled.Value = INTView.Value < MAX_STAT_VALUE;
  269.         DEXButtonEnabled.Value = DEXView.Value < MAX_STAT_VALUE;
  270.  
  271.         if (StatsAvailableView.Value <= 0)
  272.         {
  273.             STRButtonEnabled.Value = false;
  274.             INTButtonEnabled.Value = false;
  275.             DEXButtonEnabled.Value = false;
  276.         }
  277.     }
  278.  
  279.     private void OnModelStatsToSpendViewChanged(int obj)
  280.     {
  281.         DefineButtonsStatus();
  282.     }
  283. }
  284.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement