[swift] Swift FirebaseUI를 사용하여 증강현실 (AR) 게임 구현하기

증강현실(Augmented Reality, AR)은 현실 세계에 가상의 요소를 추가하여 새로운 경험을 제공하는 기술입니다. FirebaseUI는 Firebase의 다양한 기능을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다. 이번 글에서는 Swift와 FirebaseUI를 사용하여 AR 게임을 구현하는 방법을 알아보겠습니다.

FirebaseUI 설치하기

FirebaseUI는 CocoaPods를 통해 설치할 수 있습니다. 프로젝트의 Podfile에 다음 코드를 추가하고 pod install 명령을 실행하여 FirebaseUI를 설치하세요.

pod 'FirebaseUI/Auth'
pod 'FirebaseUI/Firestore'
pod 'FirebaseUI/FirebaseStorage'

ARKit 셋업하기

ARKit은 Apple의 증강현실 플랫폼입니다. ARKit을 사용하려면 Xcode 프로젝트에 ARKit 프레임워크를 추가해야 합니다. 프로젝트 네비게이터에서 프로젝트 파일을 선택하고, “General” 탭에서 “Frameworks, Libraries, and Embedded Content” 섹션으로 이동하여 ARKit 프레임워크를 추가하세요.

FirebaseUI를 사용한 인증 처리하기

FirebaseUI는 사용자 인증 기능을 제공하므로 게임을 플레이하는 사용자를 식별할 수 있습니다. 따라서 FirebaseUI를 사용하여 인증 처리를 구현해야 합니다.

import UIKit
import FirebaseUI

class AuthViewController: UIViewController, FUIAuthDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let authUI = FUIAuth.defaultAuthUI()
        authUI?.delegate = self
        
        // 로그인에 사용할 FirebaseUI 인증 제공업체 설정
        let providers: [FUIAuthProvider] = [
            FUIGoogleAuth()
        ]
        authUI?.providers = providers
        
        let authViewController = authUI!.authViewController()
        present(authViewController, animated: true, completion: nil)
    }
    
    func authUI(_ authUI: FUIAuth, didSignInWith user: User?, error: Error?) {
        if let user = user {
            // 로그인 성공 시 게임 화면으로 이동
            let gameViewController = GameViewController(user: user)
            navigationController?.pushViewController(gameViewController, animated: true)
        } else {
            // 로그인 실패 시 에러 처리
            print("로그인 실패: \(error?.localizedDescription ?? "알 수 없는 오류")")
        }
    }
}

위 코드는 인증 화면을 보여주고 사용자의 로그인을 처리하는 AuthViewController 클래스입니다. FUIAuthDelegate 프로토콜을 채택하여 로그인 성공 또는 실패에 대한 이벤트를 처리합니다.

AR 게임 구현하기

ARKit과 FirebaseUI의 인증을 통해 사용자를 식별할 수 있으므로 이제 AR 게임을 구현해보겠습니다. 여기서는 간단한 타겟을 스캔하고 적 터렛을 파괴하는 게임을 예로 들겠습니다.

import UIKit
import ARKit

class GameViewController: UIViewController, ARSCNViewDelegate {
    
    private var user: User
    private var gameView: ARSCNView!
    private var targetNode: SCNNode!
    
    init(user: User) {
        self.user = user
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        gameView = ARSCNView(frame: view.bounds)
        view.addSubview(gameView)
        gameView.delegate = self
        
        let scene = SCNScene()
        gameView.scene = scene
        
        let targetGeometry = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
        let targetMaterial = SCNMaterial()
        targetMaterial.diffuse.contents = UIColor.red
        targetGeometry.materials = [targetMaterial]
        
        targetNode = SCNNode(geometry: targetGeometry)
        scene.rootNode.addChildNode(targetNode)
        
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        gameView.addGestureRecognizer(tapGesture)
    }
    
    @objc func handleTap(_ gesture: UITapGestureRecognizer) {
        let location = gesture.location(in: gameView)
        let hitTestResults = gameView.hitTest(location, options: nil)
        
        if let hitNode = hitTestResults.first?.node, hitNode == targetNode {
            // 타겟 노드를 클릭한 경우 파괴 처리
            hitNode.removeFromParentNode()
            
            // 파괴한 정보를 Firebase에 저장
            let database = Firestore.firestore()
            let userRef = database.collection("users").document(user.uid)
            userRef.setData(["destroyedTargets": FieldValue.increment(Int64(1))], merge: true)
        }
    }
}

위 코드는 GameViewController 클래스로, AR 게임의 메인 화면을 구성합니다. 사용자가 화면을 탭하면 탭한 위치에 있는 노드를 감지하여 타겟 노드인지 확인하고 파괴 처리합니다. 파괴한 타겟 정보는 사용자의 Firebase 문서에 저장됩니다.

결론

Swift와 FirebaseUI를 사용하여 증강현실(AR) 게임을 구현하는 방법을 알아보았습니다. FirebaseUI의 인증 기능을 통해 사용자를 구분하고, ARKit을 사용하여 게임을 구현할 수 있습니다. Firebase의 Firestore를 사용하여 게임 기록을 저장할 수도 있습니다. 이를 기반으로 다양한 AR 게임을 만들어보세요!

참고 자료