Archive for the ‘技術筆記’ Category

解決在Unity安裝Facebook SDK後,Build Android App會出現錯誤的問題

Thursday, July 18th, 2019

之所以會出現錯誤,主要是因為Facebook SDK底下多了一個重覆的jar檔的關係…

解決方法:
1. 首先先將 Andorid Auto-Resolution關閉

2. 將 com.google.zxing.core-3.3.3.jar 檔刪除

3. 找到Project資料夾底下的ProjectSettings目錄,用文字編輯器打開 AndroidResolverDependencies.xml 這個檔案
4. 將 com.google.zxing.core-3.3.3.jar 這段mark起來即可

一個人獨立開發App七年回顧

Wednesday, December 20th, 2017

算一算,從離職後開始開發App到現在,也已經快七年了(我大概是2010年12月開始走上這條路的)… 距離前一篇文,隔了快五年了! 我的老天… 從一開始滿腔熱血,到失意喪志,然後再絕地重生(是不是應該拍成電影? XD)。這中間大概開發了八款App。越到後來,App的開發時間一款比一款久。

上一款開發的遊戲App – Galaxy Lord (賣的很差,已經下架了)

大概花了我超過一年半的時間開發。是我之前所有App裡開發最久的,結果得到的銷售成績,卻是所有App裡最慘的。之所以會花這麼多時間是因為… 約四年前,我搬離了台北,來到台南,做了一份兼職也是開發App & Web的工作(一開始是全職,但經過了幾個月後,我實在難以忘懷獨立開發遊戲的滋味…)。那時候在開發上已經遇到了瓶頸,不是技術上的瓶頸,而是心理上的瓶頸。覺得好像不管再怎麼努力,似乎都無法獲得到好成績,付出的心力與獲得的報酬完全不成正比。因此心裡實在很難過很灰心,想說還是先找一份工作做,下班時間再開發自己的App。這樣至少經濟上比較沒有壓力。

後來認真想過為什麼上一款遊戲會這麼慘,大概歸納了幾個原因(參考就好,因為我講的也不見得是對的):
1. 我不該一個人獨自開發一款”連線”遊戲。雖然它不是像一般市面上的online game那樣real-time的運作,但還是個非即時的online game。這意味著有非常非常多的細節,是必須很小心處理及控制的。因為只要一個小問題,可能就會讓遊戲整個沒辦法玩,或作弊玩家滿街跑。所以我花了比開發一個單機遊戲大概兩倍的測試及修改程式的時間,才能做出等量的遊戲內容。以致於開發時間過久…

2. 我不該想模仿一個熱門遊戲的玩法。那個熱門遊戲,其實我自己也玩了很久,也算是熱衷的玩家,覺得有些玩法應該可以改成怎樣做會更好玩。所以我便用我自己的方式,將別的遊戲的玩法,改成我自己覺得喜歡的方式(當然呈現上還是差很多,但核心的玩法蠻接近的)。但,我現在覺得,這樣做徹底錯了!! 為什麼? Indie Game Movie裡的Jonathan Blow曾經說過: 「做為一個獨立遊戲開發者,你不該試著要去跟大廠競爭。你要做的應該是做出一個非常具有個人特色的獨立遊戲來。」。我覺得他說的真的很對,如果你的遊戲跟大廠的遊戲很像… 那玩家為什麼要玩你的? 你敢保證你的遊戲有比大廠做的好玩? 大廠的開發資源(錢)比你多很多,人手一定也是你的好幾倍,你為什麼有信心做的贏人家? (除非你自認為是天踨英才 XDD)

3. 我不該將App下架了快半年。遊戲初期上架後,有幾個狂熱的國外玩家給了我一些遊玩後的回饋意見。建議我可以修改遊戲玩法。我覺得他講的有道理,於是想把整個遊戲的基礎玩法重新大改調整過。由於新的玩法差異實在太大,舊有的Server機制也必須大改才行。所以我決定將App先下架,直到我改好為止才重新上架。但,有做過這件事的開發者大概都會知道… 千萬別這樣做!!! 因為一旦你將App下架了許久之後,你的App也就真的徹底死了……… 就算重新上架,也幾乎完全沒有人可以找到你的App!

