展开我之前设置的纹理值时发现 nil

Found nil when unwrapping texture value which I have previously set

所以我正在尝试将一个 SKSpritenode 添加到我的场景 level2,我想给它一个物理体,其纹理来自我上传到项目资产文件夹中的图像。图像在那里并且名称是正确的,但是当启动应用程序时我得到一个致命错误。在我添加最后一行代码之前,我不知道我哪里出错了,因为该应用程序曾经 运行 顺利。

import UIKit
import SpriteKit 
import GameplayKit

class level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    var perno = SKSpriteNode(fileNamed: "perno")

    override func sceneDidLoad () {
        print ("view2 Loaded")

        self.perno  = self.childNode(withName: "perno") as? SKSpriteNode
        self.perno?.texture = SKTexture(imageNamed: "perno")
        self.perno?.size.width = self.perno!.size.width * 5

        self.perno!.physicsBody = SKPhysicsBody(texture: (perno?.texture)!, size: (perno?.texture?.size())!)



}

有什么提示吗?

谢谢!

您的可选处理确实不一致。有时您使用可选转换和可选链接只是为了然后在同一行中对同一变量使用强制展开。您应该强制展开 SKSpriteNode(fileNamed: "perno") 的 return 值,因为如果 returns nil 那是程序员错误,应该尽快发现。

您的直接问题似乎是您试图在 sceneDidLoad:

中覆盖 perno
self.perno  = self.childNode(withName: "perno") as? SKSpriteNode

您的场景中没有添加 childNode,因此您只需将 perno 设置为 nil,而不是之前使用 var perno = SKSpriteNode(fileNamed: "perno") 设置的值。只需从 sceneDidLoad 中删除该行,因为它没有意义,perno 在初始化期间已经加载,因为您为其分配了一个值。

class Level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    let perno = SKSpriteNode(fileNamed: "perno")!

    override func sceneDidLoad () {
        print ("view2 Loaded")
        self.perno.texture = SKTexture(imageNamed: "perno")
        self.perno.size.width = self.perno.size.width * 5

        self.perno.physicsBody = SKPhysicsBody(texture: perno.texture!, size: perno.texture!.size())
    }

}

更好的保护自己的方法是使用guard声明。 guard 允许您安全地检查变量是否不为 nil 而无需嵌套代码。

class Level2: SKScene {

    var entities = [GKEntity]()
    var graphs = [String : GKGraph]()

    let perno = SKSpriteNode(fileNamed: "perno")!

    override func sceneDidLoad () {
        print ("view2 Loaded")
        guard let texture = SKTexture(imageNamed: "perno")
        else{
            fatalError("Unable to find texture "perno")
        }
        self.perno.texture = texture
        self.perno.size.width = self.perno.size.width * 5

        self.perno.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
    }

}

如您所见,我们并没有过度展开 self.perno.texture,这意味着我们不小心使用 ?而不是 !,我们有一个明确的错误,说明为什么我们的代码会崩溃。