Archive for the ‘技術筆記’ Category

一個人獨立開發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

[Tutorial] build cocos2d-x as a static library in Mac Xcode

Saturday, June 27th, 2015

————————————-[English, 要看中文版請往下捲]—————————————-
[the story]
Recently, I create a new game project by using the latest cocos2d-x framework. I download the latest cocos2d-x 3.6. And I follow the tutorial to create a cocos2d-x project. I build & run the project successfully. But I notice a thing, if I clean the project or modify partial of my codes / resources. When building project, Xcode will compile whole source codes of cocos2d library again! It spends very very much time. It will compile 621 source files of cocos2d library. If I must wait so long every time when I just modify a piece of my code, how can I continue to write my fucking code!!?

So, I spent two days to search an available solution in the internet. I also ask a question in StackOverflow. There are still no answers. Finally, I find a post in a Japanese developer’s blog site. I follow his steps and build a cocos2d-x static library successfully. I import the static library into my game project, and it did works! okay, let me show you the screenshot first. it’s truely working!

Okay, let’s enter the main tutorial. The content is mainly translated from this Japanese developers’s post.

[Tutorial Begin]

Create a new cocos2d-x project

First, create a new project. Go to the root directory of the cocos2d-x library (i.e. /Users/YourName/Library/cocos2d-x-3.6).
Execute the following command in Mac command line.

cocos new HelloWorld -p com.CompanyName.HelloWorld -l cpp

open Xcode project file.

open HelloWorld/proj.ios_mac/HelloWorld.xcodeproj
Modify Build Settings

choose cocos2d_libs.xcodeproj and select the Target: libcocos2d iOS. modify its Build Settings.
The default values should be the same as the following, if not, modify them.

Architectures => Standard architectures
Build Active Architecture Only => No

In the “Valid Architectures” field, add two additional value: i386 and x86_64. This is for the Xcode simulator, to make the library runnable .

The final values should have five: arm64, armv7, armv7s, i386, x86_64. as the screenshot:
Using Rakefile to build Static Library
cd HelloWorld/cocos2d/build
vi Rakefile

input the following content:

PROJECT_PATH = "./cocos2d_libs.xcodeproj"
TARGET_NAME="'libcocos2d iOS'"
OUTPUT_DEBUG="tmp/iphonesimulator"
OUTPUT_RELEASE="tmp/iphoneos"
OUTPUT_LIB="./lib"
directory OUTPUT_LIB

desc "using lib command to build a static library"
task "lib" do
    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphonesimulator8.3 -target #{TARGET_NAME} -arch i386 -arch x86_64 TARGET_BUILD_DIR=#{OUTPUT_DEBUG} BUILT_PRODUCTS_DIR=#{OUTPUT_DEBUG} clean build"

    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphoneos8.3 -target #{TARGET_NAME} -arch armv7 -arch armv7s -arch arm64 TARGET_BUILD_DIR=#{OUTPUT_RELEASE} BUILT_PRODUCTS_DIR=#{OUTPUT_RELEASE} clean build"
end

desc "using lipo command to link static libraries for each device to one combined library file"
task "lipo" => OUTPUT_LIB do

    Dir.glob("#{OUTPUT_RELEASE}/*"){|path|
        p path
        file = File.basename(path)

        sh "lipo '#{OUTPUT_DEBUG}/#{file}' '#{OUTPUT_RELEASE}/#{file}' -create -output '#{OUTPUT_LIB}/#{file}'"
    }
end
begin building static library, execute the following command.

rake lib

The whole process will spend about 10 ~ 20 minutes, depends on your working machine. If the procedure stops within a minute, it might be error occurring. For me, I meet a error that process can’t find the correct iphonesimulator8.2 and iphoneos8.2 directory, so I must modify them to the correct value in my environment.

After building static library successfully, you will see two libcocos2d iOS.a files in the “tmp” directory. One is for real device, the other is for simulator. So, we must do one more step to pack these two files to one merged .a file. Execute the following command.

rake lipo

This will take couple of seconds. After done, you will see a “lib” directory which contains a libcocos2d iOS.a file, its size is about 117.9 MB. This is the static library file we want.

Import Static Library to Your Project

choose .xcodeproj file -> Build Phases -> Link Binary With Libraries. Delete all red-font libraries, and re-add them.

Add the static library which we just built to the library list.
Delete “libcocos2d Mac” and “libcocos2d iOS” target in the project setting (It’s the reason why building project so fucking slow). Keep the cocos2d source code files alive for that we can view the code in the future.
Congratulations! Enjoy the jet building speed!

Now you can clean whole project and rebuild it. You will see Xcode won’t compile cocos2d source files any more. It only compile the files in your own project. The building speed will be 50 times comparing with the original, I guess.

That’s all … good luck! :mrgreen:

