主題

【Unity x C#】在Unity裝NuGet程式庫、用AutoMapper複製ScriptableObject

趴趴鼠Loading | 2021-03-18 23:54:43 | 巴幣 26 | 人氣 88

前言:
和朋友討論做個卡牌遊戲,規則差不多定好了,先別問XD。
是程式也是美術,夠爆肝,但很有趣...



NuGet
NuGet介紹()《NuGet作為Visual Studio擴展,能夠簡化在Visual Studio項目中添加、更新和刪除庫(部署為程序包)的操作。》 簡單說就是VS直接抓程式庫的工具。

直接抓下來的程式庫在Unity裡面會編譯不過,需要透過這個套件去抓。

AutoMapper
Nuget裡面的一個程式庫,之前在想"複製Class的方法",意外在這篇文章看到它。


ScriptableObject
一種Unity獨特的setting檔,參考
除了上面參考提到的好處,它有個哭笑不得的點是: 假設A腳本會使用到某個setting檔 B,若A把B的HP扣至0,則B的setting檔就會是0,下次再召喚B的時候它的HP還是0,直到遊戲關掉setting檔重置(所以ScriptableObject也不能拿來做存遊戲進度,至少要寫個存檔的腳本在遊戲關掉前寫出它的值)。

為了避免上面的情況發生,所以我每次召喚卡片時須先把B的setting檔複製一份。
在Instance 卡片的時候呼叫Init方法。

這樣該卡片的setting檔就是一個副本,//Test的只是用來驗證。


現在在想個問題,卡片死亡時它的setting檔副本該寫個回收機制去回收,重新貼上正本的資料方便下次召喚時使用,還是不管它了,直接一張卡片一個副本?



後記:
腦袋還是好亂= =

創作回應

is樂小呈
拿 ScriptableObject 是直接對資料夾物件的引用,所以一改就會引想到其他用的人,他比較適合存固定的數據[e19]
2021-03-19 10:26:24
is樂小呈
話說也不應該直接條ScriptableObject 的數值,你可以用一個卡牌容器去接數值,ScriptableObject永遠只讀就不會有問題,容器只需要用完就回收重置,這樣還有免費的物件池可以用
2021-03-19 10:33:15
趴趴鼠Loading
感謝建議,我是想說容器和ScriptableObject有相似的屬性,讓容器有點多餘(?) 若直接複製Scriptable副本是否就可以當容器使用了
2021-03-19 13:33:38
甜在心饅頭
同上,把scriptable object 作為設定檔使用就好,另外寫一個結構或者類別來存這份資料,牌庫的初始化則可以先把全部的設定檔建成一個字典,索引 key 是卡片序號,value 則是上面的結構或者類別,這樣不論誰拿出來的卡片資料都是一樣的,而且只要改設定檔就全部套用。
2021-03-19 10:55:55
趴趴鼠Loading
直接在初始化把卡片序號讀進字典檔這想法不錯耶[e12] 這樣要召喚卡牌的話直接傳id跟字典要求卡片就好。
2021-03-19 13:38:12
趴趴鼠Loading
我現在是直接從Resources.load讀取。
2021-03-19 13:39:28
is樂小呈
應該說重點是容器的"重用"吧?
你Clone的時候等於建立的新的變量(新的記憶體位置)把她和原始資料分離,但等你用完資料後這個變量就扔了 (釋放記憶體 GC)
我容器的意義就在這裡,實例化之後需要用就讀入這些資料,同樣可以達到和原始分離的目的,但差別是容器可以被回收,沒用到就關著,要用的時候在初始化,因為只需要修改數據所以無論用幾次他都是佔同一段記憶體位置
2021-03-22 16:42:45
is樂小呈
不過這也是我猜測拉,我看他資料沒寫到GC相關的才這樣說,你可以自己用 profiler 測測看有沒有GC
2021-03-22 16:44:01

相關創作

更多創作