Unity2D:按顺序禁用实例化预制件

Unity2D: Disable instantiated prefabs in an order

我创建了一个脚本来实例化各种不同的预制件(也可以实例化多个相同的预制件),它成为我称为插槽的 parent(游戏对象)的 child。一旦生成每个预制件都有一个到特定区域的设置转换位置,所以说如果我想让我的脚本在我的场景中的 3 个相同的预制件(比如 prefab1)中生成,所有三个 prefab1 将具有相同的转换位置(它会层叠在一起)并且也将是插槽的 child。但是假设我在 prefab2 的 4 个中生成,那么 prefab2 与 prefab1 相比会有不同的起始位置,但设置在与 prefab1 相同的 parent 下......希望我是有道理的!我想做的事: 有没有一种方法可以将所有实例化的预制件设置为 false,但保留生成的所有不同预制件之一,例如:

我想将我在图像上方绘制的这个黑框中的所有 prefab1 和 prefab2 设置为 false,并将一个 prefab1 和 prefab 2 setactive 设置为 true,如果 prefab1/prefab2 被碰撞删除,那么我希望将下一个 prefab1/prefab2 设置为 true 等等。我再次希望我说得有道理……这是我在预制件中生成的代码:

 void Update () {
   for (int x = 0; x < slotController; x++) {
            var item = Instantiate (ItemPrefab) as GameObject;
            itemPrefab.transform.position = transform.position;
            itemPrefab.transform.SetParent (slot.transform);
            itemPrefab.SetActive (true);
            if (slot.childCount < 0) {
                slotHolder.SetActive (false);
            }
        }
    }

您可以使用集合和 LINQ 来做这样的事情。这是一个例子。 "Thing" class 将是您的预制件。

对于您拥有的每种类型的预制件,您基本上都有一个列表集合,以及一个存储所有这些列表的字典,并有一个访问它们的键。

(顺便说一句,Update 方法意味着您的代码将在每一帧发生,所以这可能不是一个好地方)

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        Dictionary<int, List<Thing>> prefabs = new Dictionary<int, List<Thing>>();

        // add a few items to the lists
        prefabs.Add(1, new List<Thing>(){ new Thing("Thing1"), new Thing("Thing1") });
        prefabs.Add(2, new List<Thing>(){ new Thing("Thing2"), new Thing("Thing2"), new Thing("Thing2") });

        var keys = prefabs.Keys;
        // set everything inactive except the first one
        foreach(int i in keys){
            prefabs[i].Skip(1).ToList().ForEach(x => x.active = false);
        }

        // print out the active state
        foreach(int i in keys){
            foreach(Thing t in prefabs[i]){
                Console.WriteLine("prefab " + i + "  active = " + t.active);
            }
        }
    }

    class Thing {
        public bool active = true;
        public String name = "";

        public Thing(String name){
        this.name = name;
        }
    }
}

结果:

prefab 1  active = True
prefab 1  active = False
prefab 2  active = True
prefab 2  active = False
prefab 2  active = False