Swift 如何设置SceneKit碰撞检测

Swift 如何设置SceneKit碰撞检测,swift,scenekit,Swift,Scenekit,您好,我仔细阅读了文档,不知道如何在场景工具包中设置碰撞检测。有人能举个例子吗。 请帮帮我,我非常想弄清楚这件事。 谢谢大家! 编辑: 你好,非常感谢,很抱歉我忘了提到我的项目在swift中。没什么大不了的,我大部分时间都能翻译自己 当对象相互碰撞和反弹时,我的位掩码工作正常。然而,我似乎无法使该功能正常工作 func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact){ let

您好,我仔细阅读了文档,不知道如何在场景工具包中设置碰撞检测。有人能举个例子吗。 请帮帮我,我非常想弄清楚这件事。 谢谢大家!

编辑: 你好,非常感谢,很抱歉我忘了提到我的项目在swift中。没什么大不了的,我大部分时间都能翻译自己

当对象相互碰撞和反弹时,我的位掩码工作正常。然而,我似乎无法使该功能正常工作

func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact){
    let contactMask = contact.nodeA.physicsBody!.categoryBitMask | contact.nodeB.physicsBody!.categoryBitMask
    if (contactMask == (CollisionBallCategory | CollisionTerminatorCategory)) {
        println("Collided")
    }
}

看着它,我似乎需要以某种方式将场景物理世界委派给该方法。我不知道该怎么做。

SceneKit中碰撞检测的主要内容:

  • 它基于位掩码,它们一起构成一个表
  • 联系人代理是您对冲突的响应方式
使物体碰撞 例如,您可以用简单的英语陈述一些游戏设计,如下所示:

小行星相互撞击(形成更小的小行星)。导弹应该相互穿过,但摧毁火箭和小行星。火箭不应该对导弹做任何事情(只是反过来),但是如果一个离另一个或小行星太近,你就会遇到严重的问题,你今天就不能去太空了

实现碰撞检测的第一步是将设计编码为哪一对进行交互。您可以使用表执行此操作:

         | Missile | Rocket | Asteroid
--------------------------------------
Missile  | No      | Yes    | Yes
Rocket   | No      | Yes    | Yes
Asteroid | No      | No     | Yes
然后可以将表的标题转换为一组类别常量,以便在代码中使用

typedef NS_选项(NSUInteger、CollisionCategory){

CollisionCategoryMissile=1我在编辑后为您的问题添加了一个语言标签-既然Cocoa(Touch)有两种主要语言,那么澄清您要问的是哪种语言总是很好的。说到哪种,您从未提到过哪种平台您的目标是任何一个-SceneKit在iOS和OS X上都运行,但一般来说,SceneKit的任何特定内容对这两个平台都是通用的。一旦您检查了文档和/或我的更新答案,以确保您的冲突代理设置正确,请在
physicsWorld:didBeginContact:
内粘贴一个
println
,这样您就可以I’我知道您的问题是方法没有被调用,还是您的
contactMask
逻辑工作不正常。在“响应冲突”部分添加了一些内容,以便更直接地解决编辑问题中的问题。将代码保留在ObjC中(至少现在)-如果你很乐意阅读,我不必重写和重新测试它。:)事实上,考虑到Swift的当前状态,可以说最好使用
NS_OPTIONS
在C中定义冲突类别枚举,然后将其导入Swift-这会自动获得一个
RawOptionSetType
,您可以应用位操作Tor,如果您已经用Swift声明了枚举,您必须自己添加它们。(然后用Swift执行其余代码。)非常感谢最后两行代码是我无法理解的,谢谢!嗨!我在Swift 4中似乎再也找不到CollisionCategory了。还有其他方法可以做到这一点吗?仔细阅读答案。
CollisionCategory
不是API,它是您自己定义的类型。