UIS裡初步製作分類和各品項完成後,接下來就要實際在Runtime時可以引用。
首先要試驗的環節為怪物身上有帶物品,物品會因為擊殺怪物後掉落。
試著利用參考範例的方式進行元件擺放
元件上最重要的應該是Inventory,這個元件看起來像是用預設的分類將道具分類擺放(概念上的)。圖中的Inventoryl裡有先預定三個分類
DebugLoadout應該是除錯時用的。而Main則是目前主要的分類,所有的道具都會先進入到這個分類裡,待道具被裝備後才會進入到Equipped裡。
試著加入元件時發現有好幾個點要進行,以手動方式拖拉有些花時間,再加上考量到之後當道具數量增加時勢必要進行以表格方式進入的轉換工作。故花了一些時間準備,試著將道具從定義好的Json格式讀入,製作成UIS的Item。
本當不是複雜的事但因為UIS撰寫的方式很奇特,所以花了不少時間了解怎麼進行。先將目前試出來的事記錄下來。
首先,UIS一定要放在Assets/Opsive目錄下。通常製作時會習慣把外掛擺在一個地方,不會讓Assets目錄下太多東西,這樣在找尋資料時,不會受干擾。但,如果是將UIS擺在其它地方,會導致在Project Rider或是Visual Studio裡找不到Reference。這點很有可能是因為UIS用asmdef且設定是以GUID為主。不改變UIS設定的奇怪下,只好讓它放在Assets目錄下。
由於ItemDefinition的Create是internal static,不能直接在Editor script進行引用,只能利用Reflection進行。參考了這篇
主要的寫法為
var methodInfo = typeof(ItemDefinition).GetMethod("Create", BindingFlags.Static | BindingFlags.NonPublic);
var itemDefinition = (ItemDefinition)methodInfo.Invoke(
null,
new object[]
{
"Item Name",
"Item Category",
null,
null,
null
});
特別注意的是原先的Create五個參數中後面三個都有預設值(null),如果正常引用時是可以不用寫進來的,但利用reflection時,則需要自行放入所有的參數。到這裡都還算是正常,但接下來的部份就花了很久的時間才了解怎麼進行。
首先是ItemDefinition是ScriptableObject,照理說直接用AssetDatabase.CreateAsset就可以,但這裡有個奇怪的地方,不確定是不是Windows平台才有的問題。如果path是利用Path.Combine接合起來的,則目錄間的連接是用"",但每次CreteAsset時都會有問題。花了一些時間才了解到要利用"/"才行。
var adjustedItemPath = itemPath.Replace("\\", "/");
在Mac或是Linux上應該不會有這個問題。不過就算是ScriptableObject順利的被存下來了,還是不能用。
這些已經在Project下的ScriptableObject,每次只要重開Unity Editor就不會出現在Item Defintions裡,也就是說二邊的資料是分離的。
又花了一些時間了解怎麼樣才能重開Unity Editor也保留這些資料。利用到處加Serialize和Initialize database的方式可以讓重開Unity Editor後也可以看得到。
看起來問題解決了,不過細看後才發現所有Override的Attribute資料都沒有進來。
又試了很多奇怪的方式,花了二個多小時,最後終於找到了
ItemDefinitionEditorUtility.AddItemDefinition()
ItemDefinition生成的所有的問題看起來都解決了。接下來就是利用ItemDefinition製作實際的道具。
ItemDefinition只是資料面,要能夠在遊戲中被看到,則必需利用GameObject加上元件,主要用到的元件
這二個元件定義了一個可以在場景裡可被看到的道具物件。而給予此物件不同概念的元件則包含了
如果是製作掉落在場景上可以被撿起來的Pickup,則額外加上
如果是製作可裝備的物件,則可以額外加上
和相關的行為(ItemObjectBehaviourhandler要拿一個繼承ItemObjectBehaviour的型別)
細節就要等等串連這些元件後才知道如何進行。