【问题标题】:How to pass in custom parameters to the SKView delegate method view(nodeFor)如何将自定义参数传递给 SKView 委托方法 view(nodeFor)
【发布时间】:2017-08-03 04:23:30
【问题描述】:

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

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

我在 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 时,我可以将 ARAnchor 子类化并在自定义锚点类中设置 imageUrl
  2. 我是否应该插入 ARAnchor 而不是从 Scene.swift 而是从视图控制器 - 然后以某种方式保持指向 ARAnchor 和 SKSpriteNode 的链接?

【问题讨论】:

    标签: ios arkit


    【解决方案1】:

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

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

    2. 1234563 @。 (恕我直言,SKScene 最好被认为是一个“数据”类,因此它不是子类添加逻辑的好地方。)

    【讨论】:

    • 所以即使我将逻辑移动到视图控制器 - 我仍然可能希望像 #1 那样继承 ARAnchor?
    • @MonkeyBonkey 我不建议将属性添加到 ARAnchor 子类中,因为它会导致我冻结。
    • 我在 ARAnchor 子类中有一个属性。对我来说,属性通过view(_:nodeFor:) 是正确的,但随后会失去属性值。
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多