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
протокол. Это означает, что вы можете сериализовать один в данные или файл (и десериализовать, чтобы создать экземпляр из файла), используя NSKeyedArchiver
(и NSKeyedUnarchiver) так же, как вы можете для любого другого объекта, который поддерживает 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
от этих препятствий и вашего сохраненного радиуса буфера.