GamePlayKit GKObstacleGraph сохранить и загрузить

Можно ли сохранить GKObstacleGraph в файл и загрузить из него? Я ничего не могу найти по этому поводу.

Я хотел бы сохранить и загрузить предварительно рассчитанные графики для моих уровней.

Я пытался до сих пор

 NSArray * obstacles = [SKNode obstaclesFromNodePhysicsBodies:arrayOfBodies];
 _graph = [GKObstacleGraph graphWithObstacles:obstacles bufferRadius:[(BaseUnit *)[_units firstObject] size].width/2];
[NSKeyedArchiver archiveRootObject:_graph toFile:@"/Users/roma/Desktop/myGraph.graph"];

Но вот что я получил:

- [GKObstacleGraph encodeWithCoder:]: нераспознанный селектор отправлен на экземпляр 0x6180000432d0

1 ответ

Решение

GKObstacleGraph это подкласс GKGraph, который (в macOS 10.12, iOS 10 и tvOS 10) заявляет о соответствии NSCoding протокол. Это означает, что вы можете сериализовать один в данные или файл (и десериализовать, чтобы создать экземпляр из файла), используя NSKeyedArchiverNSKeyedUnarchiver) так же, как вы можете для любого другого объекта, который поддерживает NSCoding,

Для общей информации об архивации (которая относится к любому NSCoding совместимый класс), см. Руководство по программированию архивов и сериализаций Apple.

Также в Xcode 8 (при развертывании в macOS 10.12, iOS 10 или tvOS 10) вы можете создать GKGraph в визуальном редакторе, чтобы идти вместе со своими сценами SpriteKit. Когда вы делаете это, вы используете класс GKScene для загрузки сцены SpriteKit и объектов GK (которые могут включать в себя не только графики поиска пути, но также информацию об объектах / компонентах) из .sks файл Xcode пишет.


В старых версиях ОС GKGraph семья не поддерживает NSCoding, Тем не менее, вся информация, необходимая для восстановления GKObstacleGraph является общедоступным. Таким образом, вы можете реализовать свою собственную сериализацию, читая радиус буфера графа и список препятствий, и читая список вершин каждого препятствия. Запишите эту информацию в файл так, как вам нравится... затем, когда вы захотите восстановить график, создайте GKPolygonObstacle s из вершин, которые вы сохранили, и создайте новый GKObstacleGraph от этих препятствий и вашего сохраненного радиуса буфера.

Другие вопросы по тегам