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

时间:2017-08-02 19:16:53

标签: ios arkit

我有一个ARKit Spritekit项目,我希望为每个ARAnchor显示不同的图像。

我对匹配SKSpriteNode图像的最佳方法感到困惑我添加到每个ARAnchor,因为SKScene Scene类和视图控制器之间存在一些控制反转。 / p>

我在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中的ARAnchor
  2. 时,我可以继承ARSKView并在自定义锚类中设置imageUrl
  3. 我应该不是从Scene.swift插入ARAnchor而是从视图控制器插入 - 然后以某种方式保留到ARAnchor和SKSpriteNode的链接?

1 个答案:

答案 0 :(得分:2)

有很多可能的方法可以做到这一点,所以这一切都取决于你喜欢如何构建你的应用程序/游戏。关于你询问的可能性及其可行性,但是:

  1. 是的,如果您要创建自己的ARAnchor个对象并将其添加到ARSession,则可以定义ARAnchor个子类(包括类似于图像URL)并传递它们。当您的自定义类出现在另一端时,它将保留其标识和内容。您只需要在委托方法中检查它:

    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这里是一个占位符,用于从网址加载SKTexture个对象的任何代码。)

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