後來,在台南兼職工作的那間公司,運作的並不太順利。公司並沒賺到什麼錢,一直在燒錢。陸陸續續有一些員工離職了,最後只剩我一個人。而我也在家裡幫忙維護了公司的網路服務一陣子,不過最後還是離職了。離職後,其實我心裡一直很惶恐,不知道下一步要怎麼走。因為,已經有點年紀了,已經不是七年前還30出頭的年輕小伙子,不能再這樣找不到自己的人生方向了。如果自己獨立開發遊戲,一直沒做出好成績的話,那就要趁早轉換跑道,看要找新工作還是怎樣的。不過,我實在無法忘記自己當初選擇一個人獨立開發的初衷 – 我想要做出一款好玩的遊戲!! 一個讓玩家隔了十年後,還會想到有玩過的好玩的遊戲。我還是很想繼續獨立開發遊戲下去,直到我老到做不了為止。於是,我便跟老婆約定好,再做最後一款遊戲,如果又失敗,我就真的要去找工作了… 很慘,但也沒辦法,人生就是這樣,不是事事都能如意。

於是,前年十月(2015/10)左右,決定開發一款經營模擬類結合一些RPG元素,玩法還蠻特別的遊戲。因為我自己也很愛玩模擬城市、夢幻西餐廳這一類的遊戲,也很愛玩Diablo 2、魔法門這一類的遊戲。(遊戲的點子好像是我上廁所大號還是洗澡時亂想想到的… or 有人托夢給我?(真的有過 @@) 有點忘了… XD)。所以才有了現在這款 – 哥布林的道具屋(Android),今年九月上架在App Store和Google Play上。本來,這有可能是我的告別作了…….. Orz 開發的時間,從一開始點子發想到正式版上架,前前後後大概快兩年了。

到前天為止,剛好已經上架滿三個月了。這次的成績,總算獲得了還不錯的成果。沒有非常好,好到可以當爆發戶 XD。但至少可以讓我再維持一個人獨立開發下去一兩年了。這也是我第一個獲得Apple全球推薦的遊戲App(沒有橫幅,只有小icon,不過也不錯了)。也是我第一個同時上架在Google Play的遊戲App,在今年11月也獲得Google Play的台灣區推薦了。也是我第一次做群募的案子,不過沒成功就是。第一次參加巴哈姆特ACG創作大賽。第一次獲得巴哈姆特的遊戲節目報導。第一次即將參加2018的台北電玩展。

iOS下載曲線圖:

Android下載曲線圖:

為什麼這麼多”第一次”? 因為我告訴我自己,這次再不努力拼下去,可能以後就沒機會了! 我是個個性非常閉俗的怪人、十足的宅男,不太喜歡跟人交際應酬。所以也不太會去參加那種公開的活動或聚會,只喜歡關在家裡低調的閉門造車… 但這次,我真的豁出去了….. 再怎麼不喜歡、沒經驗,我都要去做。有沒有什麼效果不重要,重要的是我至少要”努力過”… 如果沒真的努力過,就以失敗收場。我怕我下半輩子,只會變成一個老人,孤單的活在悔恨之中…

這次的作品,獲得了比較好的成績。我歸納了幾個做的好與不好的地方(參考就好,因為我講的也不見得是對的):
好的地方:
1. 遊戲的內容本身和玩法,真的還蠻特別的。沒在其他遊戲上看過,至少有名的App沒有。其他比較沒名的也許有類似玩法的遊戲App,那我就不知道了。但至少,根據玩家給我的回饋意見,幾乎清一色的都說這遊戲最大的賣點,就是這特別的玩法了,他們從沒玩過。

