2017-08-02 40 views
1

我有一個ARKit Spritekit項目,我想爲每個ARAnchor顯示不同的圖像。如何將自定義參數傳遞給SKView委託方法視圖(nodeFor)

我對添加到每個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. 我能繼承ARAnchor並設置自定義錨類IMAGEURL當我Scene.swift錨添加到ARSKView
  2. 我應該插入不Scene.swift和替代視圖控制器的ARAnchor - 然後以某種方式保持與ARAnchor和SKSpriteNode的鏈接?

回答

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這裏是無論你使用代碼來從URL中加載SKTexture對象的佔位符)

  2. 如果你把你的在視圖控制器而不是SpriteKit場景中錨點管理代碼,視圖可以跟蹤節點和錨點之間的對應關係:請參閱ARSKView上的node(for:)anchor(for:)方法。 (恕我直言,SKScene是作爲一個「數據」類最好的思想,所以它不是一個子類添加邏輯的好地方。)

+0

所以即使我移動邏輯視圖控制器 - 我仍然可能想要像#1那樣子類ARAnchor? – MonkeyBonkey

+0

@MonkeyBonkey我不建議將屬性添加到ARAnchor子類中,因爲它會導致我凍結。 –

+0

我在ARAnchor子類中有一個屬性。對於我來說,屬性通過'view(_:nodeFor:)'是正確的,但隨後丟失屬性值。 – Caroline

相關問題