gpt4 book ai didi

ios - GameplayKit GKPolygonObstacle 不适用于 GKGoal

转载 作者:搜寻专家 更新时间:2023-10-30 20:14:24 24 4
gpt4 key购买 nike

类似于我发布的问题 here ,我现在意识到这个问题比我预期的更微不足道,因为这适用于 GameplayKit 的某些元素,但不适用于其他元素..

我有一个障碍物,一个 SKNode,我试图将其定义为一个 GKPolygonObstacle,它可以被代理使用,一个 GKAgent2D,作为在我设置的 SKScene 中移动时要避免的障碍。

我调查了Apple's AgentsCatalog看看他们如何在 GameplayKit 方法中使用 GKObstacle 和代理:

goalToAvoidObstacles:(nonnull NSArray<GKObstacle *> *) maxPredictionTime:(NSTimeInterval)

当我在自己的项目中使用以下代码创建 GKCircleObstacle 对象时,我发现代理可以很好地导航并避免这些圆形障碍,具体取决于我赋予它的权重(重要性级别)。

这是我使用的代码:

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];

使用以下创建和添加这些障碍的方法:(这是直接从 Apple 的 AgentsCatalog 源代码中提取的)

- (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;
}

这很有效,因为敌人在试图移动到场景中某个不断变化的位置时会避开这些圆圈。

问题

当我试图通过使用 GKPolygonObstacle 对象代替 GKCircleObstacle 对象来重新创建此 GKGoal 行为时,敌方代理似乎无法识别多边形障碍作为行为目标要避免的障碍。以下是我尝试添加这些障碍的方式:

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];

最令人沮丧的是,我知道数组正确地创建了 GKPolygonObstacle 对象的 NSArray,因为我也使用这种方法进行寻路(在我决定痛苦地实现 GameplayKit 之前,它是寻求、避免和徘徊的目标)。以下是我如何使用此 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;
}

此方法非常好地返回最有效路径应包括的点,以绕过我告诉敌人在尝试到达某个位置时要避开的障碍物。

  • 所以真正的问题变成了:为什么 GKGoal 接受 GKCircleObstacle 对象而不是 GKPolygonObstacle 对象?

如果有人能帮我弄清楚如何将这些 SKNode 对象转换为可以接受的障碍,并在 GKGoal 中注册,我将非常感激。谢谢。

最佳答案

这是一个非常奇怪/简单的答案,恐怕我现在遇到了被敌人避开的障碍(至少不是..)。

  • 将用于避开障碍物的 GKGoal 设置得非常 maxPredictionTime (t < 10) 似乎可以让代理完全忽略障碍物。任何 10 或更大的预测时间 + 100+ 的权重似乎都会导致正确的行为。

关于ios - GameplayKit GKPolygonObstacle 不适用于 GKGoal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38574611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com