sprite-kit - 在 Sprite Kit 中将数据存储在 plist 中与在场景编辑器中设置数据有什么区别?

标签 sprite-kit skspritenode

这似乎不是一个明智的问题,但我心中有一些困惑,我想澄清。在Apple的2d游戏框架Sprite kit中,通常建议将节点相关的数据存储在Plist中,然后在代码中需要时检索。我不明白的是,在使用 .sks 场景编辑器时,您有机会在属性检查器中设置和存储与节点相关的数据。或者我误解了它?这两种方法有什么区别,或者通过属性检查器使用 .sks 场景编辑器设置与节点相关的数据不会存储在任何地方,只能动态访问。如果有人能说明这两种方法之间的明显区别,我将不胜感激。我试图寻找它但无法得到任何帮助。

最佳答案

我最近开始在游戏的各个方面使用场景编辑器。不仅仅是场景,还可以创建复杂的 SKSPriteNode 对象、模块化弹出窗口等。它大部分都很棒,并且比尝试在代码中布局对象要快得多。

如果我能将所有数据保留在 sks 文件中就更好了。

是的,您是对的,您可以在场景编辑器中设置和存储与节点相关的数据。它位于用户数据下的属性检查器中。

您还可以将该信息存储在 Plist 文件中。然而,这两种方法之间的一个很大的区别是,如果将数据存储在 Plist 文件中,则必须对数据进行排序并找到相关数据并将其绑定(bind)到节点。当使用用户数据时,数据已经绑定(bind)到节点并随之而来,因此您以后不必找到它关联它。

来自Apple .

You use this property to store your own data in a node. For example, you might store game-specific data about each node to use inside your game logic. This can be a useful alternative to creating your own node subclasses to hold game data. SpriteKit does not do anything with the data stored in the node. However, the data is archived when the node is archived.

以下示例展示了访问 sks 文件中存储的用户数据是多么容易

if let userData = redVillian.userData {
    if let hitPoints = userData.object(forKey: "hitPoints") as? Int {
        redVillain.hitPoints = hitPoints
    }
    if let name = userData.object(forKey: "name") as? String {
        redVillian.name = name
    }
}

您还可以在代码中设置用户数据

redVillian.userData = ["hitPoints": 5, "name" : "Herbert"]

或者在代码中修改

redVillian.userData?.setValue("Eleanor", forKey: "name")

关于sprite-kit - 在 Sprite Kit 中将数据存储在 plist 中与在场景编辑器中设置数据有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43420342/

相关文章:

ios - Swift 2.2 - SpriteKit - 子类 SKSpriteNode 类

ios - 使用 Swift/SKScene 检测触摸

ios - SpriteKit 中的 "Collision Map"

ios - 当 SCNScene overlaySKScene 的 child 时查找触摸的 SKNode

ios - 加速度计数据不正确,延迟了几秒钟

swift - 如何为 SKShapeNode 的不透明度设置动画?

ios - 在 iOS 库类中的现有属性上添加属性观察器

ios - 为什么游戏逻辑更喜欢 update() 而不是 didFinishUpdate?

swift - 在子类 : Swift and SpriteKit 中循环 Initialization 的 drain

swift - 在子类 SKSpriteNode 中创建 SKSpriteNode 是一个好习惯吗?