【问题标题】:Selecting random positions from array without duplicates从数组中选择随机位置而不重复
【发布时间】:2017-09-22 22:29:39
【问题描述】:

在我的游戏中,有很多敌人,上面有这个脚本,我通过从位置数组中随机选择一个元素来设置他们的导航网格目标。但是,有时所有敌人都在同一个位置,所以我试图跳过以前生成的数组索引并找到一个新索引。对此有什么建议吗?我不想使用goto 语句。

这是我到目前为止所做的代码:

void move_on_fired_positions()
{
    navmesh.Resume ();
  again:
    new_position = Random.Range (0, firedpoints.Length);

    if (prev_num != new_position) {
        navmesh.SetDestination (firedpoints [new_position].position);
        prev_num = new_position;
    } else 
    {
        goto again;
    }
}

【问题讨论】:

  • 嗯,有一个解决方案的想法 - 但要澄清一下,firedpoints 是什么?它是如何填充的,一旦敌人移动到其中一个位置,是否应该认为其他敌人在游戏的剩余时间里无法使用它,或者是否有某种条件可以释放它以再次使用?
  • 是的,一旦一个敌人移动到其中一个位置,那么其他敌人应该无法使用它,并且没有条件可以将其释放以再次使用(也需要该条件)并且射击点是公开的变换数组,在检查器中分配。 @Serlite
  • 我在想,必须有一个 position_distributor 类,它有 next_position 方法(返回新位置的变换),并且 navmesh,setdestination 调用这个分发器类方法来获取新位置。但由于初学者,我无法做到这一点:-(

标签: c# unity3d unity5


【解决方案1】:

您可以尝试的一件事是保留可用职位的动态列表,而不是数组。 (不用担心 - 它们在 Unity 编辑器界面中以相同的方式进行序列化和修改。)这样,您可以在分配给敌人时从列表中删除位置,确保您永远不会分配重复项。以下是关于它的外观的想法:

public List<Transform> firedpoints;

// Returns available firing position, if any
public Transform GetRandomFiringPosition()
{
    if (firedpoints.Count > 0)
    {
        // Get reference to transform, then remove it from list
        int newPositionIndex = Random.Range (0, firedpoints.Length);
        Transform returnedPosition = firedpoints[newPositionIndex];
        firedpoints.RemoveAt(newPositionIndex);
        return returnedPosition;
    }
    else
    {
        // Or you can specify some default transform
        return null;
    }
}

// Makes firing position available for use
public void RegisterFiringPosition(Transform newPosition)
{
    firedpoints.Add(newPosition);
}

这段代码应该在场景中单个对象的脚本中,敌人应该可以引用该对象(或者,您可以稍微更改代码并使类成为单例,因此可以调用其方法没有直接参考)。每当敌人需要一个新的位置时,它可以调用GetRandomFiringPosition()并将返回的Transform存储在一个变量中以供将来参考。

您尚未确定哪些条件可以再次使用某个职位,但如果您确定了,您可以致电RegisterFiringPosition() 将其重新添加到列表中。作为一个很好的副作用,这还可以为敌人分配全新的位置,例如响应玩家触发的事件。

希望这会有所帮助!如果您有任何问题,请告诉我。

【讨论】:

  • 是的,非常感谢,您帮帮我。你给了我正确的道路。再次感谢。 :-)
猜你喜欢
  • 2016-02-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多