簡體   English   中英

從數組中選擇無重復的隨機位置

[英]Selecting random positions from array without duplicates

在我的游戲中,有很多敵人並且上面放着這個腳本,在這里我可以通過從一系列位置中隨機選擇一個元素來設置其導航目標。 但是,有時所有敵人都走在同一位置,因此我試圖跳過以前生成的數組索引並找到一個新索引。 有什么建議嗎? 我不想使用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;
    }
}

您可以嘗試做的一件事是保留可用職位的動態列表,而不是數組。 (不用擔心-它們在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()將其重新放入列表。 作為一個很好的副作用,這還使得可以為敵人分配全新的位置,例如,響應玩家觸發的事件。

希望這可以幫助! 如果您有任何疑問,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM