GKGoal 避免边界障碍

Wil*_*ich 7 objective-c game-physics ios sprite-kit gameplay-kit

我似乎很难将我的精灵节点保持在我通过以下方式设置的地图边界内:

我有一个SKNode *enemy是围绕移动SKScene通过的目标和行为礼貌GameplayKit从iOS版9.目前的节点飘荡,避免障碍物被定义GKPolygonObstacle对象。我设置了我的位掩码,以便任何障碍物都被认为是类别wall,节点被告知要与之碰撞(AKA 不允许通过)。

在我中,didBeginContact:(SKPhysicsContact *)contact我正在处理这些碰撞。一切都按计划进行,手动移动这个敌人时没有问题。

然而,当我让敌人通过一个SKGoal *wanderGoal设置在场景中四处游荡时,问题就开始了。

    // Low --> 0.5     Lowest --> 0.25
    enemy.wanderGoal = [GKGoal goalToWander:low];
    [enemy.agent.behavior setWeight:lowest forGoal:enemy.wanderGoal];

    // Add obstacles to avoid for each of the inner map nodes
    // that act as impassible areas for the enemy to pass through.
    NSArray *obstacles = [SKNode obstaclesFromNodePhysicsBodies:innerMapArray];

    /** This goal does not change --> enemies will ALWAYS
     avoid the obstacles in the level map. This should always 
     be set to the highest priority of the enemy goals
     */
    enemy.avoidGoal = [GKGoal goalToAvoidObstacles:obstacles maxPredictionTime:10];
    // Highest --> 250
    [enemy.agent.behavior setWeight:highest forGoal:enemy.avoidGoal];
Run Code Online (Sandbox Code Playgroud)

敌人按预期随机移动,并且大部分时间似乎都在避开障碍物……但有时敌人确实会穿过地图障碍物。让我扩展一下:

地图屏障本质上是一个矩形,我设置了 2 个节点,它们充当外壳,代表此形状的左半部分和右半部分。这些节点的厚度为 100 点,因此它们不仅仅是CGPath参考,而是形状。它们充当这两个括号的作用:[](我的两半在中间齐平接触)。

我的问题是这样的:

  • 如何通过使用带有位掩码类别的物理或目标行为来防止敌人穿过这些障碍物?(或两者兼而有之)

我知道虽然 aGKGoal是建议的行为,但它并不能保证达到这个目标(但它可以有大约 95% 的把握不会发生,如Apple 的 AgentsCatalog所示)。但是,我不明白的是为什么敌人不会简单地沿着边界的边缘“滑动”,因为目标告诉它(尝试)“穿过”这样的边界。

当我在场景中手动移动敌人时,确实会发生这种“滑动”行为,并且当我试图将其移动通过被视为障碍物的边界时,它会向我移动的方向滑动(就像任何视频游戏一样)有地图边界)。

所以

如果有人可以帮助我防止这种情况发生/解释如何防止敌人穿过这些(据说)“无法通行”的区域,我将不胜感激。

仅供参考:如果您不清楚我所描述的内容/我是如何创建任何对象的,请询问,我会提供更多信息来提供帮助。