我正在學習一個俄羅斯方塊的教程,當時它要求將預制板陣列作為產卵器物件的一部分。產卵器將隨機創建形狀,如I形、T形等。這些形狀就是prefabs。
public class Spawner : MonoBehaviour {
public GameObject[] blocks;
//...。
}
這種設定將在檢查器中制作一個自定義欄位,在那里我可以放入所有可能產生的形狀。然而,這讓我想到,如果我有1000個形狀怎么辦?肯定有比填入1000個預制板更好的方法?我可以在沒有檢查器的情況下初始化陣列嗎?
謝謝你的時間。
uj5u.com熱心網友回復:
使用檢查器,這實際上是很容易的:
選擇你的1000個預制件。
選擇你的1000個預制板-> 將它們全部拖到檢查器中的串列/陣列的名稱上
。=> 它們都會作為新的元素被添加到串列/陣列中(據說是按照它們被選中的順序)......還有什么比這更簡單的呢? ;)
uj5u.com熱心網友回復:
當然,你可以不使用檢查器來初始化prefabs。你必須知道你的prefabs的目錄路徑,以便能夠將它們加載到你的陣列中。例如,你可以通過這幾行加載TShapedBlockPrefab。順便說一下,你想使用的任何目錄都應該在資源檔案夾下,在這個例子中,Prefabs檔案夾就在Unity的資源檔案夾下。
var path = "Prefabs/Shapes/TShapedBlockPrefab"
blocks[0] = Resources.Load<GameObject>(path)。
uj5u.com熱心網友回復:
有幾件事。是的,你可以拖放多個。接下來,你應該創建名為SpawnSettings或其他名稱的ScriptableObject自定義類,用于類似的事情。ScriptableObjects存在于專案中,你可以修改它們的設定而不用擔心哪個場景是開放的。只要讓你的組件有一個公共的SpawnSettings設定;參考(并將你的自定義ScriptableObject拖入該領域的檢查器中)。修改可腳本屬性比在場景中的游戲物件上修改屬性要方便得多。最后,你可以寫一個自定義的編輯器選單項來自動完成你所描述的任務--下面是一些示例代碼。當你有一個屬性為[MenuItem]的靜態方法時,它將顯示在你指定的Unity選單下,如下面的例子。它最終會出現在Tools選單上,然后在Grasslands下。
[MenuItem("Tools/Grasslands/Import Recipes (must be in GameUI scene with CraftManager)"]。
private static void ImportRecipes()
{
if (!CraftManager.Instance)
{
Debug.LogError("沒有找到CraftManager物件,你必須切換到GameUI場景"/span>)。
return;
}
Undo.RecordObject(CraftManager.Instance, "Imported Crafting Items")。
var mainpath = "Assets/Grasslands" ;
var guids = AssetDatabase.FindAssets("t:CraftRecipeDefinition") 。
print($"發現CraftRecipeDefinition。{guids.Length} total")。)
CraftManager.Instance.Recipez = new CraftRecipeDefinition[guids.Length]。
List<CraftRecipeDefinition> items = new List<CraftRecipeDefinition>()。
int total = 0;
foreach (var guid in guids)
{
var path = AssetDatabase.GUIDToAssetPath(guid)。
if (!path.Contains(mainpath))
繼續。
try; try
{
var item = AssetDatabase.LoadAssetAtPath<CraftRecipeDefinition>(path);
items.Add(item);
總計 。
}
catch (System.Exception ex)
{
Debug.LogError($"Exception importing itemdefinition [{path}]。{ex.Message}")。)
}
}
items.Sort()。
for(int i=0; i<items.Count; i )
{
var item = items[i];
//item.Id = i 1;
//EditorUtility.SetDirty(items[i]);
if (items.Any(x => x.Id == item.Id))
{
Debug.LogError($"Duplicate ID for [{item.name}] - SetId已經被呼叫,現在已經修復。")。
item.SetId()。
EditorUtility.SetDirty(item)。
}
}
CraftManager.Instance.Recipez = items.ToArray()。
print($"------ Imported Crafting Recipes: {total} total --------")。)
EditorUtility.SetDirty(CraftManager.Instance)。
EditorSceneManager.SaveOpenScenes()。
AssetDatabase.SaveAssets()。
}
CraftManager使用了常見的Unity Singleton模式,它只是給了它一個.Instance屬性,所以你可以從任何地方輕松參考它。我檢查以確保我們在正確的場景里有一個CraftManager游戲物件。然后我抓取專案中所有的CraftRecipeDefinition自定義腳本物件,并將它們添加到一個簡單的串列中,然后進行排序,最后分配給CraftManager.Instance.Recipez屬性。 在我的例子中,Recipez只是一個公共的List Recipez。 所以是的,你可以撰寫自定義編輯器選單項腳本,運行并修改你場景中的任何東西,包括用你使用UnityEditor命名空間提供的AssetDatabase.FindAssets()方法從專案資產中抓取的專案替換List<>s。這很簡單,FindAssets()回傳一個UniqueId字串的串列,我們需要做一個呼叫,將資產加載到記憶體中(我們指定將其鑄成的型別),然后我們可以將其添加到List<>中。 注意,像這樣的選單項腳本應該用#if UNITY_EDITOR #endif的方式進行編碼,這樣當你構建EXE時,它就不會破壞你的構建。 你應該研究一下Unity Singleton Pattern和Scriptable Objects。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329089.html
標籤:
下一篇:統一中的放大和縮小
