GCVirtualController 不与 SKScene 一起显示

Posted

技术标签:

【中文标题】GCVirtualController 不与 SKScene 一起显示【英文标题】:GCVirtualController not displaying with SKScene 【发布时间】:2021-11-26 00:45:29 【问题描述】:

虚拟控制器出现,但随后被添加到视图中的对象遮挡。我也尝试在 UIViewController 中添加虚拟控制器,但这也不起作用。

SKScene 可以直接使用 GCVirtualController 吗?

class GameScene: SKScene 
    private var _virtualController: Any?
    public var virtualController: GCVirtualController? 
        get  return self._virtualController as? GCVirtualController 
        set  self._virtualController = newValue 
    
    override func didMove(to view: SKView) 
    let background = SKSpriteNode(imageNamed: ".jpg")
        background.zPosition = -1
        addChild(background)

        let virtualConfig = GCVirtualController.Configuration()
        virtualConfig.elements = [GCInputLeftThumbstick, GCInputRightThumbstick, GCInputButtonA, GCInputButtonB]
        virtualController = GCVirtualController(configuration: virtualConfig)
        virtualController?.connect()
    

似乎只有从一个 ViewController 推送到 GameViewController 时才会出现此问题。

当启动到 GameViewController 时,问题不会发生。

【问题讨论】:

将问题中的代码复制粘贴到 Xcode 13.1 中的默认“游戏”模板中会为我显示虚拟控制器(ios 15,iPod touch 第 7 代模拟器)。 嗨,Brendan,我没有意识到这个问题只发生在 GameViewController 不是启动目标时。当 GameViewController 是 Storyboard 上的入口点时,该代码确实有效,但如果另一个 ViewController 是,然后我从该 ViewController 显示我会遇到问题。我已经更新了问题以显示这一点,感谢您查看:) 是的,我看到了同样的行为。我能够确定虚拟控制器确实出现了,但它出现在第二个视图控制器正在渲染的视图下方(我将第二个视图的 alpha 设置为 0.5,并且可以看到下方的控件)。不知道为什么! 【参考方案1】:

虚拟游戏控制器至少可以在任何运行 iOS 15 的视图控制器上运行,但出于工作目的,最好在横向查看,但您需要将代码作为物理游戏手柄完成。

要让虚拟游戏手柄出现,您需要注册一个物理游戏手柄,并在连接和断开控制器时应用通知功能,就像您使用物理控制器一样。

这是设置和注册我使用的虚拟和物理游戏控制器的代码,它适用于我。

首先你需要导入游戏控制器库

import GameController

然后你在你的控制器类下定义虚拟控制器

class GameViewController: UIViewController 

// Virtual Onscreen Controller
private var _virtualController: Any?
@available(iOS 15.0, *)
public var virtualController: GCVirtualController? 
  get  return self._virtualController as? GCVirtualController 
  set  self._virtualController = newValue 

然后你在你的 ViewDidLoad() 中调用 setupGameController 函数

override func viewDidLoad() 
    super.viewDidLoad() 

    //your code 

    setupGameController()

这是设置虚拟和物理游戏控制器的主要功能

func setupGameController() 
        NotificationCenter.default.addObserver(
            self, selector: #selector(self.handleControllerDidConnect),
            name: NSNotification.Name.GCControllerDidBecomeCurrent, object: nil)

        NotificationCenter.default.addObserver(
        self, selector: #selector(self.handleControllerDidDisconnect),
        name: NSNotification.Name.GCControllerDidStopBeingCurrent, object: nil)

        if #available(iOS 15.0, *)
        
            let virtualConfiguration = GCVirtualController.Configuration()
            virtualConfiguration.elements = [GCInputLeftThumbstick,
                                         GCInputRightThumbstick,
                                         GCInputButtonA,
                                         GCInputButtonB]
            virtualController = GCVirtualController(configuration: virtualConfiguration)
        
            // Connect to the virtual controller if no physical controllers are available.
            if GCController.controllers().isEmpty 
                virtualController?.connect()
            
        
    
    guard let controller = GCController.controllers().first else 
        return
    
    registerGameController(controller)

然后要执行虚拟或物理游戏手柄操作,您需要分配连接并注册游戏控制器 作为

func handleControllerDidConnect(_ notification: Notification) 
    guard let gameController = notification.object as? GCController else
    
        return
    
    unregisterGameController()
    
    if #available(iOS 15.0, *)
    
        if gameController != virtualController?.controller
        
            virtualController?.disconnect()
        
    
    registerGameController(gameController)


func handleControllerDidDisconnect(_ notification: Notification) 
    unregisterGameController()
    
    if #available(iOS 15.0, *) 
        if GCController.controllers().isEmpty
        
            virtualController?.connect()
        
    


func registerGameController(_ gameController: GCController) 

    var buttonA: GCControllerButtonInput?
    var buttonB: GCControllerButtonInput?
    
    if let gamepad = gameController.extendedGamepad
    
        buttonA = gamepad.buttonA
        buttonB = gamepad.buttonB
    
    
    buttonA?.valueChangedHandler = (_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in
        // Put here the codes to run when button A clicked
        print("Button A Pressed")
    

    buttonB?.valueChangedHandler = (_ button: GCControllerButtonInput, _ value: Float, _ pressed: Bool) -> Void in
        // Put here the codes to run when button B clicked
        print("Button B Pressed")
    


func unregisterGameController()

    

这是一个非常基本的 Xcode 船舶样本的代码结果

【讨论】:

以上是关于GCVirtualController 不与 SKScene 一起显示的主要内容,如果未能解决你的问题,请参考以下文章

sk5病毒是啥

为啥 Mocha 不与 Yarn Berry 合作?

对比BF2452SK30A,2SK160A与2SK241对于150kHz导航信号放大关系

为啥这个 Dojo 代码不与它的 PHP 文件通信?

Datepicker 不与控制器反应 - AngularJS

UIActivityViewController 不与微信共享