æåŸã®éãéžæãã人ã¯ïŒç§èªèº«ãç¥ã£ãŠãããšæããŸããïŒããã®å°é£ã§åä»ãªéã§å€ãã®åé¡ã«çŽé¢ããŸãã
- iOSã¯ãŸã£ãã銎æã¿ã®ãªãå€ç«ãããšã³ã·ã¹ãã ã§ãããç¬èªã®æ¹æ³ã§éçºãããŠããŸãã å°ãªããšããã¢ããªã±ãŒã·ã§ã³ã«å°éããæ¹æ³ãç解ããããã«å€ãã®æéãè²»ããå¿ èŠããããŸãããŸããèªåçæãããXcodeãããžã§ã¯ãã®æ·±ãã®ã©ãã§ãUnity3Dãšã³ãžã³ãã¢ããªã±ãŒã·ã§ã³ã®ãã€ãã£ãã³ã³ããŒãã³ããšå¯Ÿè©±ããããã®ã³ãŒãããããŸãã
- Objective-Cã¯ãããªãç¬ç«ãããã»ãšãã©äŒŒãŠããªãããã°ã©ãã³ã°èšèªã§ãã ãããŠãUnity3Dã¢ããªã±ãŒã·ã§ã³ã®C ++ã³ãŒããšå¯Ÿè©±ããããšã«ãªããšãObjective-C ++ãšåŒã°ãããã®èšèªã®ãæ¹èšããç»å ŽããŸãã 圌ã«ã€ããŠã®æ å ±ã¯ã»ãšãã©ãªãããã®ã»ãšãã©ã¯å€ä»£ã®ãã®ã§ããã¢ãŒã«ã€ãã§ãã
- Unity3DãšiOSã¢ããªã±ãŒã·ã§ã³éã®çžäºäœçšã®ãããã³ã«ã¯ããŸã説æãããŠããŸããã æãåçŽãªãã€ãã£ããã©ã°ã€ã³ã®éçºæ¹æ³ãæžããŠãããããã¯ãŒã¯äžã®æ奜家ã®ãã¥ãŒããªã¢ã«ã®ã¿ã«é Œãã¹ãã§ãã åæã«ãããæ·±ãåé¡ãè€éãªããšãããå¿ èŠããçããåé¡ã«è§Šãã人ã¯ã»ãšãã©ããŸããã
Unity3DãšiOSã¢ããªã±ãŒã·ã§ã³ãšã®çžäºäœçšã®ã¡ã«ããºã ã«ã€ããŠåŠã³ããæ¹ã¯ãcatã®äžã§ãé¡ãããŸãã
Unity3Dã®ãã€ãã£ãã³ãŒããšã®ç·å¯ãªããã«ããã¯ãããæ確ã«ããããã«ããã®èšäºã§ã¯ãiOSã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããšUnity3Dã³ãŒãã®çžäºäœçšã®åŽé¢ã«ã€ããŠèª¬æããŸããããã«ãããC ++ããã³Objective-CããŒã«ãå®è£ ãããã¢ããªã±ãŒã·ã§ã³ãããªã²ãŒãããæ¹æ³ãå€æŽã§ããŸãã ãã®æ å ±ã¯ãUnity3D + iOSãªã³ã±ãŒãžã¡ã«ããºã ã®ç解ãšå®çšåã®äž¡æ¹ã«åœ¹ç«ã¡ãŸãã
iOSãšã¢ããªã±ãŒã·ã§ã³éã®çžäºäœçš
ã¯ããã«ãã¢ããªã±ãŒã·ã§ã³ãšã·ã¹ãã ã®çžäºäœçšãiOSã§ã©ã®ããã«å®è£ ãããŠãããããŸãã¯ãã®éãèŠãŠã¿ãŸãããã æŠç¥çã«ãiOSã¢ããªã±ãŒã·ã§ã³ã®èµ·åã¯æ¬¡ã®ããã«ãªããŸãã
![ç»å](https://habrastorage.org/webt/jd/vm/oi/jdvmoimtygqdsc095abusfopdao.png)
ã³ãŒãã®èŠ³ç¹ãããã®ã¡ã«ããºã ãç 究ããã«ã¯ããã·ã³ã°ã«ãã¥ãŒã¢ããªããã³ãã¬ãŒãã䜿çšããŠXcodeã§äœæãããæ°ããã¢ããªã±ãŒã·ã§ã³ãé©ããŠããŸãã
![](https://habrastorage.org/webt/du/_z/75/du_z75efp4bdgv_fvb02x-mjfis.png)
ãã®ãã³ãã¬ãŒããéžæãããšãåºåã¯ããã€ã¹ãŸãã¯ãšãã¥ã¬ãŒã¿ãŒã§å®è¡ã§ããçœãç»é¢ã衚瀺ã§ããæãåçŽãªiOSã¢ããªã±ãŒã·ã§ã³ãæäŸããŸãã Xcodeã¯ããœãŒã¹ã³ãŒããå«ã5ã€ã®ãã¡ã€ã«ïŒããããŒ.hãã¡ã€ã«ã2ã€ïŒãšãèå³ã®ãªãããã€ãã®è£å©ãã¡ã€ã«ïŒçµçãæ§æãã¢ã€ã³ã³ïŒãå«ããããžã§ã¯ããäœæããŸãã
![](https://habrastorage.org/webt/jt/mz/ov/jtmzov95oshddmprhby9wkqigve.png)
ãœãŒã¹ã³ãŒããã¡ã€ã«ãäœãæ åœããŠãããèŠãŠã¿ãŸãããã
- ViewController.m / ViewController.hã¯ãããŸãèå³æ·±ããœãŒã¹ã³ãŒãã§ã¯ãããŸããã ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã¥ãŒïŒã³ãŒãã§ã¯ãªããã¹ããŒãªãŒããŒãã䜿çšïŒãããããããã®ãã¥ãŒãå¶åŸ¡ããControllerã¯ã©ã¹ãå¿ èŠã«ãªããŸãã äžè¬ã«ããã®æ¹æ³ã§Xcodeèªäœã¯MVCãã¿ãŒã³ã䜿çšããããšãæšå¥šããŸãã Unity3Dãçæãããããžã§ã¯ãã«ã¯ããããã®ãœãŒã¹ãã¡ã€ã«ã¯ãããŸããã
- AppDelegate.m / AppDelegate.hã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããªã²ãŒãã§ãã ã«ã¹ã¿ã ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®äœæ¥ãéå§ãããã¢ããªã±ãŒã·ã§ã³ã®ãã€ã³ãã
- main.m-ã¢ããªã±ãŒã·ã§ã³ã®éå§ç¹ã C / C ++ã¢ããªã±ãŒã·ã§ã³ã®ããã«ãããã°ã©ã ãèµ·åããã¡ã€ã³é¢æ°ãå«ãŸããŠããŸãã
次ã«ã main.mãã¡ã€ã«ã§å§ãŸãã³ãŒããèŠãŠã¿ãŸãããã
int main(int argc, char * argv[]) { //1 @autoreleasepool { //2 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); // 3 } }
1è¡ç®ã§ã¯ãã¹ãŠãæ確ã§ããã説æãªãã§2è¡ç®ã«é²ã¿ãŸããããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ããµã€ã¯ã«ãAutoreleaseããŒã«å ã§çºçããããšã瀺ããŠããŸãã èªå解æŸããŒã«ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªç®¡çããã®ç¹å®ã®ããŒã«ã«å§ããããšãããããŸããã€ãŸããç¹å®ã®å€æ°ã®ã¡ã¢ãªã解æŸããå¿ èŠãããå Žåã®åé¡ãåŠçããŸãã iOSã§ã®ã¡ã¢ãªç®¡çã«é¢ããã¹ããŒãªãŒã¯ãã®ã¹ããŒãªãŒã®ç¯å²ãè¶ ããŠããããããã®ãããã¯ãæãäžããæå³ã¯ãããŸããã ãã®ãããã¯ã«èå³ããã人ã®ããã«ãäŸãã°ã ãã®èšäºãèŠã€ããããšãã§ããŸãã
è¡3ã«é²ã¿ãŸããããUIApplicationMainé¢æ°ãåŒã³åºããŸãã ããã°ã©ã ã®èµ·åãã©ã¡ãŒã¿ãŒïŒargcãargvïŒãæž¡ãããŸãã 次ã«ããã®é¢æ°ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ã¯ã©ã¹ãšããŠäœ¿çšããã¯ã©ã¹ã瀺ããããã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã æåŸã«ãã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããšããŠäœ¿çšããã¯ã©ã¹ããã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã¢ããªã±ãŒã·ã§ã³ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãšãã®ããªã²ãŒãéã®æ¥ç¶ãèšå®ãããããšã瀺ãããŸãã
ãã®äŸã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ã¿ã³ã¹ãè¡šãã¯ã©ã¹ãšããŠnilãæž¡ãããŸã-倧ãŸãã«èšã£ãŠãããŒã«ã«ã¢ããã°ã¯nullã§ãã nilã«å ããŠã UIApplicationããç¶æ¿ããç¹å®ã®ã¯ã©ã¹ãããã«æž¡ãããšãã§ããŸãã nilãæå®ãããŠããå ŽåãUIApplicationã䜿çšãããŸãã ãã®ã¯ã©ã¹ã¯ãiOSäžã®ã¢ããªã±ãŒã·ã§ã³ã®éäžå¶åŸ¡ãã€ã³ãã§ãããã·ã³ã°ã«ãã³ïŒã·ã³ã°ã«ãã³ïŒã§ãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®ç¶æ ãéç¥ããŠã£ã³ããŠãã·ã¹ãã èªäœã§çºçããã€ãã³ãããã®ã¢ããªã±ãŒã·ã§ã³ã«åœ±é¿ãäžããã€ãã³ããªã©ãã»ãŒãã¹ãŠãåŠç¿ã§ããŸãã ãã®ã¯ã©ã¹ã¯ã»ãšãã©ç¶æ¿ããŸããã Application Delegateã¯ã©ã¹ã®äœæã«ã€ããŠè©³ãã説æããŸãã
ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã®äœæ
ã¢ããªã±ãŒã·ã§ã³åŒã³åºããšããŠäœ¿çšããã¯ã©ã¹ã®æ瀺ã¯ãé¢æ°åŒã³åºãã§çºçããŸã
NSStringFromClass([AppDelegate class])
ãã®åŒã³åºããéšåçã«åæããŸãããã
[AppDelegate class]
ãã®ã³ã³ã¹ãã©ã¯ãã¯AppDelegateã¯ã©ã¹ïŒAppDelegate.h / .mã§å®£èšãããŠããïŒã®ãªããžã§ã¯ããè¿ãã NSStringFromClassé¢æ°ã¯ã¯ã©ã¹åãæååãšããŠè¿ããŸãã äœæããUIApplicationMainé¢æ°ã®ããªã²ãŒããšããŠäœ¿çšããã¯ã©ã¹ã®æåååãæž¡ãã ãã§ãã ç解ãæ·±ããããã«ã main.mãã¡ã€ã«ã®3è¡ç®ã次ã®ããã«çœ®ãæããããšãã§ããŸãã
return UIApplicationMain(argc, argv, nil, @"AppDelegate");
ãããŠããã®å®è£ ã®çµæã¯å ã®ããŒãžã§ã³ãšåäžã«ãªããŸãã ã©ããããéçºè ã¯æååå®æ°ã䜿çšããªãããã«ããŸãã«ãã®ãããªã¢ãããŒããèãåºãããšã«ããŸããã æšæºçãªã¢ãããŒãã§ã¯ãããªã²ãŒãã¯ã©ã¹ã®ååãå€æŽãããšãããŒãµãŒã¯ããã«ãšã©ãŒãã¹ããŒããŸãã éåžžã®è¡ã䜿çšããå Žåãã³ãŒãã¯æ£åžžã«ã³ã³ãã€ã«ãããã¢ããªã±ãŒã·ã§ã³ãèµ·åããã ãã§ãšã©ãŒãåãåããŸãã
ã¯ã©ã¹ã®æåååã®ã¿ã䜿çšããŠã¯ã©ã¹ãäœæããåæ§ã®ã¡ã«ããºã ã¯ãCïŒããã®ãªãã¬ã¯ã·ã§ã³ãæãåºããããããããŸããã Objective-Cãšãã®ã©ã³ã¿ã€ã ã¯ãCïŒã®Reflectionãããã¯ããã«åŒ·åã§ãã ããã¯ããã®èšäºã®ã³ã³ããã¹ãã§ã¯éåžžã«éèŠãªãã€ã³ãã§ããããã¹ãŠã®æ©èœã説æããã«ã¯æéãããããŸãã ãã ãã以äžã®Objective-Cã®ãReflectionãã«ã€ããŠã¯åŒãç¶ã察å¿ããŸãã ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã®æŠå¿µãšãã®æ©èœãç解ããããšã¯æ®ã£ãŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒã
iOSãšã®ã¢ããªã±ãŒã·ã§ã³ã®çžäºäœçšã¯ãã¹ãŠãUIApplicationã¯ã©ã¹ã§è¡ãããŸãã ãã®ã¯ã©ã¹ã¯å€ãã®è²¬ä»»ãåŒãåããŸã-ã€ãã³ãã®çºçæºãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ãªã©ãéç¥ããŸãã ã»ãšãã©ã®å Žåã圌ã®åœ¹å²ã¯éç¥ã§ãã ããããã·ã¹ãã ã§äœããçºçããå Žåãäœããã®æ¹æ³ã§ãã®å€æŽã«å¯Ÿå¿ããäœããã®ã«ã¹ã¿ã æ©èœãå®è¡ã§ããå¿ èŠããããŸãã UIApplicationã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããããè¡ãå Žåããã®ãã©ã¯ãã£ã¹ã¯Divine ObjectãšåŒã°ããã¢ãããŒãã«äŒŒå§ããŸãã ãããã£ãŠããã®ã¯ã©ã¹ããã®è²¬ä»»ã®äžéšãã解æŸããããšãèãã䟡å€ããããŸãã
ãããã®ç®çã®ããã«ãiOSãšã³ã·ã¹ãã ã¯ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããªã©ã䜿çšããŸãã ååèªäœããã Delegationãªã©ã®èšèšãã¿ãŒã³ãæ±ã£ãŠãããšçµè«ä»ããããšãã§ããŸãã ã€ãŸããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ã€ãã³ãã«å¯Ÿããåå¿ãåŠçãã責任ããã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã«åçŽã«ç§»ããŸãã ãã®ããããã®äŸã§ã¯ãã«ã¹ã¿ã æ©èœãèšè¿°ã§ããAppDelegateã¯ã©ã¹ãäœæããUIApplicationã¯ã©ã¹ã¯ãã©ãã¯ããã¯ã¹ã¢ãŒãã§åäœããããã«ããŸããã ãã®ã¢ãããŒãã¯ãã¢ãŒããã¯ãã£èšèšã®çŸããã®ç¹ã§èª°ãã«è°è«ã®äœå°ãããããã«æãããããããŸããããiOSã®äœè èªèº«ããã®ã¢ãããŒãã«ç§ãã¡ãæŒãä»ããŠãããéçºè ã®å€§éšåïŒãã¹ãŠã§ã¯ãªãã«ããŠãïŒãããã䜿çšããŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®äœæ¥äžã«ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããã¡ãã»ãŒãžãåä¿¡ããé »åºŠãèŠèŠçã«ç¢ºèªããã«ã¯ãå³ãèŠãŠãã ããã
![ç»å](https://habrastorage.org/webt/md/61/bc/md61bc9my4focy1suoy5qn9om2s.png)
é»è²ã®é·æ¹åœ¢ã¯ãã¢ããªã±ãŒã·ã§ã³ã©ã€ããµã€ã¯ã«ã®ç¹å®ã®ã€ãã³ãã«å¿ããããŸããŸãªããªã²ãŒãã¡ãœããã®åŒã³åºãã瀺ããŠããŸãã ãã®å³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã®å€åã«é¢é£ããã€ãã³ãã®ã¿ã瀺ããŠãããéç¥ã®åãå ¥ãããã¬ãŒã ã¯ãŒã¯ãšã®ããåããªã©ãããªã²ãŒãã®è²¬ä»»ã«é¢ããä»ã®å€ãã®åŽé¢ã¯è¡šç€ºããŠããŸããã
Unity3Dããã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã®äŸãããã€ã瀺ããŸãã
- ããã·ã¥ããã³ããŒã«ã«éç¥ã®åŠç
- ã¢ããªã±ãŒã·ã§ã³èµ·åã€ãã³ããåæã«èšé²ãã
- ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæ¹æ³ã®æ±ºå®-ãã¯ãªãŒã³ããŸãã¯ããã¯ã°ã©ãŠã³ããçµäºãã
- ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããæ£ç¢ºãªæ¹æ³-éç¥ã®ããã«ã¿ããããã ããŒã ç»é¢ã®ã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã䜿çšããããŸãã¯åã«ã€ã³ã³ã³ãã¿ãããã
- WatchKitãŸãã¯HealthKitãšã®çžäºäœçš
- å¥ã®ã¢ããªã±ãŒã·ã§ã³ããURLãéããŠåŠçããŸãã ãã®URLãã¢ããªã±ãŒã·ã§ã³ã«é©çšãããå Žåãã·ã¹ãã ã«ãã©ãŠã¶ã§ãã®URLãéããã代ããã«ãã¢ããªã±ãŒã·ã§ã³ã§åŠçã§ããŸãã
ããã¯ã·ããªãªã®å®å šãªãªã¹ãã§ã¯ãããŸããã ããã«ãããªã²ãŒãããã€ãã£ããã©ã°ã€ã³ã®å€ãã®åæããã³åºåã·ã¹ãã ãå€æŽããããšã¯æ³šç®ã«å€ããŸãã
Unity3Dãã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããå®è£ ããæ¹æ³
ããã§ãUnity3Dã«ãã£ãŠçæãããXcodeãããžã§ã¯ããèŠãŠãUnity3Dã§ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããã©ã®ããã«å®è£ ãããŠããããèŠãŠã¿ãŸãããã iOSãã©ãããã©ãŒã çšã«ãã«ãããå ŽåãUnity3Dã¯å€ãã®å®åã³ãŒãã䜿çšããXcodeãããžã§ã¯ããèªåçã«çæããŸãã ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã³ãŒãã¯ããã®ãã³ãã¬ãŒãã³ãŒãã«ãé©çšãããŸãã çæããããããžã§ã¯ãå ã«ã¯ã UnityAppController.hããã³UnityAppController.mmãã¡ã€ã«ããããŸã ã ãããã®ãã¡ã€ã«ã«ã¯ãèå³ã®ããUnityAppControllerã¯ã©ã¹ã®ã³ãŒããå«ãŸããŠããŸãã
å®éãUnity3Dã¯ãSingle View Applicationããã³ãã¬ãŒãã®ä¿®æ£ããŒãžã§ã³ã䜿çšããŸãã ãã®ãã³ãã¬ãŒãã§ã®ã¿ãUnity3Dã¯ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã䜿çšããŠiOSã€ãã³ããåŠçããã ãã§ãªãããšã³ãžã³èªäœã®åæåãã°ã©ãã£ãã¯ã³ã³ããŒãã³ãã®æºåãªã©ã«ã䜿çšããŸãã ã¡ãœãããèŠããšãããã¯éåžžã«ç解ããããã§ãã
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
UnityAppControllerã¯ã©ã¹ã®ã³ãŒãå ã ãã®ã¡ãœããã¯ãã«ã¹ã¿ã ã³ãŒãã«å¶åŸ¡ã転éã§ããã¢ããªã±ãŒã·ã§ã³ã®åæåæã«åŒã³åºãããŸãã ããšãã°ããã®ã¡ãœããå ã«ã¯ã次ã®è¡ããããŸãã
UnityInitApplicationNoGraphics([[[NSBundle mainBundle] bundlePath] UTF8String]); [self selectRenderingAPI]; [UnityRenderingView InitializeForAPI: self.renderingAPI]; _window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds]; _unityView = [self createUnityView]; [DisplayManager Initialize]; _mainDisplay = [DisplayManager Instance].mainDisplay; [_mainDisplay createWithWindow: _window andView: _unityView]; [self createUI]; [self preStartUnity];
ãããã®èª²é¡ã®è©³çŽ°ã«ã€ããŠã説æããªããŠããUnity3Dã®äœæ¥æºåã«é¢é£ããŠãããšæšæž¬ã§ããŸãã 次ã®ã·ããªãªãå€æããŸãã
- main.mmã®mainé¢æ°ãåŒã³åºãããŸã
- ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ã¿ã³ã¹ã¯ã©ã¹ãšãã®ããªã²ãŒããäœæãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã¯ãUnity3Dãšã³ãžã³ãæºåããŠèµ·åããŸã
- ã«ã¹ã¿ã ã³ãŒããæ©èœãå§ããŸãã il2cppã䜿çšããå Žåãã³ãŒãã¯CïŒããILããããŠC ++ã³ãŒãã«å€æãããXcodeãããžã§ã¯ãã«çŽæ¥å ¥ããŸãã
ãã®ã¹ã¯ãªããã¯ããªãåçŽã§è«ççã«èãããŸãããæœåšçãªåé¡ããããããŸããUnity3Dã§äœæ¥ããŠãããšãã«ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããªãå Žåãã©ã®ããã«ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããå€æŽã§ããŸããïŒ
圱é¿ãåããUnity3Dãã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããå€æŽãã
AppDelegateListener.mm/.hãã¡ã€ã«ã調ã¹ãããšãã§ããŸãã ãããã«ã¯ãä»»æã®ã¯ã©ã¹ãã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã®ã€ãã³ããªã¹ããŒãšããŠç»é²ã§ãããã¯ããå«ãŸããŠããŸãã ããã¯è¯ãã¢ãããŒãã§ããæ¢åã®ã³ãŒããå€æŽããå¿ èŠã¯ãªããæ°ããã³ãŒããè¿œå ããã ãã§ãã ãã ããé倧ãªæ¬ ç¹ããããŸãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã€ãã³ãããµããŒããããããã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã®èµ·åã«é¢ããæ å ±ãååŸããæ¹æ³ããããŸããã
ãã ããæãæçœãªãåãå ¥ããããªãæ¹æ³ã¯ãUnity3DãXcodeãããžã§ã¯ãããã«ãããåŸã«ããªã²ãŒããœãŒã¹ã³ãŒããæåã§å€æŽããããšã§ãã ãã®ã¢ãããŒãã®åé¡ã¯æããã§ãããã®ãªãã·ã§ã³ã¯ãæã§ã¢ã»ã³ããªãäœæããåã¢ã»ã³ããªã®åŸã«ã³ãŒããæåã§å€æŽããå¿ èŠæ§ã«æ··ä¹±ããªãå Žåã«é©ããŠããŸãã ãã«ããŒïŒUnity Cloud BuildãŸãã¯ãã®ä»ã®ãã«ããã·ã³ïŒã䜿çšããå Žåããã®ãªãã·ã§ã³ã¯ãŸã£ããåãå ¥ããããŸããã ãããã®ç®çã®ããã«ãUnity3Déçºè ã¯æãç©Žãæ®ããŸããã
UnityAppController.hãã¡ã€ã«ã«ã¯ãå€æ°ãšã¡ãœããã®å®£èšã«å ããŠããã¯ãå®çŸ©ãå«ãŸããŠããŸãã
#define IMPL_APP_CONTROLLER_SUBCLASS(ClassName) ...
ãã®ãã¯ãã¯ãåã«ã¢ããªã±ãŒã·ã§ã³ã®ããªã²ãŒãããªãŒããŒã©ã€ãããããšãå¯èœã«ããŸãã ãããè¡ãã«ã¯ãããã€ãã®ç°¡åãªæé ãå®è¡ããå¿ èŠããããŸãã
- Objective-Cã§ç¬èªã®ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããäœæãã
- ãœãŒã¹ã³ãŒãå
ã®ã©ããã«æ¬¡ã®è¡ãè¿œå ããŸã
IMPL_APP_CONTROLLER_SUBCLASS(___)
- Unity3Dãããžã§ã¯ãã®Plugins / iOSãã©ã«ããŒå ã«ãã®ãœãŒã¹ãé 眮ããŸã
ããã§ãæšæºUnity3Dã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããã«ã¹ã¿ã ããªã²ãŒãã«çœ®ãæãããããããžã§ã¯ããåãåããŸãã
ããªã²ãŒã眮æãã¯ãã¯ã©ã®ããã«æ©èœããŸãã
ãã¯ãã®å®å šãªãœãŒã¹ã³ãŒããèŠãŠã¿ãŸãããã
#define IMPL_APP_CONTROLLER_SUBCLASS(ClassName) ... @interface ClassName(OverrideAppDelegate) \ { \ } \ +(void)load; \ @end \ @implementation ClassName(OverrideAppDelegate) \ +(void)load \ { \ extern const char* AppControllerClassName; \ AppControllerClassName = #ClassName; \ } \ @end
ãœãŒã¹ã§ãã®ãã¯ãã䜿çšãããšããã¯ãã§èª¬æãããŠããã³ãŒããã³ã³ãã€ã«æ®µéã§ãœãŒã¹ã®æ¬äœã«è¿œå ãããŸãã ãã®ãã¯ãã¯æ¬¡ã®ããšãè¡ããŸãã ãŸããã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«loadã¡ãœãããè¿œå ããŸãã Objective-Cã®ã³ã³ããã¹ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããããªãã¯ãã£ãŒã«ããšã¡ãœããã®ã³ã¬ã¯ã·ã§ã³ãšèããããšãã§ããŸãã CïŒã§ã¯ãã¯ã©ã¹ã«éçãªããŒãã¡ãœããã衚瀺ãããäœãè¿ãããŸããã 次ã«ããã®ããŒãã¡ãœããã®å®è£ ãã¯ã©ã¹ã®ã³ãŒãã«è¿œå ãããŸãã ãã®ã¡ãœããã§ã¯ãå€æ°AppControllerClassNameã宣èšãããŸããããã¯ãcharåã®é åã§ããããã®å€æ°ã«ã¯å€ãå²ãåœãŠãããŸãã ãã®å€ã¯ãã¯ã©ã¹ã®æåååã§ãã æããã«ããã®æ å ±ã¯ãã®ãã¯ãã®åäœã¡ã«ããºã ãç解ããã®ã«ååã§ã¯ãªãããããã®ãããŒããã¡ãœãããšã¯äœããå€æ°ã宣èšãããçç±ãç解ããå¿ èŠããããŸãã
å ¬åŒããã¥ã¡ã³ãã§ã¯ãããŒãã¯ãã¡ã€ã³é¢æ°ãåŒã³åºãããåã§ãã£ãŠããã¢ããªã±ãŒã·ã§ã³ã®èµ·åã®ããåæã®æ®µéã§ãåã¯ã©ã¹ïŒå ·äœçã«ã¯ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãªãã¯ã©ã¹ïŒã«å¯ŸããŠ1ååŒã³åºãããç¹å¥ãªã¡ãœããã§ãããšè¿°ã¹ãŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã®Objective-cïŒã©ã³ã¿ã€ã ïŒã©ã³ã¿ã€ã ç°å¢ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æäœäžã«äœ¿çšããããã¹ãŠã®ã¯ã©ã¹ãç»é²ããå®è£ ãããŠããå Žåã¯ãã®äžã§loadã¡ãœãããåŒã³åºããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã®äœæ¥ãéå§ããåã§ãã£ãŠããå€æ°AppControllerClassNameãã¯ã©ã¹ã«è¿œå ãããããšãããããŸããã
ãããŠãããããŠããã®å€æ°ãã¡ãœããå ã§å®£èšããããã®ã¡ãœãããçµäºãããšã¡ã¢ãªããåé€ãããå Žåããã®å€æ°ãæã€ããšã®ãã€ã³ãã¯äœã§ããïŒããšèãããããããŸããã ãã®è³ªåã«å¯Ÿããçãã¯ãObjective-Cã®ç¯å²ããããã«è¶ ããŠããŸãã
C ++ã¯ã©ãã«ãããŸããïŒ
ãã®å€æ°ã®å®£èšãããäžåºŠèŠãŠã¿ãŸããã
extern const char* AppControllerClassName;
ãã®å®£èšã§ç解ã§ããªãå¯äžã®ãã®ã¯ãextern修食åã§ãã çŽç²ãªObjective-Cã§ãã®ä¿®é£Ÿåã䜿çšããããšãããšãXcodeã¯ãšã©ãŒãã¹ããŒããŸãã å®éããã®ä¿®é£Ÿåã¯Objective-Cã®äžéšã§ã¯ãªããC ++ã§å®è£ ãããŠããŸãã Objective-Cã¯ããã¯ã©ã¹ãåããCèšèªãã§ãããšèšã£ãŠãéåžžã«ç°¡æœã«èª¬æã§ããŸãã Cèšèªã®æ¡åŒµæ©èœã§ãããObjective-Cã³ãŒããæ£åšããCã³ãŒããç¡å¶éã«äœ¿çšã§ããŸãã
ãã ããexternããã®ä»ã®C ++æ©èœã䜿çšããã«ã¯ãObjective-C ++ã䜿çšããããã®ããã€ãã®ããªãã¯ãå¿ èŠã§ãã ãã®èšèªã«ã€ããŠã¯ãC ++ã³ãŒãã®æ¿å ¥ãèš±å¯ããã®ã¯åãªãObjective-Cã³ãŒãã§ãããšããäºå®ã®ãããäºå®äžæ å ±ããããŸããã äžéšã®ãœãŒã¹ãã¡ã€ã«ãObjective-Cã§ã¯ãªãObjective-C ++ãšããŠã³ã³ãã€ã«ããå¿ èŠãããããšãã³ã³ãã€ã©ãèæ ®ããã«ã¯ããã®ãã¡ã€ã«ã®æ¡åŒµåã.mãã.mmã«å€æŽããã ãã§ãã
extern修食åèªäœã¯ãã°ããŒãã«å€æ°ã宣èšããããã«äœ¿çšãããŸãã ãã£ãšæ£ç¢ºã«èšãã°ãã³ã³ãã€ã©ã«ãä¿¡ããŠãã ããããã®ãããªå€æ°ã¯ååšããŸããããã®ã¡ã¢ãªã¯ããã§ã¯ãªãå¥ã®ãœãŒã¹ã«å²ãåœãŠãããŸããã ãããŠåœŒå¥³ã«ã¯äŸ¡å€ããããŸããç§ã¯ä¿èšŒããŸããã ãããã£ãŠãã³ãŒãè¡ã¯åã«ã°ããŒãã«å€æ°ãäœæãããã®äžã«ã«ã¹ã¿ã ã¯ã©ã¹ã®ååãæ ŒçŽããã ãã§ãã ãã®å€æ°ã䜿çšã§ããå Žæãç解ããã ãã§ãã
ã¡ã€ã³ã«æ»ã
åã«èšã£ãããšãæãåºããŠãã ãã-ã¢ããªã±ãŒã·ã§ã³ããªã²ãŒãã¯ã¯ã©ã¹åãæå®ããããšã§äœæãããŸãã éåžžã®Xcodeãããžã§ã¯ããã³ãã¬ãŒãã§å®æ°å€[myClassã¯ã©ã¹]ã䜿çšããŠããªã²ãŒããäœæãããå Žåãã©ãããUnityã®ã¡ã³ããŒã¯ãã®å€ãå€æ°ã§ã©ããããããšã決å®ããŸããã ç§åŠçãªçªãæ¹æ³ã䜿çšããŠãUnity3Dã«ãã£ãŠçæãããXcodeãããžã§ã¯ããååŸãã main.mmãã¡ã€ã«ã«ç§»åããŸãã
ãã®äžã«ã¯ä»¥åãããè€éãªã³ãŒãããããŸããããã®ã³ãŒãã®äžéšã¯äžå¿ èŠãªãã®ãšããŠæ¬ èœããŠããŸãã
// WARNING: this MUST be c decl (NSString ctor will be called after +load, so we cant really change its value) const char* AppControllerClassName = "UnityAppController"; int main(int argc, char* argv[]) { ... UIApplicationMain(argc, argv, nil, [NSString stringWithUTF8String: AppControllerClassName]); } return 0; }
ããã§ã¯ããã®ãŸãã«å€æ°ã®å®£èšãšããã®å©ããåããŠã¢ããªã±ãŒã·ã§ã³ããªã²ãŒããäœæããŠããŸãã
ã«ã¹ã¿ã ããªã²ãŒããäœæããå Žåãå¿ èŠãªå€æ°ãååšããæ¢ã«éèŠã§ã-ã¯ã©ã¹ã®ååã ã¡ã€ã³é¢æ°ã®åã«å€æ°ã宣èšããŠåæåãããšãããã©ã«ãå€-UnityAppControllerãèšå®ãããŸãã
ãã®æ±ºå®ã«ããããã¹ãŠãéåžžã«æ確ã«ãªããŸãã
ãã¯ãã®åé¡
ãã¡ããã倧å€æ°ã®ç¶æ³ã§ã¯ããã®ãã¯ãã䜿çšããããšã¯çŽ æŽããã解決çã§ãã ãã ãã倧ããªèœãšãç©Žãããããšã«æ³šæããŠãã ãããè€æ°ã®ã«ã¹ã¿ã ããªã²ãŒããæã€ããšã¯ã§ããŸããã ããã¯ã2ã€ä»¥äžã®ã¯ã©ã¹ãIMPL_APP_CONTROLLER_SUBCLASSãã¯ãïŒClassNameïŒã䜿çšããå Žåãæåã®ã¯ã©ã¹ã«ã¯å¿ èŠãªå€æ°ã®å€ãå²ãåœãŠããããã以éã®å²ãåœãŠã¯ç¡èŠãããããã§ãã ãããŠããã®å€æ°ã¯æååã§ããã€ãŸããè€æ°ã®å€ãå²ãåœãŠãããšã¯ã§ããŸããã
ãã®åé¡ã¯çž®éããŠãããå®éã«ã¯ããããããªããšæããããããããŸããã ãããããã®ãããªåé¡ãå®éã«çºçããŠããªãã£ãå ŽåããããŠéåžžã«å¥åŠãªç¶æ³äžã§ããããã®èšäºã¯èµ·ãããŸããã§ããã ç¶æ³ã¯æ¬¡ã®ãšããã§ãã å€ãã®åæããã³åºåãµãŒãã¹ã䜿çšãããããžã§ã¯ãããããŸãã ãããã®ãµãŒãã¹ã®å€ãã«ã¯ãObjective-Cã³ã³ããŒãã³ãããããŸãã 圌ãã¯ããªãã®ãããžã§ã¯ãã«é·ãéååšããŠãããããªãã¯åœŒããšã®ãã©ãã«ãç¥ããŸããã ããã§ã¯ãã«ã¹ã¿ã ããªã²ãŒããäœæããå¿ èŠããããŸãã åé¡ããããªããæãããã«èšèšãããéæ³ã®ãã¯ãã䜿çšãããããžã§ã¯ããæ§ç¯ããã¢ã»ã³ããªã®æåã«é¢ããã¬ããŒããååŸããŸãã ããã€ã¹ã§ãããžã§ã¯ããå®è¡ãããšãæ©èœãåäœãããåäžã®ãšã©ãŒãçºçããŸããã
ãããŠãåºåãŸãã¯åæãã©ã°ã€ã³ã®1ã€ãåããã¯ãã䜿çšããŠããå¯èœæ§ããããŸãã ããšãã°ã AppsFlyerã®ãã©ã°ã€ã³ã§ã¯ããã®ãã¯ãã䜿çšãããŸãã
è€æ°ã®å®£èšã®å Žåã®externå€æ°ã®å€ã¯äœã§ããïŒ
åãexternå€æ°ãè€æ°ã®ãã¡ã€ã«ã§å®£èšãããŠããããã¯ãã®æ¹æ³ïŒloadã¡ãœããïŒã§åæåãããŠããå Žåãå€æ°ãã©ã®å€ãåãããã©ã®ããã«ç解ã§ããŸããïŒ ãã¿ãŒã³ãç解ããããã«ãç°¡åãªãã¹ãã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã ããã®ã³ãŒãã¯ããã«ãããŸã ã
ã¢ããªã±ãŒã·ã§ã³ã®æ¬è³ªã¯ç°¡åã§ãã 2ã€ã®ã¯ã©ã¹AãšBããããäž¡æ¹ã®ã¯ã©ã¹ã§ãå€éšå€æ°AexternVarã宣èšãããç¹å®ã®å€ãå²ãåœãŠãããŸãã ã¯ã©ã¹ã®å€æ°å€ã¯ç°ãªã£ãŠèšå®ãããŸãã ã¡ã€ã³é¢æ°ã§ã¯ããã®å€æ°ã®å€ããã°ã«èšé²ãããŸãã å€æ°ã®å€ã¯ããœãŒã¹ããããžã§ã¯ãã«è¿œå ãããé åºã«äŸåããããšãå®éšçã«å€æããŸããã Objective-Cã©ã³ã¿ã€ã ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«ã¯ã©ã¹ãç»é²ããé åºã¯ããã«äŸåããŸãã å®éšãç¹°ãè¿ãããå Žåã¯ããããžã§ã¯ããéãããããžã§ã¯ãèšå®ã®ããã«ããã§ãŒãºãã¿ããéžæããŸãã ãããžã§ã¯ãã¯ãã¹ãçšã§å°èŠæš¡ãªã®ã§ããœãŒã¹ã³ãŒãã¯8ã€ãããããŸããã ãããã¯ãã¹ãŠã[ãœãŒã¹ã®ã³ã³ãã€ã«]ãªã¹ãã®[ãã«ããã§ãŒãº]ã¿ãã«ãããŸãã
![](https://habrastorage.org/webt/oi/ly/ln/oilylnhxdyjg3cvgcrj5nzhjvwy.png)
ãã®ãªã¹ãã§ã¯ã©ã¹Aã®ãœãŒã¹ãã¯ã©ã¹Bã®ãœãŒã¹ãããé«ãå Žåãå€æ°ã¯ã¯ã©ã¹Bããå€ãååŸããŸãããã以å€ã®å Žåãå€æ°ã¯ã¯ã©ã¹Aããå€ãååŸããŸã
ãããçè«çã«ã©ãã ãå€ãã®åé¡ãåŒãèµ·ããå¯èœæ§ãããããæ³åããŠã¿ãŠãã ããã ç¹ã«ããããžã§ã¯ãã巚倧ã§èªåçã«çæããããã®ãããªå€æ°ãã©ã®ã¯ã©ã¹ã§å®£èšãããŠãããããããªãå Žåã
åé¡è§£æ±º
ãã®èšäºã®ååã§ãObjective-CãCïŒReflectionã«æå©ãªã¹ã¿ãŒããåããšèšãããŸããã å ·äœçã«ã¯ãåé¡ã解決ããããã«ã Method SwizzlingãšåŒã°ããã¡ã«ããºã ã䜿çšã§ããŸãã ãã®ã¡ã«ããºã ã®æ¬è³ªã¯ãã¢ããªã±ãŒã·ã§ã³äžã«ä»»æã®ã¯ã©ã¹ã®ã¡ãœããã®å®è£ ãå¥ã®ã¯ã©ã¹ã®å®è£ ã«çœ®ãæããæ©äŒãããããšã§ãã ãããã£ãŠãUnityAppControllerã®ç®çã®ã¡ãœãããã«ã¹ã¿ã ã¡ãœããã«çœ®ãæããããšãã§ããŸãã æ¢åã®å®è£ ãæ¡çšããå¿ èŠãªã³ãŒããè£å®ããŸãã ã¡ãœããã®æ¢åã®å®è£ ãå¿ èŠãªãã®ã«çœ®ãæããã³ãŒããæžããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã®äœæ¥äžããã¯ãã䜿çšããããªã²ãŒãã¯ä»¥åã®ããã«æ©èœããUnityAppControllerã®åºæ¬å®è£ ãåŒã³åºããŸããããã§ã«ã¹ã¿ã ã¡ãœãããæ©èœããç®çã®çµæãåŸãããŸãã ãã®æ¹æ³ã¯ã ãã®èšäºã§è©³ãã説æãããŠããŸã ã ãã®ææ³ã䜿çšããŠãè£å©ã¯ã©ã¹ïŒã«ã¹ã¿ã ããªã²ãŒãã®é¡äŒŒç©ïŒãäœæã§ããŸãããã®ã¯ã©ã¹ã§ã¯ããã¹ãŠã®ã«ã¹ã¿ã ã³ãŒããèšè¿°ããã«ã¹ã¿ã ã¯ã©ã¹ãä»ã®ã¯ã©ã¹ã®æ©èœãåŒã³åºãäžçš®ã®ã©ãããŒã«ããŸãããã®ã¢ãããŒãã¯æ©èœããŸãããã¡ãœããã眮ãæããããå Žæãšãããããããçµæã远跡ããããšãå°é£ã§ãããšããäºå®ã®ãããéåžžã«æé»çã§ãã
åé¡ã®å¥ã®è§£æ±ºç
çºçããåé¡ã®äž»ãªåŽé¢ã¯ãã«ã¹ã¿ã ããªã²ãŒããå€æ°ååšããããšããŸãã¯1ã€ã ããæã€ããšãã§ããããŸãã¯éšåçã«2ã€ã«çœ®ãæããããšãã§ããããšã§ããåæã«ãã«ã¹ã¿ã ããªã²ãŒãã®ã³ãŒããç°ãªããœãŒã¹ãã¡ã€ã«ã«å¿ã³å¯ããªãããã«ããæ¹æ³ã¯ãããŸãããã¢ããªã±ãŒã·ã§ã³ã«ããªã²ãŒãã1ã€ãããªãå Žåã¯ãç¶æ³ãåç §ãšèŠãªãããšãã§ããã«ã¹ã¿ã ã¯ã©ã¹ã奜ããªã ãäœæã§ããå¿ èŠããããŸããããããã®ã¯ã©ã¹ã¯ããããåé¡ãåé¿ããããã«ãã¯ãã䜿çšããŸããã
ç©äºã¯å°ããããã«ããã·ã³ã䜿çšããŠãããžã§ã¯ãããã«ãããæ©èœãæ®ãããŸãŸãUnity3Dã䜿çšããŠãããã©ã®ããã«è¡ãããšãã§ãããã決å®ããŸãã解決ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- å¿ èŠãªéã®ã«ã¹ã¿ã ããªã²ãŒããäœæãããã©ã°ã€ã³ã®ããžãã¯ãç°ãªãã¯ã©ã¹ã«åå²ããSOLIDã®ååãé å®ããæŽç·Žã«é Œããªãããã«ããŸãã
- UnityAppController XCode . UnityAppController .
- UnityAppController Unity .
- XCode UnityAppController ,
ãã®ãªã¹ãã§æãé£ããé ç®ã¯ééããªãæåŸã§ãããã ãããã®æ©èœã¯ããã¹ãããã»ã¹ãã«ãã¹ã¯ãªããã䜿çšããŠUnity3Dã«å®è£ ã§ããŸãããã®ãããªã¹ã¯ãªããã¯ãããçŸããå€ã«æžããããã®ã§ãGitHubã§èŠãããšãã§ããŸãã
ãã®åŸåŠçã¯ããªã䜿ãããããUnityãããžã§ã¯ãã§éžæããŸããã€ã³ã¹ãã¯ã¿ãŒãŠã£ã³ããŠãèŠãŠãNewDelegateFileãšãããã£ãŒã«ãã確èªããŸããå€æŽããUnityAppControllerããã®ãã£ãŒã«ãã«ãã©ãã°ã¢ã³ãããããããŠä¿åããŸãã
![](https://habrastorage.org/webt/zs/sb/l2/zssbl2ttito42xsbqwcpqzqfezs.png)
iOSãããžã§ã¯ãããã«ããããšããæšæºã®ããªã²ãŒãã¯å€æŽããããã®ã«çœ®ãæããããæåã®ä»å ¥ã¯äžèŠã§ããããã§ããããžã§ã¯ãã«æ°ããã«ã¹ã¿ã ããªã²ãŒããè¿œå ãããšãã«ãUnityãããžã§ã¯ãã«ããUnityAppControllerãªãã·ã§ã³ãå€æŽããã ãã§æžã¿ãŸãã
PS
æåŸã«ãã©ãçããã¿ããªã®ãããã§ããã®èšäºã¯æ¬åœã«éåžžã«é·ããªã£ãããšãããããŸããããã€ã³ããããæ å ±ã圹ã«ç«ã€ããšãé¡ã£ãŠããŸãã