Unity2D:在订单中禁用实例化的预制件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity2D:在订单中禁用实例化的预制件相关的知识,希望对你有一定的参考价值。
我创建了一个脚本来实例化各种不同的预制件(也可以实例化多个相同的预制件),这些预制件成为我称为插槽的父(游戏对象)的子节点。一旦产生,每个预制件都有一个设定的转换位置到某个区域,所以如果我想让我的脚本在同一个预制件(比如prefab1)的3个中生成到我的场景中,那么所有三个预制件将具有相同的转换位置(它会在彼此之上分层)并且也将成为插槽的孩子。但是说如果我在prefab2中产生4,那么prefab2与prefab1相比会有不同的起始位置,但是设置在与prefab1相同的父级下...希望我有意义!我想做的是:有没有办法设置所有实例化预制件的假活动,但保留所有生成的不同预制件之一,例如:
我想把这个黑框中的所有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:在订单中禁用实例化的预制件的主要内容,如果未能解决你的问题,请参考以下文章