簡體   English   中英

Unity2D:禁用訂單中的實例化預制件

[英]Unity2D: Disable instantiated prefabs in an order

我創建了一個腳本,該腳本可實例化各種不同的預制件(也可以實例化同一預制件中的多個預制件),從而成為我稱為插槽的父代(游戲對象)的子代。 生成每個預制件后,都會在某個區域設置一個固定的變換位置,因此,如果我要讓腳本在場景中的同一預制件(例如prefab1)的3個中生成,則所有三個prefab1都將具有相同的變換位置( (彼此疊放),並且也是該廣告位的孩子。 但是說,如果我在prefab2的4個中生成,則prefab2與prefab1會有不同的開始位置,但是被設置為與prefab1相同的父對象...希望我很有意義! 我想做的是:有沒有一種方法可以對所有實例化的預制件都設置為false,但是保留所有生成的預制件中的一個,例如:

在此處輸入圖片說明

我想將我在圖像上方繪制的黑匣子內的所有prefab1和prefab2設置為false,如果將prefab1 / prefab2設置為true,則我希望將下一個prefab1 / prefab2設置為true。設置為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來做這樣的事情。 這是一個例子。 “事物”類將是您的預制件。

基本上,您擁有每種預制件的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM