如何将自定义参数传递给 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)
}
我的问题是:如何传入动态图片信息?
- 当我将锚点添加到 Scene.swift 中的
ARSKView
时,我可以子 class ARAnchor
并在自定义锚点 class 中设置 imageUrl
- 我是否应该从 Scene.swift 而不是从视图控制器插入
ARAnchor
- 然后以某种方式将 link 保留到 ARAnchor
和 SKSpriteNode?
有很多方法可以做到这一点,所以这一切都取决于您喜欢如何构建您的 app/game。不过,关于您询问的可能性及其可行性:
是的,如果您正在创建自己的 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
对象的任何代码的占位符。)
如果你将你的锚点管理代码放在视图控制器而不是 SpriteKit 场景中,视图可以为你跟踪节点和锚点之间的对应关系:参见 node(for:)
和 anchor(for:)
ARSKView
上的方法。 (恕我直言,SKScene
最好被认为是 "data" class,因此它不是子class 添加逻辑的好地方。)
我有一个 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)
}
我的问题是:如何传入动态图片信息?
- 当我将锚点添加到 Scene.swift 中的
ARSKView
时,我可以子 classARAnchor
并在自定义锚点 class 中设置 imageUrl - 我是否应该从 Scene.swift 而不是从视图控制器插入
ARAnchor
- 然后以某种方式将 link 保留到ARAnchor
和 SKSpriteNode?
有很多方法可以做到这一点,所以这一切都取决于您喜欢如何构建您的 app/game。不过,关于您询问的可能性及其可行性:
是的,如果您正在创建自己的
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
对象的任何代码的占位符。)如果你将你的锚点管理代码放在视图控制器而不是 SpriteKit 场景中,视图可以为你跟踪节点和锚点之间的对应关系:参见
node(for:)
和anchor(for:)
ARSKView
上的方法。 (恕我直言,SKScene
最好被认为是 "data" class,因此它不是子class 添加逻辑的好地方。)