————————————-[中文]—————————————-
[前言]
最近我要開一個新遊戲專案,想改用最新版的cocos2d-x來做。我去下載了最新版的cocos2d-x 3.6後,照著這個教學頁面成功開了一個新的cocos2d-x project。在Xcode也build成功跑出畫面了。但我發現只要有做過clean整個project的動作,甚至只是改了一些project裡自己寫的code。在build project時,有時候Xcode會誤以為你有去動到cocos2d library的source code,因此常常重新去compile cocos2d library的source code。總共有621個files要重build,需要蠻久的一段時間(大概3~4分鐘)。如果每次只是改個小東西,就要花這麼多時間等它重build,我還要不要寫code!!?

因此這兩天,我花了很多時間不斷上網找解法,在StackOverflow上問問題。都沒有找到我要的答案。最後,終於在今天讓我找到一個日本開發者的教學文章,成功build出cocos2d-x的static library,並import到我自己的project裡跑出結果。好,先讓你們看個畫面,代表我不是在虎爛的…

以下進入正題,內容主要是翻譯自這篇日本教學文章

[教學開始]

建立新專案

首先,要開一個cocos2d的專案。到你下載並解壓好的cocos2d-x根目錄(例: /Users/YourName/Library/cocos2d-x-3.6)執行以下指令

cocos new HelloWorld -p com.CompanyName.HelloWorld -l cpp

接著打開Xcode project檔。

open HelloWorld/proj.ios_mac/HelloWorld.xcodeproj
修改Build Settings

選擇cocos2d_libs.xcodeproj,再選擇Target: libcocos2d iOS,修改其Build Settings。
應該預設值就是下面寫的值了,如果不是,請改為下面的值。

Architectures => Standard architectures
Build Active Architecture Only => No

另外在Valid Architectures 那欄追加兩個值: i386 和 x86_64。這是為了讓build出來的Library也可以在模擬器上跑。

修改後的結果應該有五個值: arm64, armv7, armv7s, i386, x86_64
完整結果如圖片所示:
使用Rakefile來建立Static Library
cd HelloWorld/cocos2d/build
vi Rakefile

內容輸入以下程式碼:

PROJECT_PATH = "./cocos2d_libs.xcodeproj"
TARGET_NAME="'libcocos2d iOS'"
OUTPUT_DEBUG="tmp/iphonesimulator"
OUTPUT_RELEASE="tmp/iphoneos"
OUTPUT_LIB="./lib"
directory OUTPUT_LIB

desc "using lib command to build a static library"
task "lib" do
    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphonesimulator8.3 -target #{TARGET_NAME} -arch i386 -arch x86_64 TARGET_BUILD_DIR=#{OUTPUT_DEBUG} BUILT_PRODUCTS_DIR=#{OUTPUT_DEBUG} clean build"

    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphoneos8.3 -target #{TARGET_NAME} -arch armv7 -arch armv7s -arch arm64 TARGET_BUILD_DIR=#{OUTPUT_RELEASE} BUILT_PRODUCTS_DIR=#{OUTPUT_RELEASE} clean build"
end

desc "using lipo command to link static libraries for each device to one combined library file"
task "lipo" => OUTPUT_LIB do

    Dir.glob("#{OUTPUT_RELEASE}/*"){|path|
        p path
        file = File.basename(path)

        sh "lipo '#{OUTPUT_DEBUG}/#{file}' '#{OUTPUT_RELEASE}/#{file}' -create -output '#{OUTPUT_LIB}/#{file}'"
    }
end
開始製作static library,輸入以下command。

rake lib

整個過程大概需要10~20分鐘,要看你的機器的執行速度。如果不到一分鐘就停了,那可能是有出現錯誤。像我是遇到找不到 iphonesimulator8.2 和 iphoneos8.2 這兩個資料夾,要改成你的執行環境正確的值。

完成build static library後,你會在tmp資料裡看到兩個libcocos2d iOS.a檔,一個是給實機device跑的,另一個是給模擬器跑的。因此我們還要再做最後一步,將這兩個.a檔打包成為一個merged的.a檔。執行下面的指令。

rake lipo

這大概只需要幾秒鐘就能跑完,跑完之後你會看到一個lib資料。裡面有一個libcocos2d iOS.a檔,檔案大小約 117.9 MB。這就是最終我們要的static library檔了。

Import Static Library到你的專案

選擇.xcodeproj檔 -> Build Phases -> Link Binary With Libraries。將紅字的library全都砍掉,重新加。

將剛剛做出來的static library加進Library清單裡。
然後將你的project裡的cocos2d_libs.xcodeproj裡的 libcocos2d Mac 和 libcocos2d iOS 這兩個Target都刪除掉(就是這兩個Target才導致build project速度變慢!)。cocos2d library裡的source code則留著,以方便日後寫code時可以回頭查看。
完成了! 享受飛快的build project速度吧!

現在你可以Clean整個Project,再重build。你會發現Xcode不會再去compile cocos2d原本的source files了。只會去compile你自己project裡的files。速度大概是原本的50倍以上,我猜~

That’s all … good luck! :mrgreen: