离机时SKTileMapNode消失,不再出现

问题描述

我有一个 SpriteKit 平台游戏,它使用平铺地图作为背景。有问题的背景位于主要内容上方 1 个屏幕高度处(位于屏幕外),充当玩家上方的森林树冠。我以编程方式完成,如下所示:

let screenWidth = UIScreen.main.bounds.width
let screenHeight = UIScreen.main.bounds.height
let columns = 20
let rows = 1
let tileSize = CGSize(width: screenWidth,height: screenHeight)

let container = SKSpriteNode()
let tileDeFinition = SKTileDeFinition(texture: MainData.textureAtlas.textureNamed("someTexture"),size: CGSize(width: screenWidth,height: screenHeight))
let tileGroup = SKTileGroup(tileDeFinition: tileDeFinition)
let tileSet = SKTileSet(tileGroups: [tileGroup])
let layer = SKTileMapNode(tileSet: tileSet,columns: columns,rows: rows,tileSize: tileSize)

container.position = CGPoint(x: screenWidth*0.5,y: screenHeight*1.5)
container.size = CGSize(width: CGFloat(columns)*screenWidth,height: screenHeight)
container.zPosition = 3.0

layer.fill(with: tileGroup)
                
container.addChild(layer)
addChild(container)

相机节点跟随玩家。

问题:如果玩家跳起来,SKTileMapNode 会在他回来时消失。它永远不会再次出现。它的父节点 container 仍然可见,所以我认为问题在于 SKTileMapNode,而不是 container

我的尝试: 我尝试了以下方法,并检查了数字 2-5 的 SKTileMapNode

  1. 设置 view.shouldCullNonVisibleNodes = false
  2. 正在检查 alpha 值。总是1.0
  3. 检查 position。总是CGPoint(x: 0,y: 0)
  4. 检查 anchorPoint。总是CGPoint(x: 0.5,y: 0.5)
  5. 检查 zPosition。它不会改变,并且没有其他节点可能会遮挡 SKTileMapNode 或其父节点。设置更高的值对问题没有影响。
  6. 检查 container 是否保持可见。确实如此。

关于剔除: 看起来问题应该与剔除有关,但设置 view.shouldCullNonVisibleNodes=false 对这种情况没有影响。我还检查以确保 SKTileMapNode 始终作为 container 的子节点存在。这是。我想这意味着该节点没有被剔除。但是,如果我将 container 定位为始终 on-screen,则根本不会出现问题; SKTileMapNode 保持可见。这让我很困惑,因为这些似乎是相互矛盾的事实。

在设备上: 使用模拟器,至少在 SE 和 iPhone 8 等老款 iPhone 上不会出现这个问题。 仅发生在较新的 iPhone 上,例如 iPhone 11 和 iPhone 12. 使用 iPhone 11,我可以确认问题也发生在真实设备上。

问题:为什么我的 SKTileMapNode 在离机时消失了(即使禁用了剔除)?我怎样才能保持这个节点可见?

谢谢!

解决方法

看来我已经解决了这个问题。

我通过 SwiftUI in:#_production "Deploy lead:" @Peter Scriven 呈现我的场景,我已将其配置为允许背景透明,如下所示:

SpriteView

删除透明度选项解决了问题:

SpriteView(scene: theScene,options: [.allowsTransparency])

现在,为什么会这样?我不知道。