如何限制一个随机预制件仅使用一次,但将一大堆阵列预制件随机放置在其他对象之上?

问题描述

如何限制一个随机预制件仅使用一次,但与其他对象顶部的一堆阵列预制件随机放置?

<!DOCTYPE html>
<html lang="en">
  <head>
    ...
  </head>
  <body>
    <script src="node_modules/impress.js/js/impress.min.js"></script>
    <script src="scripts/global.js" type="module"></script>
  </body>
</html>

解决方法

我理解你的问题的方式是你最多想实例化 memberRoomPrefabArray 中的每个元素一次。 您可以创建一个作为 memberRoomPrefabArray 副本的临时列表,并删除在下一个循环周期之前实例化的每个元素。

/**
 * Waypoint to be drawn on the map
 */
public class Waypoint extends DefaultWaypoint {
    protected JLabel label;
    private final long id;
    private final EntityType type;

    public Waypoint( long id ) {
        this.id = id;
        this.type = null;
        this.label = null;
    }

    public Waypoint( long id,EntityType type,Location coord ) {
        super( locToGeoPos(coord) );
        this.id = id;
        this.type = type;
        this.label = new JLabel();
    }

    public void setIcon( ImageIcon icon ) {
        label = new JLabel( icon,JLabel.CENTER );
        label.setBorder( new LineBorder(Color.BLACK) );

      }

    public void setBackgroundColor( Color bgrColor ) {
        label.setOpaque( true );
        label.setBackground( bgrColor );
    }

    public void setToolTipText( String tooltipText ) {
        label.setToolTipText( "<html>" + tooltipText + "</html>" );
    }

    public JLabel getLabel() {
        return label;
    }

    public void annotateIcon() {
        // TODO
    }

如果 void Start() { List<GameObject> temp = new List<GameObject>(memberRoomPrefabArray); foreach (GameObject localWood in memberWoodArray) { int localRoomIndex = Random.Range(0,temp.Count); Instantiate(temp[localRoomIndex],localWood.transform.position,Quaternion.identity); temp.RemoveAt(localRoomIndex); } } 可能比 if (temp.Count == 0) { break; } 短,您可能需要添加一些检查,例如 memberRoomPrefabArray

编辑:将 memberWoodArray 更改为 Random.Range(0,temp.Count - 1),因为显然,它仅最大程度地包含浮点数而不是整数。

,

您宁愿“洗牌”一次数组,然后迭代洗牌后的数组,例如使用 Linq OrderBy 并使用 Random.value 作为 order like

using System.Linq;

...

void Start()
{
    if(memberRoomPrefabArray.Length < memberWoodArray.Length)
    {
        Debug.LogError($"Not enough prefabs available for {memberWoodArray.Length} unique spawns!",this);
        return;
    }

    // as the method names suggest this will be a randomized array of the available prefabs
    var shuffledPrefabs = memberRoomPrefabArray.OrderBy(m => Random.value).ToArray();
    for (var i = 0; i < memberWoodArray.Length; i++)
    {    
        // Since the array is already shuffled we can now go by consecutive order
        Instantiate(suffledPrefabs[i],memberWoodArray[i].transform.position,Quaternion.identity);
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...