условно, что есть игра AngryBirds и мне нужно сохранить положение разрушаемых\двигаемых объектов на сцене (стены, перекладины и т.д.).
Как я делаю сейчас в момент запуска шарика (именно в момент) я прохожусь по гейм объектам и сохраняю их локальную позицию и ротейшен:
var objects = FindObjectsOfType<PersistedObject>();
foreach (var obj in objects) {
objectsForSave.Add(new PersistedObjectPlacement(obj.transform.localPosition, obj.transform.localRotation.eulerAngles));
}
и работает оно вроде хорошо, но вот есть косяк, который мне не нравится, а именно, что в момент сохранения некоторые объекты еще могут иметь инерцию от симуляции физики и сохранение не учитывает эти моменты, а они могут быть важными.
Что с этим можно поделать?
Кроме как запускать таймер и сохранять каждые N секунд, больше ничего в голову не приходит.
хорошо было бы сохранять когда игра закрывается, но когда срабатывает OnDestroy компонента сохранения, то объекты уже уничтожены и сохранять там нечего.
А зачем вообще сохранять объекты?
затем, что игрок может выйти посреди уровня, и когда снова зайдет, то нужно чтобы было такое же состояние уровня как на момент выхода
также думали разрабы игр на сегу
Если уровни небольшие, то игрок вполне может пройти уровень заново. Поскольку иначе придется делать симуляцию замедления инерции до полной остановки объектов, и сохранять только в том случае, когда все объекты будут обездвижены.
я просто привел в пример энгрибердс (ибо в него все играли и представляют, что там и как), но там по сути игрок может десятками минут воздействовать на объекты на сцене и потом выйти. а можно как-то отследить, что объекты уже обездвижены? типа посмотреть в их RigitBody и посмотреть на velocity или еще на что-то?
Ну да, велосити, ты посмотреть можешь
Именно, Rigidbody и его Velocity. Или смещение координат по времени например каждую секунду oldobject.transform == newobject.transform
Обсуждают сегодня