Swift 如何将字符串传递到SKScene(文件名:)动画文件中的SKLabelNode?

Swift 如何将字符串传递到SKScene(文件名:)动画文件中的SKLabelNode?,swift,sprite-kit,sklabelnode,sceneeditor,Swift,Sprite Kit,Sklabelnode,Sceneeditor,以前,我通过在SKScene中创建初始值设定项将属性传递到SKScene,然后在SceneEditViewController中创建SKScene属性时设置这些初始值设定项。这有意义吗?我希望如此 但是,我现在使用的不是手动创建场景,而是场景编辑器。我的动画场景有一个SKLabelNode,我想将从不同的viewController接收的文本传递到该场景的SKLabelNode。下面我在if-else的“if”部分提供了我以前的方法。在“else”部分,我正在尝试新方法,但需要帮助 当尝试从我的

以前,我通过在SKScene中创建初始值设定项将属性传递到SKScene,然后在SceneEditViewController中创建SKScene属性时设置这些初始值设定项。这有意义吗?我希望如此

但是,我现在使用的不是手动创建场景,而是场景编辑器。我的动画场景有一个SKLabelNode,我想将从不同的viewController接收的文本传递到该场景的SKLabelNode。下面我在if-else的“if”部分提供了我以前的方法。在“else”部分,我正在尝试新方法,但需要帮助

当尝试从我的SKScene设置属性时,xcode声明,“类型为'SKScene'的值没有成员'selectedTextSceneUse1'”

包括以下内容:

  • SceneEditViewController
  • 允许我从另一个viewController接收文本字符串的扩展
  • GameSecene.swift(连接到my GameSecene.sks的swift文件)
我正在使用swift 5.0,如果您需要其他信息,请告诉我

import UIKit
import Foundation
import SpriteKit
import GameplayKit

class SceneEditViewController: UIViewController, UITabBarControllerDelegate {

var selectedSceneTextFinal: String?

if selectedSceneInt == 0 {
            let animationScene3 = AnimationInventory18(size: CGSize(width:animationScreen.bounds.width, height:animationScreen.bounds.height), chosenChateracterSceneUse: chosenCharacterFinal, selectedTextSceneUse: selectedSceneTextFinal, chosenBackgroundSceneUse: chosenBackgroundFinal)
            
            animationScene3.scaleMode = .aspectFit
            animationScene3.backgroundColor = .black
            animationScene3.anchorPoint = CGPoint(x: 0.5, y: 0.52)
            animationScene3.position = CGPoint(x: 0, y: 0)
            let transition = SKTransition.fade(withDuration: 1.0)
            animationScreen.presentScene(animationScene3, transition: transition)
            
            DispatchQueue.main.asyncAfter(deadline: .now() + 20){
                self.animationScreen.presentScene(nil)
                print("Scene Removed")
            }
        } else {
     
            if let scene = SKScene(fileNamed: "GameScene") as GameScene {
           
                scene.scaleMode = .aspectFit 
                
                scene.selectedTextSceneUse1 = selectedSceneTextFinal

                animationScreen.presentScene(scene)

                DispatchQueue.main.asyncAfter(deadline: .now() + 10){
                    self.animationScreen.presentScene(nil)
                    print("Scene Removed")
                }
            }
        }
    }

extension SceneEditViewController: textUpdateDelegate {
    func didUpdateText(textFromView: String){
        selectedSceneTextFinal = textFromView
    }
}


import SpriteKit
import GameplayKit

class GameScene: SKScene {
    
    var textNode: SKLabelNode?
    
   // Not receiving the value passed from selectedSceneTextFinal
   var selectedTextSceneUse1: String?
    

    // MARK: Camera Node
    let cameraNode = SKCameraNode()
    
    // Initializer 
     required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func check() {
        
        self.camera = cameraNode
        cameraNode.position = CGPoint(x: 0, y: -300)
        self.addChild(cameraNode)
        print(selectedTextSceneUse1)


        self.textNode?.text = selectedTextSceneUse1


    }
    
