问题描述
如何限制一个随机预制件仅使用一次,但与其他对象顶部的一堆阵列预制件随机放置?
<!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);
}
}