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 一起显示的主要内容,如果未能解决你的问题,请参考以下文章
对比BF2452SK30A,2SK160A与2SK241对于150kHz导航信号放大关系