Страница 3 из 3

Re: Можно ли изменить место куда сохраняются PlayerPrefs?

СообщениеДобавлено: 09 май 2023, 16:34
Saltant
skroliks писал(а):А по поводу основного вопроса может что подскажете?

Ну сохранения сделать просто, я недавно в своей синглплеерной игре делал сейвы.
Просто берешь класс создаешь с нужными полями. Создаешь метод Save, в нем создаешь экземпляр этого класса, заполняешь все поля данными, потом класс сериализуешь например с помощью ProtoBuf и сохраняешь в файл, можно в бинарном виде. Этот файл можешь хранить локально на устройстве или залить в облако например, в обратную сторону загрузить игру так же - десериализуешь этот файл в объект класса и забираешь нужные данные из него присваивая их игровым переменным.

Re: Можно ли изменить место куда сохраняются PlayerPrefs?

СообщениеДобавлено: 10 май 2023, 09:02
skroliks
Saltant писал(а):
skroliks писал(а):А по поводу основного вопроса может что подскажете?

Ну сохранения сделать просто, я недавно в своей синглплеерной игре делал сейвы.
Просто берешь класс создаешь с нужными полями. Создаешь метод Save, в нем создаешь экземпляр этого класса, заполняешь все поля данными, потом класс сериализуешь например с помощью ProtoBuf и сохраняешь в файл, можно в бинарном виде. Этот файл можешь хранить локально на устройстве или залить в облако например, в обратную сторону загрузить игру так же - десериализуешь этот файл в объект класса и забираешь нужные данные из него присваивая их игровым переменным.


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

Re: Можно ли изменить место куда сохраняются PlayerPrefs?

СообщениеДобавлено: 10 май 2023, 15:37
1max1
Думаю, ты упадешь в обморок, когда узнаешь какая инкапсуляция в компонентах на ECS архитектуре. В целом, да, зачастую нужно инкапсулировать код, но не нужно упарываться и закрывать вообще все подряд, а потом строить миллион обходных путей для доступа. В той же системе сохранений, можно легко сделать все поля открытыми, просто потому что все они должны быть доступны для записи внешнему коду в любой момент. Вообще, как говорил Джейсон Стетхем, - "Все зависит от контекста", так что без конкретно примера сложно сказать что нужно, а что нет %%-

Re: Можно ли изменить место куда сохраняются PlayerPrefs?

СообщениеДобавлено: 10 май 2023, 16:43
Saltant
skroliks писал(а):Дак я вот это все так и сделал, но все везде в интернетах учат, что переменные нужно делать приватными, чтобы нельзя было их изменять извне (чего?)

Делай всегда приватные переменные и если тебе нужен к ним доступ, то инкапсулируй по мере востребованности.
Я всегда пишу вначале пиватную или [SerializeField] это тоже приватная но отобразится в инспекторе юнити. Далее если мне нада к ней доступ я создаю свойство get и/или set
Если например мне нужен доступ только как get к этой переменной и она неизменяема, то я её помечаю как readonly. Например с ивентами так делаю, создаю readonly UnityEvent someEvent = new(); и просто возвращаю его в публичном свойстве get как public UnityEvent GetSomeEvent() => someEvent; Так скрипты могут обратиться к этому GetSomeEvent, подписаться и отписаться, но не могут перезаписать его.

Re: Можно ли изменить место куда сохраняются PlayerPrefs?

СообщениеДобавлено: 11 май 2023, 09:01
skroliks
Saltant писал(а):
skroliks писал(а):Дак я вот это все так и сделал, но все везде в интернетах учат, что переменные нужно делать приватными, чтобы нельзя было их изменять извне (чего?)

Делай всегда приватные переменные и если тебе нужен к ним доступ, то инкапсулируй по мере востребованности.
Я всегда пишу вначале пиватную или [SerializeField] это тоже приватная но отобразится в инспекторе юнити. Далее если мне нада к ней доступ я создаю свойство get и/или set
Если например мне нужен доступ только как get к этой переменной и она неизменяема, то я её помечаю как readonly. Например с ивентами так делаю, создаю readonly UnityEvent someEvent = new(); и просто возвращаю его в публичном свойстве get как public UnityEvent GetSomeEvent() => someEvent; Так скрипты могут обратиться к этому GetSomeEvent, подписаться и отписаться, но не могут перезаписать его.


А как защищать переменные от взлома программами типа АртМани, где ищут по значению адрес переменной и изменяют значение на нужное? Достаточно ли будет сделать вот так переменные нужные приватными и изменять их только через метод внутри класса, или это бесполезно и они не так работают?

Re: Можно ли изменить место куда сохраняются PlayerPrefs?

СообщениеДобавлено: 11 май 2023, 09:47
waruiyume
Вы же сами ответили на свой вопрос "ищут по значению адрес переменной", т.е. нет разницы приватная она или нет.
Можно попробовать устанавливать, те переменные, которые захотят взломать, через сеттер, записывая контрольную сумму в другую переменную. И при следующей установки значения, если старое значение не совпадает со старым хешем, показывать пользователю МПХ на весь экран.
Вообще, на форуме есть тема с античит плагином, вроде от товарища Фокс, искать влом.

Re: Можно ли изменить место куда сохраняются PlayerPrefs?

СообщениеДобавлено: 11 май 2023, 16:10
DbIMok
вот например https://habr.com/ru/articles/589899/