Интеграция Unity + Vuforia в существующий проект iOS делает взаимодействие с пользователем не работающим - PullRequest
0 голосов
/ 18 мая 2018

В настоящее время я следую этому руководству , чтобы интегрировать проект Unity + Vuforia в мой существующий проект iOS.Мне удается показать Unity внутри моего ARViewController.Дело в том, что я потерял все взаимодействие с пользователем в моем контроллере представления: мое событие касания для кнопки назад не запускается.

import Foundation

class ARViewController: UIViewController {

    var unityView: UIView?

    static func instantiateViewController() -> ARViewController {
        let controller = UIStoryboard.main.instantiateViewController(withIdentifier: "ARViewController") as! ARViewController
        return controller
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
            appDelegate.currentUnityController = UnityAppController()
            appDelegate.currentUnityController?.application(UIApplication.shared, didFinishLaunchingWithOptions: nil)
            appDelegate.startUnity()
            NotificationCenter.default.addObserver(self, selector: #selector(handleUnityReady), name: NSNotification.Name("UnityReady"), object: nil)
        }

    }

    @IBAction func onBackPressed(_ sender: Any) {
        dismiss(animated: true, completion: nil)
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
            appDelegate.stopUnity()
        }
    }

    @objc func backPressedTest() {
    }

    @objc func handleUnityReady() {
        showUnitySubView()
    }

    func showUnitySubView() {

        guard let unityView = UnityGetGLView() else { return }

        self.unityView = unityView
        // insert subview at index 0 ensures unity view is behind current UI view
        view?.addSubview(unityView)

        unityView.translatesAutoresizingMaskIntoConstraints = false
        let views = ["view": unityView]
        let w = NSLayoutConstraint.constraints(withVisualFormat: "|-0-[view]-0-|", options: [], metrics: nil, views: views)
        let h = NSLayoutConstraint.constraints(withVisualFormat: "V:|-50-[view]-0-|", options: [], metrics: nil, views: views)
        view.addConstraints(w + h)

        let button = UIButton(type: .custom)
        button.setImage(#imageLiteral(resourceName: "ic_back_black").withRenderingMode(.alwaysTemplate), for: .normal)
        button.addTarget(self, action:#selector(backPressed), for: .touchUpInside)
        button.frame = CGRect(x: 0, y: 0, width: 28, height: 60)
        button.widthAnchor.constraint(equalToConstant: button.frame.width).isActive = true
        button.tintColor = UIColor.purpleBrown()
        view?.addSubview(button)

    }
}

Я также заметил, что кнопка от Unity также имеет какой-либо эффект, когда я касаюсь ее.Кнопка возврата внутри зеленой панели от Unity.И синяя кнопка от моего ARViewController.Оба, кажется, не достигают прикосновения к событию.enter image description here

Элементы отладки: enter image description here

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

У меня была та же проблема, но перемещение конфигурации Unity в конец метода applicationDidFinishLaunchingWithOption не решило ее, и у меня все еще было окно UIWindow перед моим экраном, которое крадет все взаимодействия с пользователем.

Мое решение состоит не в создании нового окна в UnityAppController.mm, а в использовании текущего ключа приложения keyWindow.

Заменить:

    _window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];

на:

    _window = [UIApplication sharedApplication].keyWindow;
0 голосов
/ 30 мая 2018

Это происходит, когда я помещаю конфигурацию Unity в верхнюю часть application:didFinishLaunchingWithOptions:, выше моей существующей конфигурации для других служб, которые я использую в проекте.Для кого-то, кто столкнется с этой проблемой в будущем, вот мой appDelegate.swift:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    self.application = application

    // Another existing settings for the project, e.g. fabric

    Fabric.with([Crashlytics.self])

    // Put the Unity configuration at the bottom of the function

    unity_init(CommandLine.argc, CommandLine.unsafeArgv)
    currentUnityController = UnityAppController()
    currentUnityController?.application(application, didFinishLaunchingWithOptions: launchOptions)
    startUnity()
    stopUnity()

    return true
}

Для viewWillAppear(_:) в контроллере представления:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setupBackBarButtonItems(back: true, isDark: true)
    if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        appDelegate.startUnity()
        showUnitySubView()
    }
}

Как упомянуто @Prashant вкомментарий, уведомление UnityReady вызывается только один раз.Поэтому я им не пользуюсь.

Тогда я просто звоню stopUnity() in viewWillDisappear(_:):

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if let appDelegate = UIApplication.shared.delegate as? AppDelegate {
        appDelegate.stopUnity()
    }
}

В настоящее время проблема в том, что я не могу убить процесс единства, если я ухожуэкран.Это известно ошибка , и я все еще выясняю, как это сделать, если это возможно.

...