Ich habe ein levelbasiertes Spiel, daher verwende ich den Xcode Scene Editor zur Erstellung von Levels, habe aber Probleme beim Erkennen von Kollisionen zwischen Objekten, die in separaten Szenen erstellt wurden und zog Spielszenen als Referenzknoten hinein.Zuweisen von Kategorien, Kollisionen und Kontakt-Bitmasken zu Referenzknoten im Code
Wenn ich versuche, den Physikkörper eines Objekts zu erstellen, das als Referenzknoten in dieser .scn-Datei verwendet wird, in der ich es erstellt habe, wird dieser Physikkörper nicht auf Knoten in der Spielszene verwiesen. Die Eigenschaften, die direkt im Szeneneditor erstellt wurden, sind.
Wenn ich versuche, den Physikkörper jedes Knotens, der eigentlich ein Referenzknoten ist, über den Code zu setzen, wird er gesetzt (der Physikkörper ist nicht Null), aber die Kollision wird nicht erkannt.
Dies ist der Code, wo ich die Physik Gremien:
// player (I want to be notified when player collides with any walls)
playerNode = level1Scene.rootNode.childNodeWithName("playerNode", recursively: true)!
playerNode.physicsBody = SCNPhysicsBody(type: .Dynamic, shape: nil)
playerNode.physicsBody?.affectedByGravity = false
playerNode.physicsBody?.categoryBitMask = PhysicsCategory.Player.rawValue
playerNode.physicsBody?.collisionBitMask = PhysicsCategory.Wall.rawValue
playerNode.physicsBody?.contactTestBitMask = PhysicsCategory.Wall.rawValue
//wall from separate .scn file
let wallScene = SCNScene(named: "wallObject.scn")
let wall = wallScene!.rootNode.childNodeWithName("wall", recursively: true)!
wall.physicsBody = SCNPhysicsBody(type: .Kinematic, shape: nil)
wall.physicsBody?.categoryBitMask = PhysicsCategory.Wall.rawValue
wall.physicsBody?.collisionBitMask = PhysicsCategory.Player.rawValue
wall.physicsBody?.contactTestBitMask = PhysicsCategory.Player.rawValue
// walls that are reference nodes of the wall and are located in game scene
let wall2 = level1Scene.rootNode.childNodeWithName("wallObject reference", recursively: true)!
wall2.physicsBody = SCNPhysicsBody(type: .Kinematic, shape: nil)
wall2.physicsBody?.categoryBitMask = PhysicsCategory.Wall.rawValue
wall2.physicsBody?.collisionBitMask = PhysicsCategory.Player.rawValue
wall2.physicsBody?.contactTestBitMask = PhysicsCategory.Player.rawValue
print(wall2.physicsBody!) // prints <SCNPhysicsBody: 0x7fe5f9dc75a0>
Ich bin nicht über irgendwelche Kontakte kontaktiert, noch hat der Spieler mit jeder Wand physisch auf Kontakt kollidieren. Ich habe die Klasse das SCNPhysicsContactDelegate
Protokoll angepasst:
extension GameViewController: SCNPhysicsContactDelegate {
func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) {
playerNode.physicsBody?.velocity = SCNVector3Zero
print("player and wall collided")
}
}
und stellen Sie den Kontakt Delegaten meine Spielszene:
level1Scene.physicsWorld.contactDelegate = self
Ich habe versucht, dies jetzt für zwei Tage zur Arbeit zu kommen, ohne Erfolg. Als ich mit Sprite Kit arbeitete, konnte ich fast immer relevante Beiträge zu meinem Problem finden und selbst wenn ich meine Frage posten würde, würde ich eine Antwort bekommen. Aber Scene Kit ist nicht so populär, denke ich und ich kann nichts finden.
Wenn Sie wissen, wo ich falsch liege oder wie die Kollision im Code erkannt werden könnte, bitte sagen Sie mir.
Ich dachte, was das Problem war. Ich habe viele Wand Referenz Knoten und sie alle haben den gleichen Namen, also habe ich Physik Körper auf nur einer von ihnen eingestellt und der Rest wurde ohne es verlassen. Ich löste das Problem, indem ich alle untergeordneten Knoten aufzählte und diese Eigenschaften auf solche mit diesem Namen einstellte, aber ich war skeptisch, ob dies ein guter Weg ist. Ich habe 200 Wände, also wenn ich die Schleife führe, wo ich den Physikkörper für jeden von ihnen einstelle, wird das Gleiche 200 Mal wiederholt. Wäre es besser, wenn ich den Physikkörper der Wand direkt auf die Wand in der Datei setze, von der aus er referenziert wird? – Larisa
Ich kann nicht sehen, wie es die Leistung in irgendeiner Weise beeinträchtigt. Ich würde es eher als eine Frage der Bequemlichkeit sehen. Wenn Sie diese Parameter in der Quell-SCN-Datei festlegen, bedeutet dies, dass alle Wände die gleichen Eigenschaften haben, während die Einrichtung in Code Ihnen eine gewisse Flexibilität bietet. Vielleicht möchten Sie, dass einige Wände mehr Sprungkraft haben als andere oder zu einer anderen Kollisionskategorie gehören ... Dennoch wäre es sinnvoll, einige physikalische Standardeigenschaften einzubeziehen. – lock