[Unity] AniMate.boo轉型

這是一篇很冗長的文章。

前言


因為要將 android的遊戲移植到Windows Store app上,今日遇到了相當大的困難。

首先是雖然成功將原先一堆使用Hashtable和ArrayList的型別轉換成Dictionary和List了,但是仍然在輸出成Xaml c# Solution時遇到有關Hashtable的問題。

WMC9999 在模組mscolib.dll中找不到型別System.Collections.Hashtable。

有關這個問題,網路上只有兩篇比較相關的:和二。第一篇裡面有一些提示:

  1. 可能跟由舊版unity到新版unity有關
  2. 移除boo.lang.dll然後組態改x86。
問題是當我移除boo.lang.dll會出現更多的問題,讓我不禁想到會不會是我裡面還是有.boo的檔案?事實上還是有,只是我並沒有使用他,就是Ani.boo。好像是支援動畫的腳本。

改寫Ani.boo


本來我想說要把Ani.boo裡面眾多疑似Hashtable的檔案改寫成Dictionary,但我發現這好困難啊。

首先來看一下boo裡面Dictionary的寫法:

Dictionary[of object, object];

但我好像沒有成功,此時,發現有人提供他改寫的AniMate.boo檔,他轉成C#的格式(本文),然後我把裡面全部的Hashtable改成Dictionary<object, object>。

除此之外,還有兩件事情要注意。第一個是Hashtable的淺層複製方法Clone,相對應於Dictionary,請參考範例(連結):

比方說要把製作一個dic1的淺層副本名叫dic2:

Dictionary<string, string> dic1 = new Dictionary<object, object>();
dic1.Add("title", "item");
Dictionary<object, object> dic2 = new Dictionary<object, object>(dic1);



後來使用To方法時,遇到了找不到key的窘境:The given key was not present in the dictionary.

找了一下,發現一直在某一行就有問題,是ExtractOptions方法的第一個if判斷句,猜想應該是沒有這個key,但是判斷句的想法會自動假設成有的樣子,就增加了ContainKey()來判斷有無這個key,結果成功了。

後來改成這樣子:


if (options.ContainKey("delay") || options["delay"] == null) { exct["delay"] = defaultDelay; } else { exct["delay"] = (float)options["delay"]; options.Remove("delay"); }


以下皆同,就不貼了。

留言