    override func sceneDidLoad() {

        self.lastUpdateTime = 0
        check()
    }

}



你应该在以下场景中施展你的技巧:

if let scene = SKScene(fileNamed: "GameScene") as? GameScene {
在这些情况下,当您从文件中获取游戏场景时,您需要实现init?(编码器..):

确保也在sks文件中设置场景的类类型。(海关督察)

如果要在更改sklabelnode文本时设置该文本,可以在selectedSceneTextFinal上添加观察者:

class SceneEditViewController: UIViewController, UITabBarControllerDelegate {

   var gameScene : GameScene?
   var selectedSceneTextFinal: String? {
       didSet {
           // Update gameScene value when controller value is changed
           gameScene?.selectedTextSceneUse1 = selectedSceneTextFinal
       }
   }
...

        if let scene = SKScene(fileNamed: "GameScene") as GameScene {
            gameScene = scene
            scene.scaleMode = .aspectFit 
            scene.selectedTextSceneUse1 = selectedSceneTextFinal
...


class GameScene: SKScene {

    var textNode: SKLabelNode?

   // Update textNode on update of selectedTextSceneUse1
   var selectedTextSceneUse1: String? {
       didSet {
           // If nit done initialise textNode from sks file (label node must have a name)
           if textNode == nil {
               textNode = childNode(withName: "name of LabelNode in sks file") as? SKLabelNode
           }
           textNode?.text = selectedTextSceneUse1
       }
   }

你应该在以下场景中施展你的技巧:

if let scene = SKScene(fileNamed: "GameScene") as? GameScene {
在这些情况下,当您从文件中获取游戏场景时,您需要实现init?(编码器..):

确保也在sks文件中设置场景的类类型。(海关督察)

如果要在更改sklabelnode文本时设置该文本,可以在selectedSceneTextFinal上添加观察者:

class SceneEditViewController: UIViewController, UITabBarControllerDelegate {

   var gameScene : GameScene?
   var selectedSceneTextFinal: String? {
       didSet {
           // Update gameScene value when controller value is changed
           gameScene?.selectedTextSceneUse1 = selectedSceneTextFinal
       }
   }
...

        if let scene = SKScene(fileNamed: "GameScene") as GameScene {
            gameScene = scene
            scene.scaleMode = .aspectFit 
            scene.selectedTextSceneUse1 = selectedSceneTextFinal
...


class GameScene: SKScene {

    var textNode: SKLabelNode?

   // Update textNode on update of selectedTextSceneUse1
   var selectedTextSceneUse1: String? {
       didSet {
           // If nit done initialise textNode from sks file (label node must have a name)
           if textNode == nil {
               textNode = childNode(withName: "name of LabelNode in sks file") as? SKLabelNode
           }
           textNode?.text = selectedTextSceneUse1
       }
   }

您的意思是在Identity and Type下的“Show the File inspector”(显示文件检查器)中?否,在自定义类inspectori中,我必须删除该检查,因为我要将字符串传输到的属性(selectedTextSceneUse1)返回为nil。游戏场景文件中我的初始化设置是否有问题?我现在收到一个致命错误。我甚至需要初始化设置吗?我忘了你必须编码init:init?(编码器…):它必须调用super.init(编码器…)谢谢。但是我不确定我是否理解。你是说在Identity and Type下的“Show the File inspector”(显示文件检查器)中?不,在自定义类inspectori中,我必须删除检查,因为我要将字符串传输到的属性(selectedTextSceneUse1)返回为nil。游戏场景文件中我的初始化设置是否有问题?我现在收到一个致命错误。我甚至需要初始化设置吗?我忘了你必须编码init:init?(编码器…):它必须调用super.init(编码器…)谢谢。我不确定我是否理解。@RonMyschuk你过去真的很有帮助,希望你能提供帮助或澄清我遗漏的内容。@RonMyschuk你过去真的很有帮助,希望你能提供帮助或澄清我遗漏的内容。