2. 這次遊戲的宣傳,我真的有比較認真去做,以前從來沒有這麼認真過。兩年前,在開始開發之前,我就先在PTT發文寫了一下遊戲的基本玩法,調查一下玩家的反應。然後在今年五月,正式版上架前,就先開放Demo版給玩家試玩獲得更多的修改建議。在正式上架三個禮拜前,就先在各大國內外遊戲論壇發文和寄新聞稿(這裡要特別感謝Rodan大大的指導!! 還有包子分享「返校」的經驗! 對我的幫助真的不少! 感恩~)。遊戲上架後,寄信給Apple編輯review,詢問他們是否可以幫忙Feature App(其實應該要第一版上架前就要寄的,不過亡羊補牢總比沒有好。以前我真的不知道、也沒去查,不知道在搞什麼鬼… ~”~)。真的,有做有差,雖然一直在copy&paste很辛苦,成效也不見得100%。但套句Rodan大大的說法: 「成效也許只有30分,但你不做就是0分。」。這句話,讓我一直謹記在心…

3. 這次改用Unity開發,同時上架在iOS和Android雙平台上。過去五年,我一直都是用Mac + Xcode,搭配cocos2d開發iOS App。很早就想試也做Android版,但一直遲遲沒有做。這次,我決定真的要做雙平台了。本來還是用cocos2d-x這個Framework開發(其實也是後來才轉的,本來是用cocos2d-iphone。所以,其實又多花很多時間重新熟悉了一下C++。)。結果,開發了大概三四個月左右後。原本在iOS一直都跑的蠻順利的,有一天,我突然想到我都還沒真正在Android上執行試過(最一開始的code本來有在Android上做一次測試,但後來code已經差很多了)。於是,試著deploy到Android平台上去測試。結果,搞了整整一個禮拜,都還是一堆錯誤,連App都沒辦法執行。老天爺! 我才做三個多月寫一點點code就這樣,那以後還要玩嗎!??? 於是當機立斷,決定砍掉重練,把Framework改用Unity 5開發。後來覺得,這真的是個很正確的決定! 因為,Unity跨平台的支援做的真的非常好! 真的只要寫一套code就好! 而且也是免費的!(如果年營收沒有超過300萬台幣的話) 後來花了一段時間,把新的code寫好之後,改用Unity deploy到Android、iOS、Windows、Mac、Web測試過,都沒啥大問題。這結果讓我真的很滿意! 而且Unity的Asset Store上還有一堆可付費或免費下載的plguin工具,真的幫我省了很多開發的時間。超讚!!(很多我自己可能寫不出來或寫出來跑不順的程式邏輯,我就是直接用買的。) 而且,也是改用了 Unity後,才讓我有機會在明年移植做哥布林的PC版(原本根本不得其門而入,因為我沒待過遊戲業,不清楚怎麼做好)。所以我接下來的新遊戲,應該都會全部用Unity開發了,不會想再換。而App的營收,iOS : Android目前約 2 : 1。下載量約 5 : 2 (因為iOS App有獲得全球推薦的關係,不然總下載量應該是Android會比較多才對)。另外還有廣告的營收,大概佔總營收的15%。目前我是用Unity Ads + Chartboost。大陸地區的Android版,則是用Yomob。

4. 這次不同以往,我先發行了BETA版讓玩家試玩。再根據玩家的意見與回報錯誤,修正了不少嚴重的問題和改了比較適合的操作界面 & 玩法調整。假如我沒先開放測試,一開始就直接上正式版的話。那成績可能就不是今天看到的這樣了,不會到平均4.5顆星的滿意度評分。可能也就不會獲得Apple和Google的推薦了(因為,App是否會被推薦,跟平均評分很有關係!!)。其實我以前就知道要做,只是我很懶,想說省去這段功夫,等正式版上架後再改應該也是可以。但,我現在深深覺得,這流程真的不能少! 沒先得到玩家的驗證過,就冒然上架的話,可能就是死路一條!

