ähnlich eine Frage, die ich here Beiträge geschrieben habe, bin ich jetzt erkennen, dass das Problem trivial ist, dass ich erwartet, da dies für einige Elemente von GameplayKit
anderen aber nicht funktioniert ..GameplayKit GKPolygonObstacle Nicht Arbeiten mit GKGoal
I habe ein Hindernis, ein SKNode
, das ich versuche zu definieren, wie ein GKPolygonObstacle
, der von einem Agenten verwendet werden kann, ein GKAgent2D
, als ein Hindernis zu vermeiden, wenn ich in einem SKScene
Ich habe eingerichtet.
Ich habe in zu Apple's AgentsCatalog schaute, um zu sehen, wie sie GKObstacle
mit einem Agenten in der GameplayKit
Methode verwenden:
goalToAvoidObstacles:(nonnull NSArray<GKObstacle *> *) maxPredictionTime:(NSTimeInterval)
Wenn ich den folgenden Code in meinem eigenen Projekt verwenden GKCircleObstacle
Objekte zu erstellen, ich, dass die finden Agent ganz schön navigiert herum und vermeidet diese kreisförmigen Hindernisse ganz schön abhängig von dem Gewicht gebe ich es (Wichtigkeitsgrad). Hier
ist der Code, den ich verwende:
NSArray<GKObstacle *> *obstacles2 = @[
[self addObstacleAtPoint:CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame) + 150)],
[self addObstacleAtPoint:CGPointMake(CGRectGetMidX(self.frame) - 200,
CGRectGetMidY(self.frame) - 150)],
[self addObstacleAtPoint:CGPointMake(CGRectGetMidX(self.frame) + 200,
CGRectGetMidY(self.frame) - 150)], ];
enemy.avoidGoal = [GKGoal goalToAvoidObstacles:obstacles2 maxPredictionTime:1];
[enemy.agent.behavior setWeight:100 forGoal:enemy.avoidGoal];
Mit dem folgenden Verfahren, das schafft und fügt diese Hindernisse: (dies direkt von der Apple-Quellcode für die AgentsCatalog gezogen wird)
- (GKObstacle *)addObstacleAtPoint:(CGPoint)point {
SKShapeNode *circleShape = [SKShapeNode shapeNodeWithCircleOfRadius:50];
circleShape.lineWidth = 2.5;
circleShape.fillColor = [SKColor grayColor];
circleShape.strokeColor = [SKColor redColor];
circleShape.zPosition = 1;
circleShape.position = point;
[self addChild:circleShape];
GKCircleObstacle *obstacle = [GKCircleObstacle obstacleWithRadius:50];
obstacle.position = (vector_float2){point.x, point.y};
return obstacle;
}
Das funktioniert gut, wenn der Gegner diese Kreise vermeidet, während er versucht, sich an eine bestimmte Position in der Szene zu bewegen.
AUSGABE
Wenn ich durch die Verwendung GKPolygonObstacle
Objekte anstelle der GKCircleObstacle
Objekte dieses GKGoal
Verhalten nachzubilden versuche, können die feindlichen Agenten nicht scheinen, um die Polygon Hindernisse zu identifizieren, als Hindernisse für das Verhalten Ziel zu vermeiden. Hier ist, wie ich diese Hindernisse hinzufügen bin versucht:
NSArray<GKObstacle *> *obstacles = [SKNode obstaclesFromNodePhysicsBodies:innerMapArray];
// Take this array of GKPolygonObstacle objects and add it
// to the GKGoal of the enemy as obstacles to avoid
enemy.avoidGoal = [GKGoal goalToAvoidObstacles:obstacles maxPredictionTime:1];
[enemy.agent.behavior setWeight:100 forGoal:enemy.avoidGoal];
Was die meisten frustrierend über dieses ist, ist, dass ich weiß, dass das Array richtig ein NSArray
von GKPolygonObstacle
Objekte schafft, wie ich diesen Ansatz für Wegfindung verwendet haben, als auch (bevor ich mich entschied, GameplayKit
schmerzhaft zu implementieren und es Ziele suchen, vermeiden und wandern). Hier ist, wie ich mit diesem innerMapArray:
- (NSArray *)findPathWithNode:(SKNode *)nodeToFindPath {
NSArray *obstacles = [SKNode obstaclesFromNodePhysicsBodies:innerMapArray];
GKObstacleGraph *graph = [GKObstacleGraph graphWithObstacles:obstacles bufferRadius:35.0f];
// Set up enemy and target
GKGraphNode2D *target = [GKGraphNode2D nodeWithPoint:vector2((float)character.position.x, (float)character.position.y)];
GKGraphNode2D *enemy = [GKGraphNode2D nodeWithPoint:vector2((float)nodeToFindPath.position.x, (float)nodeToFindPath.position.y)];
[graph connectNodeUsingObstacles:enemy];
[graph connectNodeUsingObstacles:target];
/// Create tracking path
NSArray *pathPointsFound = [graph findPathFromNode:enemy toNode:target];
return pathPointsFound;
}
Diese Methode ganz gut die Punkte gibt, an denen der effizienteste Weg umfassen sollte Hindernisse zu umgehen ich den Feind sage zu vermeiden, wenn sie versuchen, eine Position zu erreichen, .
- Die eigentliche Frage ist: warum die
GKGoal
GKCircleObstacle
Objekte akzeptieren, aber nichtGKPolygonObstacle
Objekte?
Wenn jemand mir helfen, herausfinden, wie diese SKNode
Objekte in akzeptable Hindernisse zu konvertieren, die mit den GKGoal
registrieren würde ich sehr dankbar sein. Vielen Dank.
Leider ist dieses Verhalten nicht auf den Grenzknoten angelegt wird, die ich habe ... –
Interessant -> Ich habe das entgegengesetzte Verhalten t <10 fein gearbeitet, aber t> = 10 nur alles – ColdSteel
ignorierte Ich wünsche, hatte Apple erzeugte eine etwas gründlichere Plattform. Es hat ein großes Potenzial, nur nicht richtig ausgeführt die ersten gehen herum. hoffe auf ein update bald .. –