编辑函数中的变量,然后调用另一个函数中编辑的变量



我想在前面加上我是 Swift 的初学者,但需要完成这个 ARKit 项目。

我使用该功能。

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
let trackedNode = node
if let imageAnchor = anchor as? ARImageAnchor{
if (imageAnchor.isTracked) {
trackedNode.isHidden = false
offScreen = false
print("Visible")
}else {
trackedNode.isHidden = true
//print("(trackedImageName)")
offScreen = true
print("No image in view")
}
}
}

这将检测定位点是否在屏幕上,并将全局变量offScreen设置为适当的值。

我想获取变量的新值并在我的createdVideoPlayerNodeFor函数中使用它。如果 offScreen 为 true,则将 AVPlayer 设置为暂停。

但是,我在createdVideoPlayerNodeFor函数中声明了我的 AVPlayer,因此我无法将其包含在一个函数中。

我知道我一次指的是我的代码片段,所以我在下面发布了完整的代码。

var offScreen = false
let videoNode = SCNNode()
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
offScreen = false
guard let imageAnchor = anchor as? ARImageAnchor else { return }
let referenceImage = imageAnchor.referenceImage
node.addChildNode(createdVideoPlayerNodeFor(referenceImage))
}
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
let trackedNode = node
if let imageAnchor = anchor as? ARImageAnchor{
if (imageAnchor.isTracked) {
trackedNode.isHidden = false
offScreen = false
print("Visible")
}else {
trackedNode.isHidden = true
//print("(trackedImageName)")
offScreen = true
print("No image in view")
}
}
}
func createdVideoPlayerNodeFor(_ target: ARReferenceImage) -> SCNNode {
let videoPlayerGeometry = SCNPlane(width: target.physicalSize.width, height: target.physicalSize.height)
var player = AVPlayer()
if let targetName = target.name,
let awsURL:NSURL = NSURL(string: "my video url :).mp4") {
player = AVPlayer(url: awsURL as URL)
player.play()
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: nil) { (notification) in
player.seek(to: CMTime.zero)
player.pause()
}
}

videoPlayerGeometry.firstMaterial?.diffuse.contents = player
videoNode.geometry = videoPlayerGeometry
videoNode.eulerAngles.x = -Float.pi / 2
return videoNode
}

我迫切需要这方面的帮助,所以如果有人可以帮助我解决这个问题,将不胜感激。

如果我解释得不够好或什么,请问问题,我真的只需要弄清楚这一点:)

编辑:在我的测试中,我发现当变量在任一函数中更改时,几乎就像变量有 2 个不同的值,每个函数 1 个。因此,如果在didUpdate函数中将其设置为 true,则无关紧要,因为createdVideo函数将使用变量声明开头设置的值。这甚至可以在一个函数中设置变量的值并将其转移到另一个函数中吗?

offScreen

是一个实例变量,这意味着它在这两个函数的范围内。您应该能够从其中任何一个读取和设置它。但是,请注意,不要从不同的线程读取/写入该变量,因为那样该值可能是不可预测的。你可能想要设置一个offscreenQueue,一个私有DispatchQueue,这将限制对此变量的访问。

最新更新