不好的地方:
1. 我不該在遊戲內容還不足的時候,就開放玩家等級可以玩到Lv99。這樣讓我接下來的改版計劃有點難做。這樣就算改版加了新內容,已經滿等的舊玩家也無法獲得新的遊戲體驗而回鍋玩了。所以應該要分階段更新才對,例如先50級,然後60, 70, 80, 90, 99這樣… 而且遊戲內容不足,就開放比較高的等級讓玩家玩的話,會導致中間升級過程的變化性不夠。玩家一直在做重複的事的話,會容易感到厭煩無聊(作業感重),然後就砍掉遊戲不玩了。比較好的遊戲設計,應該是讓玩家在升級的過程中,獲得足夠的娛樂感與成就感回饋。這樣玩家才會持續想玩下去…

2. 我低估要改接其他廣告SDK和金流平台的難度了。這次的App,我第一次跟大陸的TapTap合作,上架在他們的平台上。但由於大陸地區並無法使用Google Play服務,而且網路無法讀取Chartboost和Unity Ads這兩個廣告平台的資料。所以得另外改接別家大陸專用的廣告平台和金流平台來做IAP商品的購買支付。原本以為應該不難,結果詢問了他們的技術窗口了解怎麼做後,才知道跟我原本想的有落差。而且金流平台的審核流程很複雜,我光要通過開發者身份審核,大概就花了兩個禮拜左右。原本以為金流平台這邊,只要像接Google Play那樣可以直接從手機client端call SDK發出購買請求就行了。結果沒想到,他們不提供這種做法,而是要一侓透過一台Server處理。這樣的話,變成要自己去維護玩家交易的資料保存和驗證了,流程變得有點複雜。其實,我一直很怕去碰金流這段的。因為我知道這種出錯的話就會非常慘,搞不好會被告之類的。所以能不碰就不碰,但這次沒辦法了,如果要做大陸地區玩家的生意,就非得做不可了(不然你就是得忍受Android App免費讓他們玩爽爽,賺不到半毛錢… XD)。這裡不得不誇獎一下TapTap平台,他們的窗口讓我感覺到做事很積極,真的有認真的想幫獨立開發者。而且TapTap算是在大陸”唯一”(應該吧? :p)支持正版App的平台了,上面的玩家素質都還不錯,有認真的在幫App留下專業的評價。讚!!

3. Project曾經砍掉重練過一次。原本是用cocos2d-x, C++開發。後來變成用Unity 5, C#開發。其實這不應該發生在我這種已經做技術十幾年的老工程師身上,菜鳥就算了~ XD。我應該要在開始動工前,就先查好試過比較適合的Framework來用。而不是做到一半,才發現不對勁砍掉重練。這真的很傷本!! 要知道,獨立開發者最最最最最最最最最最最最最最重要的,就是「時間」了!!!!!!!! 任何會浪費多餘開發時間的可能因子,都要盡可能的避免! 因為,時間就是獨立開發者最大的成本! 時間就是一切! 而且我不是浪費幾天而已,我是浪費了四個多月… 如果要寫一段code來說明時間與獨立開發者之間的關係的話,大概就是像這樣↓ XDD

while(time == money) {
   work();
}

4. 正式版上架後,出現了一個很嚴重的Bug,導致部份玩家的怪物等級暴增。遊戲最怕的就是遇到這種問題,因為一旦發生後,你等於就是損失這個潛在的死忠玩家了… 因為玩家靠bug達到最高等級後,原本該有的遊戲體驗全部不見,再也回不來了(你改100版都沒用)! 不過幸運的是,還好這bug是發生在我App被Apple全球推薦之前。所以影響的玩家沒有很多,算是不幸中的大幸(感謝以前同事 老詹 先生狂玩我的遊戲,遇到這個bug回報給我。不然我不知道要等多久後才會發現… @@)。以後正式上架前,還是做足測試確認才好(不過這個bug要等到玩家30級以上才可能會遇到,所以在BETA版時只開放到20級,玩家根本測不到… Orz)。

