点击手势识别器 Xcode

tap gesture recognizer Xcode

我想在 Xcode、SceneKit 上制作 3d 游戏。为了测试它,我开始了一个关于盒子的简单项目,如果你点击它,它会在 X 方向移动。我的问题是如何让点击手势在 3d 游戏中发挥作用?我一直在尝试添加它,但它不起作用。这是我编写的所有代码,以防万一我做错了什么:

import UIKit
import QuartzCore
import SceneKit

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let scene = SCNScene(named:"art.scnassets/Box.scn")
        let newscene = self.view as! SCNView
        newscene.scene = scene
        let tap = UITapGestureRecognizer(target: self, action: #selector(taps(tap:)));newscene.addGestureRecognizer(tap)
        tap.numberOfTapsRequired = 1
        tap.numberOfTouchesRequired = 1
    }
    
    override var shouldAutorotate: Bool {
        return true
    }
    
    override var prefersStatusBarHidden: Bool {
        return true
    }
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }

    @objc func taps(tap:UITapGestureRecognizer){
        let newscene = self.view as! SCNView
        let scene = SCNScene(named: "art.scnassets/Box.scn")
        let box = scene?.rootNode.childNode(withName: "Box", recursively: true)
        let place = tap.location(in: newscene)
        let tapped = newscene.hitTest(place, options: [:])
        if tapped.count > 0{
            box?.runAction(SCNAction.repeatForever(SCNAction.moveBy(x: 5, y: 0, z: 0, duration: 1)))
       }
    }
}

试试这个...

@objc func handleTap(recognizer: UITapGestureRecognizer)
    {
        if(data.isNavigationOff == true) { return }         // No panel select if Add, Update, EndWave, or EndGame
        if(gameMenuTableView.isHidden == false) { return }  // No panel if game menu is showing
        
        let location: CGPoint = recognizer.location(in: gameScene)
        
        if(data.isAirStrikeModeOn == true)
        {
            let projectedPoint = gameScene.projectPoint(SCNVector3(0, 0, 0))
            let scenePoint = gameScene.unprojectPoint(SCNVector3(location.x, location.y, CGFloat(projectedPoint.z)))
            gameControl.airStrike(position: scenePoint)
        }
        else
        {
            let hitResults = gameScene.hitTest(location, options: hitTestOptions)
            for vHit in hitResults
            {
                if(vHit.node.name?.prefix(5) == "Panel")
                {
                    // May have selected an invalid panel or auto upgrade was on
                    if(gameControl.selectPanel(vPanel: vHit.node.name!) == false) { return }
                    return
                }
            }
        }
    }

如果空袭 - 点击在您触摸的屏幕上投下炸弹,将其转换为 3D

Else hittest 查找可能 return 多个结果的面板