如何将自定义参数传递给 SKView 委托方法 view(nodeFor)

How to pass in custom parameters to the SKView delegate method view(nodeFor)

我有一个 ARKit Spritekit 项目,我想在其中为每个 ARAnchor 显示不同的图像。

我对匹配我添加到每个 ARAnchor 的 SKSpriteNode 图像的最佳方式有点困惑,因为 SKScene 场景 class 和视图之间存在一些控制反转控制器。

我在 Scene.swift 中添加锚点,在视图控制器中,我处理委托方法。

func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
    // Create and configure a node for the anchor added to the view's session.
    // this image url needs to be dynamic and vary for each node
    let imageURL = "https://farm1.staticflickr.com/[SOMEID].jpg"
    let url = URL(string: imageURL)
    let data = try? Data(contentsOf: url!) 
    let theImage = UIImage(data: data!)
    let Texture = SKTexture(image: theImage!)
    return SKSpriteNode(texture: Texture)

}

我的问题是:如何传入动态图片信息?

  1. 当我将锚点添加到 Scene.swift 中的 ARSKView 时,我可以子 class ARAnchor 并在自定义锚点 class 中设置 imageUrl
  2. 我是否应该从 Scene.swift 而不是从视图控制器插入 ARAnchor - 然后以某种方式将 link 保留到 ARAnchor 和 SKSpriteNode?

有很多方法可以做到这一点,所以这一切都取决于您喜欢如何构建您的 app/game。不过,关于您询问的可能性及其可行性:

  1. 是的,如果您正在创建自己的 ARAnchor 对象并将它们添加到 ARSession,您可以定义一个 ARAnchor subclass(包括图像 URL 等属性)并传递这些属性。您的自定义 class 将在 "comes out the other end" 时保留其身份和内容;你只需要在你的委托方法中检查它:

    func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
        if let anchor = anchor as? MyAnchor {
            let texture = self.textureForURL(anchor.imageURL)
            return SKSpriteNode(texture: texture)
        }
    }
    

    (注意 textureForURL 此处是用于从 URL 加载 SKTexture 对象的任何代码的占位符。)

  2. 如果你将你的锚点管理代码放在视图控制器而不是 SpriteKit 场景中,视图可以为你跟踪节点和锚点之间的对应关系:参见 node(for:)anchor(for:) ARSKView 上的方法。 (恕我直言,SKScene 最好被认为是 "data" class,因此它不是子class 添加逻辑的好地方。)