Unity2D:在订单中禁用实例化的预制件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity2D:在订单中禁用实例化的预制件相关的知识,希望对你有一定的参考价值。

我创建了一个脚本来实例化各种不同的预制件(也可以实例化多个相同的预制件),这些预制件成为我称为插槽的父(游戏对象)的子节点。一旦产生,每个预制件都有一个设定的转换位置到某个区域,所以如果我想让我的脚本在同一个预制件(比如prefab1)的3个中生成到我的场景中,那么所有三个预制件将具有相同的转换位置(它会在彼此之上分层)并且也将成为插槽的孩子。但是说如果我在prefab2中产生4,那么prefab2与prefab1相比会有不同的起始位置,但是设置在与prefab1相同的父级下...希望我有意义!我想做的是:有没有办法设置所有实例化预制件的假活动,但保留所有生成的不同预制件之一,例如:

enter image description here

我想把这个黑框中的所有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”课程将是你的预制件。

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

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

以上是关于Unity2D:在订单中禁用实例化的预制件的主要内容,如果未能解决你的问题,请参考以下文章

实例化的预制比例在客户端上未正确显示

Unity UI 缩放和实例化预制件

当我第二次实例化预制件时,为啥会出现错误?

Unity UI图像不改变颜色,尽管可选择禁用。

操作栏选项卡:使用多次实例化的单个片段时如何传递参数

通过代码 (C#) 在 Unity3D 中应用 Prefab 的实例覆盖