C# Unity2D:禁用订单中的实例化预置

C# Unity2D:禁用订单中的实例化预置,c#,unity3d,instantiation,C#,Unity3d,Instantiation,我创建了一个脚本,它可以实例化各种不同的预置,也可以实例化多个相同的预置,这些预置成为我称之为slot的父游戏对象的子对象。一旦生成,每个预设都有一个特定区域的设置转换位置,所以如果我想让我的脚本在同一个预设的3个中生成,比如说在我的场景中生成预设1,那么所有三个预设1都将具有相同的转换位置,它将层叠在一起,并且也是插槽的子对象。但是如果我在Prefable2的第4个中产卵,那么Prefable2的起始位置将与Prefable1不同,但设置在Prefable1的同一个父级下……希望我讲得通!我想

我创建了一个脚本,它可以实例化各种不同的预置,也可以实例化多个相同的预置,这些预置成为我称之为slot的父游戏对象的子对象。一旦生成,每个预设都有一个特定区域的设置转换位置,所以如果我想让我的脚本在同一个预设的3个中生成,比如说在我的场景中生成预设1,那么所有三个预设1都将具有相同的转换位置,它将层叠在一起,并且也是插槽的子对象。但是如果我在Prefable2的第4个中产卵,那么Prefable2的起始位置将与Prefable1不同,但设置在Prefable1的同一个父级下……希望我讲得通!我想做的是: 是否有一种方法可以将所有实例化的预置设置为active false,但保留生成的所有不同预置中的一个,例如:

我想将我在图像上方绘制的这个黑框中的所有prefact1和prefact2设置为false,并将一个prefact1和prefact2设置为true,如果prefact1/prefact2被冲突删除,那么我希望下一个prefact1/prefact2设置为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来做类似的事情。这里有一个例子。课堂上的东西是你的预制件

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

顺便说一句,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;
        }
    }
}

谢谢你的回复,我想知道如何在我的游戏中实现这个例子?我是创建一个新的C还是将它放在脚本中并附加到插槽中?对不起,我以前从未做过这样的事!再次感谢您的帮助,我真的很感激!:DAlso我应该用预置的名称替换1和2字符串名称吗?这不是复制粘贴解决方案。如果你想的话,这更像是一个方向。您必须对.NET框架中的列表和词典进行一些研究。基本上,在实例化预置之后,您将在适当的键值下将其添加到字典中。在您的示例中,prefable1将像prefables[1]一样添加;
prefab 1  active = True
prefab 1  active = False
prefab 2  active = True
prefab 2  active = False
prefab 2  active = False