明年,我的開發計畫大概也差不多想好了…
1. 把道具屋剩下的改版完成,增加更多的怪物和物品屬性、新設備等等的。然後我想把遊戲內容大改,改成賣斷制的玩法上架在Steam上。PC遊戲市場和手遊市場,有個很大的差別是: PC玩家喜歡直接買斷一個遊戲玩,NT$300、500、1000都好(獨立遊戲的定價,大概是落在NT$150 ~ 500之間),他們都願意買,只要你的遊戲內容夠好,真的有吸引到他們。但如果你做的像手遊的IAP付費那樣,一直靠賣DLC來賺錢的話,你會被玩家公幹死! XD 我從來沒做過PC Game,但我覺得Steam對於獨立開發者來說,相對是個比較友善的環境(不過今年Steam上了新的Direct機制取代以往的Greenlight審核機制,導致有大量的糞Game(聽說很多連一套都賣不了)上架。所以搞不好接下來就會變的像App Store、Google Play那樣… :( )。不過,不管結果如何,我都很想上架到Steam試試看,也許是做白工賺不了什麼錢。但如果沒有真的試過的話,一切都只是猜測而已,你猜了十年也不會得答案。套句阿甘他老母的話: 「人生就像是一盒巧克力一樣,你永遠不會知道下一個拿到的是什麼。」 :P

2. 開始開發Monster Lord的二代。這算是我第一個小有成績的遊戲,到現在都一直還有玩家會付費買東西,雖然不多。但你要想,這已經是六年多前的遊戲App了,如果還一直有玩家玩,那代表這遊戲是有潛力再做的更好的! 所以我早已經發包給原來配合的美術(大家如果想要找人接案畫圖,也可以找他,我很推薦! 我還蠻喜歡他的奇幻風格畫風的~ ^^)了,預計會增加到100種不同的怪物。敬請期待! :D

3. 有時間的話,還想再做一個生存、建造類的模擬遊戲,像Steam上的Craft the World, Oxygen Not Included, Don’t Starve, Factorio這種的。因為我很愛玩!! 也想試試看做一個給自己玩! XDD 但這次我不會再犯像Galaxy Lord一樣的錯誤,我會完全靠自己憑空發想,想出一個好的點子後再開始做~ :)

大概先這樣,有想到什麼再補上來…
再寫下去就變萬言書了(還是字數早就已經破萬了? 我沒算… XDD)

2017/12/20 筆

——————————————————–
相關文章:
一個人獨立開發iPhone App的甘苦談…
一個人獨立開發iPhone App一年半回顧

在Unity上做序列化處理

Friday, October 7th, 2016


最近在實做Game Data Serialization的部份。一開始是用Unity內建的Object Serialization機制,但是後來發現風險有點高。因為只要要做序列化的物件的其中某個變數”名稱”一改,原本已經儲存的檔案。在做Deserialization時,就會出現Exception… (雖然這種情形不應該發生,可是真的很難保證會不會上架之後有一天突然忘記,不小心改到某個變數名稱)

雖然我有加Try Catch去處理Exception發生時的流程 – 重新產生一個新存檔,遊戲還不致於到crash完全不能玩的程度。但是這(遺失遊戲進度)對玩家來說是非常嚴重的錯誤!! 應該會有95%以上的玩家一發現辛辛苦苦玩半天的遊戲存檔不見了,遊戲可能就會被直接砍掉GG了… (應該是BG(Bad Game)才對 lol)

所以這幾天改用自己手動寫序列化成JSON格式的方式。原因有三: 一是我對JSON格式非常熟悉,二是我有打算將存檔透過Http Request送到Server做儲存備份。一旦玩家的本機資料真的遺失了,還是可以透過Server上的備份存檔回朔進度玩。而且玩家可以從Android切換到iOS或其他平台玩,無痛轉移遊戲進度。所以用純文字的JSON格式會比較好。三是如果日後要改物件的變數名稱,就還是可以改。只要轉成JSON string時的key name不變就好,這樣就不會出現Deserialization Exception了。

本來我是用SimpleJSON這個Library來做JSON格式的序列化處理。結果後來發現它序列化出來的JSON string根本不符合標準 – boolean, int, float, double這幾種C#的native type都會被轉成JSON String格式,而非JSON Number格式。所以我又改用了另一個Library – LitJSON,功能比較強,且序列化出來的JSON格式是標準的。今天剛把所有相關的物件改成用這個Library做序列化,跑起來總算沒啥問題了… :D