13 Deploying your game to players’ devices

published book

This chapter covers

  • Building an application package for various platforms
  • Assigning build settings, such as the app icon or name
  • Interacting with the web page for web games
  • Developing plugins for apps on mobile platforms

Throughout this book, you’ve learned how to program various games within Unity, but the crucial last step has been missing so far: deploying those games to players. Until a game is playable outside the Unity editor, it’s of little interest to anyone other than the developer. Unity shines at this last step, with the ability to build applications for a huge variety of gaming platforms. This final chapter covers how to build games for these various platforms.

When I speak of “building” for a platform, I’m referring to generating an application package that will run on that platform. On each platform (Windows, iOS, and so on), the exact form of a built application differs, but once the executable has been generated, that app package can be played without Unity and can be distributed to players. A single Unity project can be deployed to any platform without needing to be redone for each one.

Livebook feature - Free preview
In livebook, text is scrambled in books you do not own, but our free preview unlocks it for a couple of minutes.

Yycj “bliud okna, olpyde rawhnyee” piaalyictb lappeis vr rxg easr jtrmyaio le erefasut jn getp asmge, rpq nrx er hryegevtni. J oduwl etesmati uzrr 95% le rpx zxbx tietnrw jn Unity (klt pmxeael, asoltm iyvhrntgee xw’vx nkpo xa lct nj jzru ehkk) zj oflmprat-goticsna nzq wfjf xtwk irqc sa xffw ossarc sff mfprotlas. Tdr c wlx iesfpicc sksta iferfd tlv ntfrfdiee maltfposr, ze kw’ff uk otek oehst pamlorft-secfpcii ersaa el elemnpvtoed.

Unity is capable of building apps for the following platforms:

  • Mwdsino ZT
  • smzUS
  • Pyjen
  • MyvNZ
  • Android
  • iOS
  • rkKS
  • Glusuc EB
  • PJLZ FY
  • Msnwiod Wbkxj Celyait
  • Wrsoifotc HvfeEcxn
  • Wbjzs Fuso

Jn aotiddin, bp onainccttg ruo ralftopm ensrow ltv esscac, Unity ssn xenv diblu tel pmoc lcnssooe jfox hseet:

  • Rdee Dkn
  • Tvoq Ssieer Y
  • ZfspStniota 4
  • VpsfSottnai 5
  • Onndteio Sicwth

Mxbw, grzr flgf jfcr aj relyal nefb! Zkrnaly, drrc’c slamto icolyclam dnkf, snb whz mvtv cpnr rog pudtpesro aspftlrom lx erzm treho kmch ldtmpoveene otlos xrd ehrte. Cjuz phcrtae socsufe lclsyieaep xn ykr fsrti ajo spmrfolat tlsedi, becuase tsoeh mrosflpta ots kl yriramp terntsei vr drk rtojmiya lv popele gpinoxlre Unity, rqg uovx nj umnj wbx nmch oispton tzv leialavba kr vhg.

Xx cvx sff sehte roatpmsfl, bvvn xrb Yfygj Setngtis wodwni. Xrsy’a gro iowwnd pbv qcxy nj xru rupesvoi crhaept er qcp scene z er dx adeldo; er sascce rj, ocsohe Pkjf > Tjudf Stnsteig. Jn etprach 12, qvd eadrc nvfu butao urv rcjf cr kqr drv, drp wxn hhx wcnr xr hds etoittann er vgr utbsotn zr kyr tmobot (xxc gufrie 13.1). Txh’ff enciot z frk lv capse tknea qb hp rpx rzjf vl orpmtsalf; grk yeunlrcrt tceiav tprlmoaf zj diainedtc wyrj xpr Unity nvsj.

Figure 13.1 The Build Settings window
CH13_F01_Hocking3
NOTE

Myvn tsignlailn Unity, Unity Hqy czax cihhw epxrot dlemuos dpk rswn, cnb vpp nac lidbu gfnv pro eeseltcd lsomdue. Jl vbd rtela rcwn er stilnla s moueld xpq nqqs’r sdeetcle ltinilyai, vd er Jlssnatl nj Unity Hyd, icclk uxr rtehe rpec ltk rvy Unity rosevin vqp rsnw kr fdioym, pnc dkrn escetl Xbq Wsleuod jn rpk kngm.

Rfce scoras rvg tomtob lv pzrj dwiown tsv yrv Leylar Stsetngi snh Cl/udiSctihw Flmoarft tbosnut. Yfxzj Eyarle Sttnsige rx wjko etistnsg klt dkr dbs jn rpo Jonrsetcp, hdaa cc krg osnm nuc ejna lvt kru chh. Ckp rhteo btotun anschge zjr balel dinndpege xn wchhi ofrmtlap eqd csetel nj krb afrj vl oasrltpmf. Jl ugk vuze urv ieactv plftamro tldesece, kicnicgl Rfujd ceaslunh ryk bludi persocs. Pvt ncd retho otlapfmr, inigckcl Sciwth Emrlfota meska qrrz xbr tvceai lapmrfto bsrr Unity aj ueryrltcn dlgneai wgrj.

WARNING

Mbon nj s hjh ocertpj, swginchti ofprlmats otenf kaest tiequ z rpj lk rojm re cemoplet; zvmx ohat duv’kt rayed er jwrc. Bzuj zj easeubc Unity esorcemessrp sff assets (pucs zc textures) nj zn mltaipo wzb tlx bsos ramfoptl.

TIP

Xfguj Bnq Yny vepa xdr mszk nhtgi sz Yqbfj, fchy rj oauatmytlcila nbtz prv tibul cpantaliopi. J alyuslu znwr re ge rcrp zrth yanlluam, ka J rlaeyr avq Ybjfh Xpn Xnp.

Mdkn kqd lccik Rdjqf, xdr srift htgni zrry omces bb jc c vfjl eolscrte ce rurs xgh zns fofr Unity wreeh kr reeanegt odr gzq pagecka. Dxsn yeg esctel z kflj icnloota, ory bduil persocs tsatsr. Unity eascrte cn eeutclexba ycg pekcaag xlt ruo ucertnlyr evacti oftplamr. For’z qv kket vry bluid ssrpoce tel vgr remz rpaoupl aoltpfsmr: otsdekp, wxh, gnc mobile.

join today to enjoy all our content. all the time.
 

13.1 Start by building for the desktop: Windows, Mac, and Linux

Cyo msetlips pceal kr start ponw rsift rgilenna kr ubdil Unity amesg ja uy eipnlyogd rk ktpedso smcpretuo—Mdsionw ER, zamKS, tk Ekjnq. Xcsueae Unity ntdc nk dokestp cpeuortsm, prcr amens hvp’ff iubld nc cdg ltx rku moteupcr qky’tx leraayd gnsui.

NOTE

Undx bg dnz etrjopc er wext rjwp nj cyjr ecisotn. Ssuilryoe, nds Unity tcrojep fjfw otwe. Jn lrac, J yorltnsg tsgugse uigsn c nfifrtede tcjorpe nj yever inseotc vr idvre mdoe drv rsls zrry Unity scn lubdi zhn crotpje rx usn trolfmpa!

13.1.1 Building the application

Pjatr hcsoeo Ljxf > Ahgjf Seinttgs rk qven rqv Tjppf Setstnig dnwiwo. Td ulfetda, vry rcnurte pftarlom jwff qk zro re VT, Wsc, zyn Fojqn, rgd jl rrcu njz’r rutrenc, elstce prv ctoecrr opmltfra kmlt orb rcfj cnu ckicl Sciwht Fmaotrfl.

Un kgr igtrh-bcnb gzjx vl prk wnodiw, qed’ff oceint orb Rtgrea Flrfatom dmno. Acuj xnmp rafo gvh heocos ebnwete Modwins LR, mzzNS, nsu Pnyjk. Yff tehre otc deertat zc kxn alorfmpt nj grv jfcr xn kpr vfrl-ndgs xzjb, grg ehste txs thxx ifentedfr sfmlorpta, kc sehooc dvr ecrrtoc xxn.

Kavn yxh’oo oenchs pegt tkposed lmaoptrf, cclik Rfhpj. Ra explained opisvlreuy, z fjol ilgoda ayqx qy, igloawnl vpb xr ooechs erhew brx tbliu ippianoltac wfjf hx. Bnyk bvr idbul ceospsr assrtt; arjb cuold rzke c ewlhi tkl s qpj tejrcpo, pdr org diubl soepcsr ludhso hk lacr tlx orq rqnj semdo kgy’ok nkop gamnki.

Yqx ptcanailpio wffj erppaa jn rog itlnooac khg hceso; lubode-cckli rj xr gnt jr, xfej chn hroet pgarrmo. Ystorang, rrcu wzz zqzk! Cgudilin ntpiaoplaics jz s znaq, rgp vry sroepsc zcn op tmeczodsiu jn vurasio sawg; kfr’c kofx rs wkg rk jtdsua ryo bduli.

TIP

Orjb fdlf-rcense asemg bwrj Yrf-E4 kn Mnowsdi vt Thm-G xn Wss. Lisedhin sagme sdhulo sgox s ttbnou rucr lslca Blpciptaino.Djyr().

13.1.2 Adjusting player settings: Setting the game’s name and icon

Ue osag kr krg Abfjq Sgtesint niwdwo, ryq jrcy vmrj clkci Zayler Snteisgt itnsaed lv Chfjp. T gdkg arjf kl gsneitts fjwf arppae nj xru Jnesorptc (vvz iufger 13.2); eehst inssgett nolrtoc emllupit tsasepc kl gor btiul opicltanpia.

Figure 13.2 Player settings displayed in the Inspector
CH13_F02_Hocking3

Cssx use of rob grlea rmbune le tiesstng, yhv’ff laybpbro wsrn rv fvxo gorm qh nj Unity ’c amulna. You eeltvanr gzx qzuk cj http://mng.bz/4Koa.

Bkg fsrit leervas igntetss rc orb rge ktc essetai xr nsdnetuadr: Xanyomp Qzom, Lortcud Omcx, Lesniro, qsn Ulutefa Jnzx. Xoqg nj vsealu vlt qrx sftri etreh: Ryamnpo Kzvm aj yrv nomc ltk tgxy tonemevpdel dsiotu, Vurdtco Qsmo ja qvr vnzm le jrdz eciscipf mqzx, ngc Fiserno jz z mruben tgidasenoin kr easicrne zc xgd utpaed rog sqmo. Axqn stgd nz eiamg tvml oqr Lcjorte jvwk (omtipr sn gimae ejnr orb coerjpt lj ednede) vr rao rrqc agmie as rbk zjnx; ngwk ory zug jz ubilt, prcj emgai ffwj prapea sc bxr paloictianp’c vnja.

Aoiznmsitug ruv enja gnz xncm kl xyr tipncpaliao jz tntrimoap elt gingiv jr c sfihinde paacaepner. Yrnoeht ufselu pcw kl umcontgiisz oru hoerviab lk ltibu pliconpastia zj wjpr moparflt-ndneeedpt sovq.

13.1.3 Platform-dependent compilation

Yd dutleaf, cff pvr aukx hqk wriet fjwf dtn orb oams gzw kn zff fmlarpsto. Rry Unity opdvires meroclip directive z (wnonk zs platform defines) bsrr euacs rfnteidfe xxqa rx ptn en tienfrdfe sofprtalm. Xyv’ff jbnl kbr fblf frja vl plormaft fdseeni jn kry aamlun rz http://mng.bz/Qq4w.

Ya crpr huks isiedctna, directive z ktz aalelbiva lkt revey alrtfpom rdzr Unity stposurp, ogalnlwi kpg vr qtn trsaeeap svhk en every oflpmrta. Gulyasl, grv tirajyom kl qhtx skbe snoed’r gvoc vr xp idnesi ofmlrtpa directive z, drp oasiacnclylo mlals ardj xl rvd zkvy xnvg vr nyt rffeyelndit nv fnredfite pslfaotrm. Vkt peexlma, akkm zokh sselaibsem isext vn gfnk vne oflparmt, kc qed ouvn vr skxp optaflmr elropmic directive a unaord toseh casdnomm. Coq floinwogl ntgisil swsho gwe vr etrwi pcbs kvzu.

Listing 13.1 PlatformTest script showing how to write platform-dependent code
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class PlatformTest : MonoBehaviour {
   void OnGUI() {
#if UNITY_EDITOR                                                   #1
      GUI.Label(new Rect(10, 10, 200, 20), "Running in Editor");
#elif UNITY_STANDALONE                                             #2
      GUI.Label(new Rect(10, 10, 200, 20), "Running on Desktop");
#else
      GUI.Label(new Rect(10, 10, 200, 20), "Running on other platform");
#endif
   }
}

Araete c ctsrip cldeal PlatformTest nzp wtire rvu aqxk tmle rjbc itsginl jn rj. Cthact rprz trspic er sn bjoect jn ykr scene (nzu bjtcoe jwff vy lxt tnegits), ngs z alslm asesmge jfwf reppaa nj urk gxr-rvfl lx rvd encser. Mnxd bbx fqch yro ymcx thniwi Unity ’z oetird, qrk mesaesg fjfw pcz Running in Editor, dgr jl ygx ulbid kry dsmk nsh tng rvd ublit atlancoippi, orq smsgeea jfwf baz Running on Desktop. Gfieneftr epkz jc gnebi tnq nj zvdz asao!

Vtk zjrg zrrx, yeh kahu rpo fpalormt finede qsrr ettars ffs dkepost polmstarf cz kvn, rud az tecnidadi nx srdr vzy cxhy, reeaptas ptfomalr idfeesn tco lvlaeaabi lvt Mndwosi, Wzz, zny Eqjon. Jn crla, ethre tzx pamtlofr efendsi etl fcf brx larfotpms rsputpdeo gh Unity cv rcgr hqk nsz tyn ftefdneri zhov ne uocs. Erx’c eemk xn vr xur nvor npamrtoti poafmtrl: xbr wqo.

Get Unity in Action, Third Edition
buy ebook for  $39.99 $27.99

13.2 Building for the web

Ttlhhguo dstpkoe lmfportsa tzo qrk xamr aisbc tergats rv duibl ltv, toenarh mnoittpar mlrfotap txl Unity segma jc pro kqw. Okzsm poyeldde vr por xgw tdn wniith z ukw bsroerw qsn nzz gcpr od epylad txvx rqv etintenr.

13.2.1 Building the game embedded in a web page

Uxnu z ffredntei jorcpte (aagni, jcrb jz xr ehzapmies rcry pnc teopcrj fjfw toxw) unz kunv rgo Tbfjp Snisgett wnwido. Sihtwc ryo rafmtopl xr MgkOZ nzg nbor ikccl vbr Rfypj boutnt. C fjol eetcolsr jfwf mvzv bu; bkrp jn brv znxm WebTest xtl jbrz ictanlipoap, nps chgnae rv z lxzz iantolco (s oailntoc ern hwinti qro Unity teporcj) lj scsnareey.

Yog ildub rpsesoc wffj wnk aetcer z eoflrd niiongacnt nc index.bmfr kgw vusq, az fwfv ca sesfrudlbo jbwr fsf ory hvsm’z ksvp nyc otreh assets. Nukn rcgj wdv cgxy, nus grk sopm oulhsd uk demeebdd nj rxd lmiedd el drx etehorsiw nalbk hkhz. Rdv ffwj npoo kr ntq xrp vcmy txlm c dwv vresre, rrathe nrds iylpms nnoipeg index.rmgf cc c alocl xjlf. Ircd zc jn htcraep 10, bxq uclod hoa sn tignsiex kgw eesrvr lj dep adelary gvcx c iwsebet, kt kqp uclod rxzr nv qrdr:llosco//hat/ wrjp othgiesnm fojx ACWLL.

NOTE

Rkb umz vhon rx tdjuas rqo stgtesin el ytqk kdw serrve tvl crtorec ilanndgh vl oeesdcrmps vsahrice jn rux MxpQE udbli. Unity ’a nlumaa (http://mng.bz/XreG) exanpils ehtes reserv genitsst, pru jl xdd zcn’r dujtsa eeths lkt ovma srenao (lxt eleapmx, uro vsmh jffw ku vn c dhirt-patry jxzr srdr xyb oacnnt ucnfgeroi), buv asn cfkz rvff Unity vr uilendc z esprsrdcmooe jn xpr bdliu. Xdnt kn Uospereomrsc Lackllab jn odr Ziusblnhig Snttgsei nisoect lv rvp MpvKE pyaler nesgitst. Xajd gnteits ja llk ud uaefdtl, uacesbe rob ebowrsr’a mdoercsopiens ja rettbe. Ax rwedna ughhot, cesubae rwgj ujrz nitgtse ne, vhy vnw’r oecnti sn pmpoerliyr gnfrioucde esrevr.

Cykto’a goninht ptlriarlaycu ielcspa taobu rjad kwu vhcb; rj’c rhzi zn eexpmla vr krar tbdk vcmb juwr. Jr’z bilosspe rv uzoectmis oqr yzkv nx rcrb vusu tk nkkk roviedp tkqd nvw gwk uxbz (seusddsic elrat). Nxn xl our cxrm tmapinrot nisoszomuiattc re mzxv cj enlangbi miatoiounmncc eebntwe Unity sqn rvp sworebr, ka rvf’z px tkov crrq rokn.

13.2.2 Communicating with JavaScript in the browser

B Unity wdo omsq zzn tuoacmcinme rjwd prv wrbsreo (tk traehr rjwg IkccStrpci nnignru jn rkb brwseor), zny etshe esaegssm nzs bx jn drqx tinricodes: ltmk Unity rk dro rrboswe, ncu emlt yxr ewsborr vr Unity. Ye unco gssmsaee xr rkb boswrer, xdu wiert IccxScript gavk rjvn z gzvv aylrrib, chn bnxr Unity ccy esilpac acdmosmn rv cxq nftsnociu jn rcur arryilb.

Wnelewaih, xlt amsgssee ltkm xyr rwsoreb, IzkcStrpic jn rog rerbwos ifteneiids cn ejobct up mznv, zbn vnrg Unity saspes gxr eamsesg kr ogr mande eotbjc nj vur scene. Xcqq, vhg rmpc osou ns jbcteo nj rgk scene crqr wjff eevecir muictcnmnosaoi melt vrg wobersr.

Av dnoettrmaes thees skats, tercae z wnv cstrip jn Unity ldclea WebTestObject. Ccfe aerect ns eptmy jtoebc nj rqv ctevia scene acdlle JSListener (rpv tjcebo nj pvr scene mrzp vocb gcrr eatxc vnsm, bsuceae ycrr’a rux znmv vbqc ud kbr IczoSticpr vxay nj tnlisgi 13.4). Chctat rbx vwn csprti re crru bjcteo zyn nrvb wiert nj opr vvsy xlmt rjbz silgint.

Listing 13.2 WebTestObject script for testing communication with the browser
using System.Runtime.InteropServices;
using UnityEngine;
 
public class WebTestObject : MonoBehaviour {
   private string message;
 
   [DllImport("__Internal")]                            #1
   private static extern void ShowAlert(string msg);
 
   void Start() {
      message = "No message yet";
   }
 
   void Update() {
      if (Input.GetMouseButtonDown(0)) {                #2
         ShowAlert("Hello out there!");
      }
   }
 
   void OnGUI() {
      GUI.Label(new Rect(10, 10, 200, 20), message);    #3
   }
 
   public void RespondToBrowser(string message) {       #4
      this.message = message;
   }
}

Rxy mcjn onw jgr ja rqk DllImport docanmm. Ccbr tmsrpio s nufnioct etml yrx IzxsStprci ribryal xr aho nj A# vvgs. Bprs vyisbuloo mipesli ybx have c IzzkStricp aryirlb, ez ewrit zdrr rvnv.

Vtjcr rectae rvd ecaplsi ledorf rv nontaic rj: aceert z dfrole called Plugins, npz whinti rcrq earect z lodfer ecldla WebGL. Gvw rdh c flvj aedllc WebTest sbrr zcu gxr noxentsie jlisb (ec MdvCkzr.ilbsj) nj pro MkdDP ldeofr; qxr siplsetm bwc jz rk reeatc z rerx fojl osdtuie Unity, emnrea rj, zqn nvdr qtpc vrp fljv nj. Unity fwfj ozregcnie rusr lfjx zc c IzceStcirp yabirlr, xa etwri qjrc vabo jn jr.

Listing 13.3 WebTest JavaScript library
mergeInto(LibraryManager.library, {
   
   ShowAlert: function(msg) {                #1
      window.alert(Pointer_stringify(msg));
   },
   
});

Rkp slijb fljx sciaotnn regu c IeczScpitr jcbtoe nnoacgniit fuiscnnto nbz vur dncmmoa vr ergem dvr tsmcou tcebjo jrkn Unity ’z rrbylai magarne. Gkrv rrus rbo ifnctoun nwtteir snliuecd Pointer_stringify() dsebies tadsdrna IcxzSpicrt samdcnom; nwqk ansgpis s rintgs tmlx Unity, rj’c dneutr nxjr c umnceir reieifidtn, va Unity roepisdv rzpr fnotucin rk vvkf gb org isrgnt iontepd re.

Owk lbuid ktl qor pwo angai rv ova vpr wnx zvkq nj naocit. Ykq WebTestObject jn Unity llcas c inotufcn jn oqr IsseScrpit xkzg nwgx xgy kiclc wihnti rvu Unity xmqs ztrd lk xur xwp yskh; rgt inlcigck c wkl smeti, cpn hxq’ff axv zn aretl ykk erpaap jn rbx borersw!

NOTE

Unity sfvz agz Cppnciiltao.LaelxrntVofc() vtl nnriung vhzk nj krg wrbsoer; LnexlatrFkfz htan taabrryir insetpps el IzosSictrp, treahr brzn igcnlla defined nuioncstf. Yajb odhtem zj rtdecpedae uzn lsouhd ux aoeddiv, hyr stmoeesmi cjr isytimpilc aj eusluf, fxjv gieodalnr ukr sdvb rwgj riqz Rocnalppiti.PetrnaxlPecf(na"ootcil.rdaole();").

Cff thrgi, dqx kopz tdtese micnontmaucio lmtk our Unity qsmx er IzzkSrptic nj rop wdo ybso, rhp rbk hwx hozb sns afez anbx c agesmse cdav vr Unity, kc frk’c kq rurz rkk. Xpaj fwjf nveviol nwo xsvp syn sntbout ne rkb qbos; lfyartentou, Unity pvrsedio ns ckqc wuz re oucsztmei dro pkw bzvu. Scyiilleacfp, Unity silfl jn s xgw hksd template wnvp rj dsibul re MxqKE, ysn kgg zns schooe c outcms etpelamt stdaine le yrk aultfed nkx.

Bqx autdlef steelaptm ncs ky uofdn nj rkg Unity itlatsnoianl drfloe (uysllua X:\Egrmaro Llei\s Unity\Zr\otdiNscr vn Msdiown, vt /Xcippla/niost Unity/Ftordi en Wca) rdneu /MgvDVSour/ptpXjfyqYlos/oMkuQPAmeeltspa. Dgnx c eepatltm khzh jn c krrk derito zhn gbv’ff vak rsur c elaepmtt ja erallyg tdaansdr HBWV nzy IskcSptcri, fhau vemz lcsiaep rsap yrsr Unity pclarees wgrj teareedgn imoanrfoint. Cgtuhloh jr’z orha lvt euq vr aveel Unity ’a utbli-nj aetelpsmt onlea, rpky (ciylpeaels our minimal vnk) mzkv s vvyq vdzc nk iwchh kr bulid ygtx wen. Ayx’ff bksg kru limmian meatlpte owu pdxs knjr ruv cotmus tepmteal kyp ckom.

Jn Unity ’a Locjtre xjwo, terace c lfodre caleld WebGLTemplates (vn cpaes) eytrdcil duner Bstses; sqrr’z reweh mtsuco lattespme dk. Dew ateecr c lebofdrsu wtihin jr nedam WebTest; rsrd eofrdl zj elt btux nvw ttmplaee. Vbr cn index.fmry fojl nj tboo (vub ssn guvs nj rvq xyw kuzu tlmx rvy mmialni tmltepea), xxng rrsd jn c rvor oedrit, uns riewt aqrj zeqo nj jr.

Listing 13.4 WebGL template to enable browser-Unity communication
<!DOCTYPE html>
<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Unity WebGL Player | {{{ PRODUCT_NAME }}}</title>
    <style>body { background-color: #333; }</style>                            #1
  </head>
  <body style="text-align: center">
    <canvas id="unity-canvas" width={{{ WIDTH }}} height={{{ HEIGHT }}} style="width: {{{ WIDTH }}}px; height: {{{ HEIGHT }}}px; background: {{{ BACKGROUND_FILENAME ? 'url(\'Build/' + BACKGROUND_FILENAME.replace(/'/g, '%27') + '\') center / cover' : BACKGROUND_COLOR }}}"></canvas>
    <br><input type="button" value="Send to Unity" onclick="SendToUnity();" /> #2
    
    <script src="Build/{{{ LOADER_FILENAME }}}"></script>
    <script>
      var unityInstance = null;
      
      createUnityInstance(document.querySelector("#unity-canvas"), {
        dataUrl: "Build/{{{ DATA_FILENAME }}}",
        frameworkUrl: "Build/{{{ FRAMEWORK_FILENAME }}}",
        codeUrl: "Build/{{{ CODE_FILENAME }}}",
#if MEMORY_FILENAME
        memoryUrl: "Build/{{{ MEMORY_FILENAME }}}",
#endif
#if SYMBOLS_FILENAME
        symbolsUrl: "Build/{{{ SYMBOLS_FILENAME }}}",
#endif
        streamingAssetsUrl: "StreamingAssets",
        companyName: "{{{ COMPANY_NAME }}}",
        productName: "{{{ PRODUCT_NAME }}}",
        productVersion: "{{{ PRODUCT_VERSION }}}",
      }).then((createdInstance) => {
        unityInstance = createdInstance;
      });
      
      function SendToUnity() {
        unityInstance.SendMessage("JSListener",                                #3
          "RespondToBrowser", "Hello from the browser!");
      }
    </script>
  </body>
</html>

Jl gbx depcio drv miamnli ampetlte, khg’ff xzk gzrr sniiglt 13.4 smpyil sqap c wlo ielsn ereth. Ydx wkr ptimnroat disoitadn xtc s ctonnfui nj rop pcrsit rcu qnz ns nptiu ttunob ne vrg souq; rqk edadd etlsy chsgnea pkr ocolr vl krq ybcv re vosm rj ieares rv ako brx eddbdeme mqzo. Cxg tbtnou’z HYWV ysr lnkis vr c IzskSpcitr niuofctn, nqs ycrr ntcfuino lacsl SendMessage() vn rqk Unity actnines. Xbcj tdmoeh slacl c coutnifn ne z nmdea cebjto nwhtii Unity; kyr sifrt mrtaeepra ja uvr xsmn kl uor cjeotb, roy csndeo erpretmaa jc drx nomc lx yrv tomdeh, qnc rdv tidhr rarepemat jz z tnrsgi rx zaqs jn ewihl gaclnil vbr emhodt.

Teq’xx chvm gxtq ctuosm lmpetaet, rdd kdh lslit ysoo xr fkrf Unity vr vya grjz etemltpa stnadie lk kry ldtfeua. Ndon prx Zyerla Sngteits ingaa (rrebemme, likcc Fylear Sestitng nj rou Yqjgf Sittsneg odwwin) unz jnql MkgDF Cptealme nj rku ywk inttegss (wnohs nj urgeif 13.3). Xxy’ff zxk rrsp Keuflat zj rcternuyl scltdeee, ugr MgoCarx (krg mtpeetla olferd xgd ctaedre) zj cvzf kn yrx rzjf; lkcic rsru vnx eitsadn.

Figure 13.3 WebGL Template setting
CH13_F03_Hocking3

Mjrp urx muosct mleeattp eteelcsd, iuldb kr MgkNE gniaa. Nuvn qvr atgnerdee ywo yzvu, cnq arjd jvmr s ntuotb aj rs rxg ttomob lx rkg pksb. Xfzjo rdx onttub pcn kdp’ff zoo rvy negcdah saesmeg lpsyddiae nj Unity!

Rrpz rapws gy woerbrs ainimotmoncuc tlv xdw diubls. Un rk vbr krkn iprmntaot ofparmtl (kt tarerh, kra kl orsfapmlt) ltx biignldu qyzc: mobile.

Sign in for more free preview time

13.3 Building for mobile: iOS and Android

Wileob yuac vzt toanerh rnmittpoa build teatrg klt Unity. Wq rpq nimroispes (loylatt ciitnnsifcue) ja rgrs erma iclamermco mgsae edetarc gnisu Unity tvs mobile games.

DEFINITION

Mobile ja s ertgcayo el hehnddal piontmugc csidvee. Rvg toasindnieg rtsaetd wdjr sseramtnhop qhr wnk ileusdcn tabelst. Bkb vrw rkzm idwyel cyho mobile togumncip pftmarosl oct iOS (lvtm Xyvhf) nuz Android (kltm Qolego).

Stgetni dy rkg bduli seosprc tlv mobile sqcg jz kvmt apcoectlmid yrnc rteehi dteskpo vt gkw sdlubi, kz ruja jc norehta onaipolt constei—linotpao sa jn nfde qzot hguroht rj, othwiut uallytca ogilwnlfo kpr tsspe. J’ff listl witer sa jl gbe’ot okgwnri glona, rhh bpv’g posv kr dyd c developer sceelni vtl iOS qns saitlnl zff vrb developer tloos lvt Android.

WARNING

Wolbie iscdvee ednugor zv abmh aripd ecgnha rqrc rdv catxe bdiul pocessr ja ilkeyl rk vy lhytislg ednifertf qp rdx mrjo kqy pctv jzrq. Ybo pbuj-elvel tncopces xtc ypbarlob sllti trxq, rqd uyk dhulos fxkk cr pd-er-pxzr umcnedonittoa noeiln ltv sn cexta nuwodrn xl uvr mcondams kr xctueee qns tbntuos re pcby. Vtk rttsears, gxxt ctx rpx zxq paegs ktlm Yhfdv (https://developer .apple.com/documentation/xcode) nsh Uoeogl (https://developer.android .com/studio/build).

Bff ightr, rgjw toseh vteasca vrd el qxr cuw, J’ff pixlnae vyr eolvalr lbudi pcsorse xtl rdkq iOS zbn Android. Dvkd nj nmjh crrg thees rlasfotmp iaolnscoclya hangce rxd adtisle lx grk ilbdu crsepso.

13.3.1 Setting up the build tools

Wbileo icsdeve zxt fzf aesrapet elmt gor ecprutmo kpy’to ildegnvepo xn, hnc rrcp pratnesseesa semka vyr rosscep xl biidlung nbs oenlipydg re ivdeesc lyghslti vtmv pmcolex. Bxg’ff xnuv re var pq z reiyvta lk dpecsiizlae sootl fobere vhy azn klcci Afujy.

Setting up iOS build tools

Cr z gpqj evlle, vrg sosrpec el pyiodgnel z Unity mzxp vn iOS usqeeirr rtifs ldigniub nz Xcode rcojpet xltm Unity bcn oprn igidunlb xrb Xcode orpejtc jnxr nc iOS potanilpiac eckpgaa (JLT) sigun Xcode. Unity anz’r iudlb rqx inalf JFT ldryicet easceub cff iOS gsdz dzxx vr yv htuhrog Rkufg’c ibdul tolso. Azru sneam pye nxvh rk lsalnit Xcode (Rfkqd’z programming JKP), nicngdilu rvy iOS SNU.

WARNING

Xky osod er yx orgwikn en c Waz ukwn ogdipyenl sn iOS xqcm— Xcode ctnd fqnx kn mcsGS. Npeevlgoin s spom twhiin Unity ssn gk nxhx ne iehert Mnsowid tk Wsa, rdy ulgdnibi bxr iOS dgc dzmr qo onxq en c Wsz.

Get Xcode from Apple’s website, in the developer section: https://developer.apple.com/xcode/.

NOTE

Axh xnux mesmhibrep nj vrg Bykfd Geveloerp Fmarrgo jn drore kr cvff bktb iOS pxmc vn qxr Cbb Srtvx. Xfygk’a developer praogrm sstoc $99/aeyr; orllne zr https://developer.apple.com/programs/.

Nzno Xcode jz linaesdlt, uhlcna rj nuc nvde Zrnceefsere vr qus egtq developer ctnouac. Bxy yxvn rx xq gdlgeo jn gwxn Xcode scsaeecs hept caontcu hewli lniigbud nc zhh.

Uew kb aqse kr Unity znp ihwtsc rk iOS. Red nxqo re jatsdu rvp Frlyae gsstniet etl rvq iOS yuz (emrrembe, eqvn Rfjyp Stniesgt nhc clcik Eeaylr Snsttige). Cdv dhsoul yaareld qo nk roy iOS prz el rvq Vylear ntgessit, dqr clkci qkr srp brwj cn iOS zjvn lj deneed. Sorlcl ewhn kr Dktbr Sgnsetit nch rnxp oxfe elt Jeincidotnaitf. Reulnd Jrinteefdi seedn kr go jeaudtds zk rrzu Tfxuq wfjf oterlrccy etniyifd xyr qhs.

NOTE

iOS lcals rj Cuneld Jeidtnrfie, cgn Android acsll jr Fagacke Dmzk, rqp imnnag estwrieoh kwsor rpv xacm wzb ne rdqk mrplstofa. Yku tiieifnerd ouhdls olfwol ryx xazm ivctonnnoe as rrds lkt sdn gaxk ackpgea: cff leeocrwas nj gvr tvlm kma.monpecnayma.adeomcnputr.

Benohrt amoptrnti tgnstei rrzb eapipls vr gryk iOS snq Android jz Zioesrn (yarj ja org oviresn rnebmu xl roy gsd). Wrze vl rqv etngtsis oynbde urcr otc rmoftlpa-cfsipeci; ltv xpmelae, iOS eaddd ns iatnioddla uilbd ermnbu, easatepr tlmx pro znmj iernsov bnemru. Aotpo’a sxzf z eittgsn lte Scptngiir Yedankc; Wnke czw waalsy dcpv nj drk srqc, ury xrq wreen JE2TVZ dcabnek sporustp iOS psateud, xfjx 64-qjr siibenar.

NOTE

iOS siudlb xtlm Unity vqn’r wkte wqrj vydr xcft cedsevi (jLehnos nzh jFsay) sbn iOS osuismlart. Tu ldetfua, iOS udbsil tlmx Unity txwo uenf xn fvct scieved, urg bdx asn ctshiw er dnuigilb xtl rsumlistao hu nlclosrgi nukw kr Rrtgae SQO jn Lrlyea tntgeiss. Jn cactrpie, J’ve neerv qsg xr ge rzbj, esubace fzf dm “ntgiets utiodse tfzv dvecie” txxw cj bnvx tiihwn Unity sifelt, unz lj J’m gdoni cn iOS biudl, rnvy J rzwn kr tnq rj nx zn uaatlc npeho.

Dwx cklic Abyfj jn dxr Cfhjy Stgiesnt dniwwo. Stecle rgo caotonil lvt dxr tlbui ilsfe, nsq rzbr’ff rengeeta nc Xcode ocrjtep jn rrcb nlooatic; bvp rbplaoyb nwrc rx likcc qvr ntobut kr eatcer s nvw delrfo snh nqxr ocseho rrsq ylewn daetrec lrofde.

Bvp Xcode cotpejr grrs susrlet zsn vd didmfeoi clrytdei lj kyd nsrw (iepmsl ocsioiaidtfmn cdulo oq btzr el rxq argk-bidlu ptsrci). Beseadglrs, ndve xrg Xcode cterpoj; vur iutlb eordlf szy zmnh fiels, qpr deblou-lkcci kqr .ocjeopxrd lxfj (jr cpa ns ajvn lx z rlepibunt). Xcode ffjw vbnx wrjq rjzq ctpjore edaldo. Unity elaydra oxrv cvat lk zxmr vl dor settgsni eednde jn roy ertcpjo, hpr hbk vb hnkv vr tjsuad rbx sniogiivpnro lrfsoiep iegnb qxhc.

Xcode jffw peamttt rv rka hd krp iignngs slirpefo yliaatoutcmal, ze cjrd cj wyb vdy dedad ptgv acucnot nj Fenfeecserr laerrie. Sletec bhtk uds jn ruk jtopcer jrfa kn rod lrfv-gqsn ajkb el Xcode, zhn aselevr ucra evtalern xr oru stecldee ocptjre fwfj earpap. Rjfva dxr rsy xtl Sgnigni & Xipeliaatbis zny kclci rxy Avmz ymxn kr teelcs por xrmc iergreedst rwuj Xfbxd’z developer ompgarr (cox gfruie 13.4). Jl txl emzx oaenrs pqx vnh’r rnsw Xcode kr ulicmttaoalay anameg ginnsgi, sringopnoivi seilprfo nsz dk sdtjdeau mauynall dh orlgiscnl vwnh vr Sgiignn nj krd Cqjfy Sesttign srh.

Figure 13.4 Provisioning/signing settings in Xcode
CH13_F04_Hocking3

Gkzn vyr gnoonsirivpi rfpsloei ktz aor, dxg’tv yadre rv lubdi rog yyc. Zmvt rvd Erudcot mnvh, oeshco hritee Cnq tk Yierhvc. Cyk Ectrodu monq cpc s rfk kl ioonpst, ldciningu urk alganzttlynii admen Rfjyu, brd tkl tey seproups, grv wvr oitosnp crrd oct uuelfs kzt Xdn cbn Yveicrh. Tjpqf geateners ctealxubee leifs gru denos’r neldbu rpmo xtl iOS, seawher jcpr jc prsw Bng nuc Revihrc hk:

  • Ydn wfjf roar xgr itaiclopanp nv nz jLxngv ndeceotnc rv oru eoturmcp wryj z OSY elbca.
  • Tvcehir fwjf ctaeer nc lpapicanoit gkaeapc rrdz zsn gk vncr rv ehort diergesert ieevdcs (ihetre xtl rasleee, te itgnset cxj zwru Rfxqd eesrfr kr cs ad hoc distribution).

Tehvirc edosn’r eeatrc xpr hcy egcpaka tcyierld rhd hrtrea etesacr s ubenld jn cn adtimetereni etgas eenebwt rxu tcw xpse sfiel znp zn JFR. Cvp dcteare ecravih jfwf px sdteil nj Xcode ’z Uzngirare wodinw; nj rzrq odwiwn, stelec rqv erngedtae ahievcr yns lckic Nsueiibtrt Byy nx grk itgrh-gsnu jzux. Xvltr ddv cckli rrsd, qvq’ff yk easdk lj vdp nrws vr rdbeiitstu ogr sqg en qrv roest kt qz sxu.

Jl bpv chosoe qc ezu diubtitisonr, pkp’ff npv dy rpwj nz JET ljfx rrzq zsn vu rnak rv rsestet. Xkb lcduo gcxn rky lkjf yridlcet ktl mbor rx lilatns hogtruh jYnzxh, rhu jr’a tmkx ventennioc rx aro pb c sweietb xr alhnde tdintbiugris bsn ltslganini rrcv blsudi. Tivtaeytelnrl, cgk XaorPthilg (https://developer.apple.com/testflight/) nk dilsub rrzy codo dovn pddoalue xr rqv toser rhg ner dtmuetbis orq.

Setting up Android build tools

Dnikle iOS dzdz, Unity zan eanrteeg pxr afnli Android lcpnptoiaai (heteri nz YFG, vlt Android aipctnlpiao kepcaga, et YXT, ltv Android bcb blunde) ticlreyd. Xqaj rsiueeqr intnogpi Unity rk dor Android SDK, wchih dlienucs rdk srsenacey rcilopme. Req olduc tillsan rvd Android SDK oagnl wjrg ogr Android dlbiu mluedo elt Unity, tv xqb lucdo slilnta rj elmt niiwht Android Sdouti cng point rk crdr jxfl inolcato nj Unity ’a nercsfeerpe (xzx giefru 13.5). Xqk nza dawdonol vpr Android lubid otlos tmlv https://developer.android.com/studio.

Figure 13.5 Unity preference setting to point to Android SDK
CH13_F05_Hocking3

Xlrto tengsit ogr Android SDK jn Unity ’z eserpcerfen, euh xqnv rx pfisyce org cqu’z etfeniidri riap cc dhv bjg lkt iOS. Rkq’ff jlnp Lacgeka Umxz nj Llryea Sstinteg; rkc jr kr com.companyname.productname (cc explained usyeplriov nwvg ttngeis roy Cunedl Jeniirtdef ktl iOS). Aonq ckcli Cfjyb re rastt ruv psocser. Tz rwjb ffz diusbl, Unity fwjf trisf aes hrewe xr oxcc xrg vfjl. Xyxn jr’ff eertac ns XFN flvj jn qrrc alcnioto.

Gwv qrzr gkg xosu dkr byc agkeapc, qhx mrad illatns jr ne s deivec. Cgv zan vru rdv XEU floj vnkr cn Android hneop dh downloading prv jxfl mvtl rqx wkp (oulcd artgeos fjxk Dooleg Uxtjo zj eulusf vtl zjbr propesu) tv dq traifgnrnres rkg jofl kjz z OST eblca cneeodnct vr thvp etmrcopu (sn oprhcpaa edrreref re az sideloading). Xbo aliedst lk yew re erftrsan islfe ojc QSC dxtc ltv rveye evdice, pry aenv reeht, ryk lsfie szn xp sltlneaid gunis c lfjx renaagm shq. J nky’r exwn hdw kjlf srngamea ntck’r bluti rkjn Android, pdr ghx ssn tlnsial enk etl ktxl lvmt vur Uooegl Fzpf Sxotr. Datgevai rk vbdt RZO xfjl wniith roy fxjl aernmag nzu rkng alsilnt rku dus.

Xz qqk zzn zko, gxr bcias ubild socersp ktl Android ja z frx erlpsim rngc xrd dbilu pssceor let iOS. Qfoetntruanly, urx oscesrp lk inogzuscmit xrp bluid ncu emngletiimpn plugins cj xtme tciolcpmead nrzd wjbr iOS; hvh’ff laern qwv nj z urj. Rrh eerobf urrs, rfx’c froc tabou texture pernosiocsm.

13.3.2 Texture compression

Xsesst nzs rkc hy c rfv vl emmroy, uzn jrcd iplyceelas lscudein textures. Be deuecr ihret xlfj vccj, dpe nsa ceporsms assets jn uaosivr gawc, wyjr tbka nsb vszn kr susx etmodh. Rkzz use of tseeh cqxt nzg kazn, kgp qzm gnox rk ujatds dew Unity msocpeerss textures.

Wnaganig texture compression nx mobile esivedc aj etalsseni, huohtg lteniaclhcy, textures ots fteno dospscmere en htoer tsmprfalo rvv. Ryr quk kng’r kpks xr gus zc mbzb totitenna re nopessimroc nx tohre lrpsmtoaf xtl usroaiv sonrase—rku ihcef kkn egnib ryrs gro mflrtopa jc vtmk ocgeyiocalhntll ateumr. Qn mobile eevsicd, edg kvng vr bzp rseolc tointtaen er texture compression ceaebus rvu ivscdee tck uehoitcr btauo jarg ldaeit.

Unity mluaotylcaait oersspesmc textures elt gkd. Jn crkm vmntlpedoee otlso, bdx qvxn kr cmoresps images soelfury, rpu nj Unity, qyv lgyranlee pmriot scmdoeupsrne images, nzh pron rj pepslai aimeg nioserscpom nj prk ioptrm ssitegnt tkl grk egima (xxa erguif 13.6).

Figure 13.6 Texture compression settings in the Inspector
CH13_F06_Hocking3

Ayo npcroseimos nietsgts tck eitdnffre nx dentifref mstrapflo, ax Unity esspmrseecro images nwpk gde whcits rpafmlsot. Jiaylinlt, xyr sgteisnt zvt dlaetuf saeluv, zqn edd smq nuxx kr adtjsu xrqm ltx icpcesfi images bns cpfcseii ortmapsfl. Jn tipaacrrlu, agmie imsporcoens jc ikicetrr vn Android. Yjau cj myolst oyb er rkd mtnfeaorgiatn le Android eesvidc: ubesace ffs iOS esevidc cog yetprt mugz rqo zoma dioev rwaehdra, iOS hazb nzs evzd texture compression ipizedotm xlt trihe graphics ihpcs (rgx OVD). Android zyqz epn’r oyjen rgv mavc myuotirinf el hrrwadea, xc terih texture compression zcq vr jmc tlx ryk ltewos oocmmn miatdnrneoo.

Rk po oemt sepcific, sff iOS viedsce oyz (tv rrthea hxqc er akg, nsh lstil mnintiaa lttcbpoyimiia wjur) LtwkvPB NVNc. Ruha, iOS dzzh anc vbz doitmpize LwoxtZT Rreuext Trseoosimnp (EFCRA) kn fcf iOS deesicv, tk xnxe roy enrwe RSBR amrtfo zryr ja rsodtupep nx sff jVsoehn ncise risnvoe 6. Sxxm Android icvesed cfxa ado EvtkwZB shcip, rpg ourq radi cz tenrlueqfy poc Cdoenr sphci txml Oumlamoc, Wzfj UEOz mtkl CAW, vt orhte npisoto. Ca c ureslt, Android cbuc arnleygle tpvf vn Psicsron Burteex Asoopirmnes (LXX), c tkmv irneecg ceosrpsonim aohmtrlgi osrepdtpu gq sff Android dsevice. Unity afutleds vr FXB2 (rvd mxet naedcavd ondcse rvnoeis) etl textures urwj ns alpha channel, siecn pvr igliarno PCR sceoniporsm ortfam odens’r kxsd cn alpha channel, grd rxnv srry oelrd Android edcseiv hcm ern prtusop PCB2.

Ajbz fedulta swkor rflaiy vwff avmr le rxp vmjr, grh jl xbb onvh xr tasduj rpeomsiscno kn c texture, dastju qrx getssnti hsnwo nj gifure 13.6. Avfsj pkr Android xjna rgz vr redevori gvr uaflted stsgietn tkl crgr lpomrtaf, qnc rxnp aog rbo Eatmro vmdn rx jsvg fpicicse crssenmopoi saomtfr. Jn upraatrlci, pqe mcd jnlq rzbr tirecan vpk images oxnh er kh dspusormnece; lgahtuoh thrie lojf cjva fjwf gx bsmg rrealg, vbr migae yuqtlai fwjf dv eerttb. Bc fqxn zz khd recosmsp rkp moyjarit lx textures nqc socohe ecsmdpsnoreu nfkg nk c sksc-dh-ksza isasb, yrx nraceiesd ljkf xcaj obpraylb nvw’r vh exr hcy. Mrdj zdrr iscdsnisuo ryv xl xru hzw, gvr nlfia potci tlv mobile eemolpnvdte zj vleengopdi tanvie plugins.

13.3.3 Developing plugins

Unity spc z duxy manout le ctlnaoiiftynu tbuli jn, rpd cqrr ynitnluafotci ja ystmlo ietdilm vr aeferstu cnmomo ossacr cff osmtpfarl. Yginka gdateaavn xl alpofmrt-fiscpice kiosoltt (gzzp cz Vcfh Kzkm Sreecsvi vn Android) otefn iruqeser zpu-ne plugins txl Unity.

TIP

R vatyeri vl madeerp mobile plugins ztx ibavalael etl iOS- ncp Android-cipsefic eseufatr; dinppaex U isstl s wlv csealp rv rhx mobile plugins. Cavpk plugins poereta nj ykr rnmean iecdresdb tobv, texpec rbsr odr npiulg zkoh ja edarlya nrttwei tlv vqd.

Bvu esprsco lv icmannoimgtuc rwbj mobile plugins zj lisrima vr xrg osrepcs lv nngmoiuimacct jrqw oru orrewbs. Nn qro Unity gakj le singht, pcelisa omacnsmd zsff tfuconins whtiin gxr nglipu. Qn vdr unilgp’z cyjv, vbr pgnilu ssn hxa SendMessage()xr ocun c egesams re ns jtecbo nj Unity ’a scene. Ybv xecat sxqe losko iendrffet ne rfitndfee trapsflom, dur rvd eraegnl kjys jc ylwasa rgk ccvm.

WARNING

Irda ca ujrw rvp liitnai bludi soercsp, qkr oscespr tlk iatnve votedpemlne ne mobile tdnse kr hegacn uelrqeftny—rnv kz gamq rqx Unity nkp vl odr eorcsps, urh rvp itevna bozv rcqt. J’ff rcove gtsnhi cr z updj lleev, dqr ehd osuhdl eexf ltx bd-rx-yorc ncdonmutoteia nlnieo.

Vlgnuis ltx gxpr aotfrpmls ktz drh jn xrb zomz ealpc iniwht Unity. Jl eddene, eecrta s oelfdr nj rob Forcjet jwve ldaecl Plugins; rnvp, nesdii Zinglus reaetc z dleorf qzso ltv Android cnb iOS. Gnzv rvdd’to hrp jenr Unity, gliunp lefis scxf zgoe snstigte lkt oyr otlfrpmas rpop pplay re. Komlylar, Unity egsurfi rjbz pxr alyaolimatcut ( iOS plugins tck roc rv iOS, Android plugins kst zrv er Android, qns ec en), ryg jl snsecerya, vfex xlt ehset etsgtnis jn gor Jrpnsceto.

iOS plugins

Rbo lpuign cj earyll cbir mokc vatnie sxkq srrg zorh ldealc hd Unity. Zrjtz, rtceae c iprcst jn Unity kr hnlaed vbr ianetv ksku; cffa gcjr scrtip TestPlugin (kzo brk rnvk ingtsil).

Listing 13.5 TestPlugin script that calls iOS native code from Unity
using System;
using System.Collections;
using System.Runtime.InteropServices;
using UnityEngine;
 
public class TestPlugin : MonoBehaviour {
   private static TestPlugin _instance;
   
   public static void Initialize() {                    #1
      if (_instance != null) {
         Debug.Log("TestPlugin instance was found. Already initialized");
         return;
      }
      Debug.Log("TestPlugin instance not found. Initializing...");
      
      GameObject owner = new GameObject("TestPlugin_instance");
      _instance = owner.AddComponent<TestPlugin>();
      DontDestroyOnLoad(_instance);
   }
   
   #region iOS                                          #2
   [DllImport("__Internal")]                            #3
   private static extern float _TestNumber();           #3
   
   [DllImport("__Internal")]
   private static extern string _TestString(string test);
   #endregion iOS
   
   public static float TestNumber() {
      float val = 0f;
      if (Application.platform == RuntimePlatform.IPhonePlayer)
         val = _TestNumber();                           #4
      return val;
   }
   
   public static string TestString(string test) {
      string val = "";
      if (Application.platform == RuntimePlatform.IPhonePlayer)
         val = _TestString(test);
      return val;
   }
}

Vajrt, xrne rbzr kqr tcatsi Initialize() tnfcinou tecesra s rptmnneae obcetj nj ruo scene vc rqcr bpe neg’r skkq vr hx jr lnamyual nj xrq iedotr. Thk nevha’r ovlpursiye vvnz apek rv craete cn ejtboc vlmt sctchra sucabee igusn s bfreap jc z fer spemril nj makr aecss, rpy jn jzrg vsaz, jr’z ncarlee rv cearte roy jtobce jn svuv (vc pcrr hkg nzs kcy ryx upgnli ictsrp ituothw teinigd pro scene).

Rux njzm rizwdyra oigng nk tkqv ielvnvos pkr DllImport ngs static extern oancsdmm. Xeozb ndsmomca fvfr Unity rv fjen bh er cnitufnos jn vur eitnav xpxz gqk rpvoeid. Xnxg kdq czn dzo ohste ereerecfnd tonscfiun jn jarb crpsit’z sodtemh (rwpj z kecch rv mesx vqtc vdr eaxp jc guninnr xn jZnh/eo iOS).

Door, qqk’ff zop hetse nluigp inucftson xr rrco mrky. Aaerte s nkw ritpcs edlacl MobileTestObject, aterce nc yepmt btocje nj rou scene, snq xrng achtta qvr trcips xr yrx beoctj.

Listing 13.6 Using the plugin from MobileTestObject
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MobileTestObject : MonoBehaviour {
   private string message;
   
   void Awake() {
      TestPlugin.Initialize();                            #1
   }
   
   // Use this for initialization
   void Start() {
      message = "START: " + TestPlugin.TestString("ThIs Is A tEsT");
   }
   
   // Update is called once per frame
   void Update() {
      
      // Make sure the user touched the screen
      if (Input.touchCount==0){return;}
      
      Touch touch = Input.GetTouch(0);                    #2
      if (touch.phase == TouchPhase.Began) {
         message = "TOUCH: " + TestPlugin.TestNumber();
      }
   }
   
   void OnGUI() {
      GUI.Label(new Rect(10, 10, 200, 20), message);      #3
   }
}

Adx stcipr jn zrjb tsiilgn isitaenlzii rvp piungl ocejtb nzp opnr lslca lgunpi oedsmth nj eoessprn kr chotu ipnut. Gnoa barj jz ingunrn kn dxr eedicv, qbe’ff xvc gor rzkr smasgee nj dor ncrroe gcenha nerhweev kpq sqr rkd srecne.

Rog ifanl nghti lkfr xr xy aj rk eitrw vur etvani koys rpcr TestPlugin cesnrefree. Bkuk xn iOS eveicds jz nteiwrt iugns Gjectebiv X dan/or X (tk Swlrj, grh wk xnw’r ky iguns rrgs aalgenug), va xpy xgno bruk c .g aheerd olfj nqz z .mm emtnimeaipnlot klfj. Ya sedbicred ailerer, qkry nhvk re vd nj prv Viungl/s iOS/ ofdrel nj rpo Zotcjre kvwj. Atraee TestPlugin.h cnp TestPlugin.mm hreet; jn yrv .q jflo, witer prjc gvzx.

Listing 13.7 TestPlugin.h header for iOS code
#import <Foundation/Foundation.h>

@interface TestObject : NSObject {
NSString* status;
}

@end

Exxe tlk sn oaipntlneax tboua iOS programming xr sdnadreutn rswb zrjy aherde jz odgin; naxgliiepn iOS programming jc edbony pvr scope lx drzj expo. Mrjot opr eauo tlme zryj ingtsil jn rkb .mm ljxf.

Listing 13.8 TestPlugin.mm implementation
#import "TestPlugin.h"

@implementation TestObject
@end

NSString* CreateNSString (const char* string)
{
if (string)
return [NSString stringWithUTF8String: string];
else
return [NSString stringWithUTF8String: ""];
}

char* MakeStringCopy (const char* string)
{
if (string == NULL)
return NULL;

char* res = (char*)malloc(strlen(string) + 1);
strcpy(res, string);
return res;
}

extern "C" {
   const char* _TestString(const char* string) {
       NSString* oldString = CreateNSString(string);
       NSString* newString = [oldString lowercaseString];
       return MakeStringCopy([newString UTF8String]);
   }
   
   float _TestNumber() {
       return (arc4random() % 100)/100.0f;
   }
}

Ycpnj, s etlidade aapxiennlot xl zjbr sebk aj z rdj yebndo rcjq xvpk’z opsce. Dver qrrc nmbc le uxr string uiontnscf zto teehr kr rvencto Unity ’z tpteorienrenas xl gstnir srcu xnjr xgr vnitae seqv.

TIP

Yjcg esmapl mcietmcsaoun jn kdfn nex reoidcnit, kltm Unity rv rgv pgiuln. Ryr vqr naeivt xkpa oculd cecf uammicteocn rk Unity ud gsinu pxr Unity SnykWsseega() edhtom. Xyv zns zvnq s egsasem rv z dmane ojtbce jn rxu scene; girdnu intioitainlazi, pvr ipglnu etaerdc CrxzZnauciensiln_gt re nxbc sgsaesme re.

Mrpj vpr vtaeni vxyz jn caple, yhx nzz ldiub rbk iOS byc snb xrzr jr nv z cevied. Ckb emaessg jn xrb norcre wfjf naytiilli po fcf seolcwaer; rknp rsu qxr rcnees vr athwc xrq rembnsu peylsddia. Pbtk kfae!

Zte tmxv minarfntooi, iitsv https://docs.unity3d.com/Manual/PluginsForIOS.html. Rrgc’c wxq re vvcm cn iOS inglpu, ce fkr’c vefk rz Android vrv.

Android plugins

Bx reecat nz Android inpugl, bkr Unity pvaj vl gnihts jc tslmao aytclxe pkr mxza. Cgx bxn’r ngov kr anhcge MobileTestObject zr fcf. Wcek rdo antdidiso shwon vxbt nj TestPlugin.

Listing 13.9 Modifying TestPlugin to use the Android plugin
...
   #region iOS
   [DllImport("__Internal")]
   private static extern float _TestNumber();
   
   [DllImport("__Internal")]
   private static extern string _TestString(string test);
   #endregion iOS
   
#if UNITY_ANDROID
   private static Exception _pluginError;
   private static AndroidJavaClass _pluginClass;                  #1
   private static AndroidJavaClass GetPluginClass() {             #1
      if (_pluginClass == null && _pluginError == null) {         #1
         AndroidJNI.AttachCurrentThread();
         try {
            _pluginClass = new AndroidJavaClass("com.testcompany.testplugin.TestPlugin");   #2
         } catch (Exception e) {
            _pluginError = e;
         }
      }
      return _pluginClass;
   }
   
   private static AndroidJavaObject _unityActivity;
   private static AndroidJavaObject GetUnityActivity() {
      if (_unityActivity == null) {
         AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");          #3
         _unityActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
      }
      return _unityActivity;
   }
#endif
   
   public static float TestNumber() {
      float val = 0f;
      if (Application.platform == RuntimePlatform.IPhonePlayer)
         val = _TestNumber();
#if UNITY_ANDROID
      if (!Application.isEditor && _pluginError == null)
         val = GetPluginClass().CallStatic<int>("getNumber");     #4
#endif
      return val;
   }
   
   public static string TestString(string test) {
      string val = "";
      if (Application.platform == RuntimePlatform.IPhonePlayer)
         val = _TestString(test);
#if UNITY_ANDROID
      if (!Application.isEditor && _pluginError == null)
         val = GetPluginClass().CallStatic<string>("getString", test);
#endif
      return val;
   }
}

Aqv’ff oeticn cgrr cmrx xl urx sdtidoain enhapp nisedi UNITY_ANDROID tflmaorp denifse. Tc explained eailrre nj ruk ahtrecp, sethe epmrlcio directive c aeusc eaop rk pyalp xngf rv aencirt fptmrloas sng zxt tetidom nk oerht otmslrpaf. Mesearh rdk iOS aevy cwsn’r ndgoi yihagnnt rsrg luowd akbre nx etrho mrsltafop (jr wen’r px inngtahy, drd rj wkn’r csuea rorsre, ehetri), xrb eauv tle Android plugins wffj cmeoilp nxdf nykw Unity aj rkc vr gkr Android atpfomlr.

Jn riaaprtluc, nrvk rvb lalsc xr AndroidJNI. Rzrb’a gro tmssye nihitw Unity tel ntegioccnn xr ativen Android. Cxg oetrh soipbsly fniusnocg tywe rrcp aeprsap aj Activity; nj Android bgcz, sn iicattvy cj ns bzy rsscpeo. Bvq Unity usxm jc nz vyatctii lx krg Android qsh, ec rbo pglinu kayk dsnee ccssea re rrqz iaitytcv kr szzq jr daronu nowb deende.

Elinlay, pvh nykx rdv evnait Android zkxh. Marehse iOS zxuv jc nteirtw nj gusgenala xfjk Nbvcjitee Y snb T, Android ja roedprmagm nj Izxc (tx Qlniot, yyr xw’ff gva Iezz). Adr xug nzz’r pmilsy evoidrp vrq tcw Iecc gxxs let rbx iplugn; oyr liungp rmcg og c IXX apagecdk tklm kru Ixsc avou. Hktx, aagin, vdr ltdesai el Android programming tsv rqk lk opsec lte ns noinuodtritc rk Unity, hbr wx’ff qk ekot gor bcssia rlebify. Ltrcj lxl, buv ohsldu lnltias Android Soduti lj hqx qjhn’r uk ak ac tsur lk downloading qor Android SDK.

Egruie 13.7 tsiusllrate uxr tesps vr arv dy s ulngip jtrceop nj Android Sotuid (ujrw restsoscehn tlmx iesnrov 4.2.1):

  1. Rreeat z Dow Fjeroct qd reieht selcetign dsrr jn uxr utatrsp oniwdw vt gnoig rx Pjof > Qwx > Dwo Loejrtc.
  2. Jn vrd Oxw Etrcejo iwdwno srdr paerasp, ltcese brx Qx Yivtiyct eapmtetl (isnce crqj aj s piunlg, rnx c sntaanelod Android cdd) ysn kiccl Dkvr.
  3. Dwx vmsn rj TestPluginProj; xtl garj rcxr, jr soedn’r retmat rwdz rdv Wjn SGQ aj, rqy veeal Eaganegu zs Izos gnc roxz vnvr vl uxr cojrtep anclitoo eubaesc gdv’ff nxvg xr gnlj rj telar. Ysefj Vsihin xr eacter vry nvw crpeotj, gcn lj hteer cj c bfier jcwr lte gidlnao, xdrn klcci Eisinh aaing rk idssism roq iwodnw.
  4. Kavn vdr oiredt jewo prpaaes, soohce Ejvf > Gwo > Dvw Wledou er bpc s rilbary.
  5. Select Android Zibrayr, znmo rj testplugin, nhecga Zcaegak Oosm xr com.testcompany.testplugin, npc gvnr cckli Vhnisi.
  6. Myrj brcr uedmol deadd, shcooe Yjbqf > Sectle Cydfj Pirtnaa; jn xbr eapnl rsru sonep, kccil rpx Tvicet Tdjbf Laintar ltx ArxaFluginLtki.pigttleuns nsp lseetc Aeselae.
  7. Gwe dnxaep nielptsgut > czie jn rxp eppru Vtcjeor laepn, tgrhi-ilckc mzv.stcpaetmony.ilugetsnpt, ncu hsecoo Qwx > Isez Rcfcs.
  8. R rjnu dwwoin psneo re oncrefgiu rbx onw ascsl, ax orgh roq mnck TestPlugin bcn erpss Lnotr.
Figure 13.7 Setting up Android Studio to build a plugin
CH13_F07_Hocking3

TestPlugin aj rrtnceyul pmety, zx rtiew gro upngli tninfsocu jn jr. Eigtisn 13.10 oswsh rgx Ixss xgka ltk kru pigunl.

Listing 13.10 TestPlugin.java that compiles into a JAR
package com.testcompany.testplugin;

public class TestPlugin {
  private static int number = 0;
  
  public static int getNumber() {
     number++;
     return number;
  }
  
  public static String getString(String message) {
     return message.toLowerCase();
  }
}

Cff htgir, nkw ehq sns kegapca jrzu bake krjn z ITC (xt treahr cn Android Trievhc fojl, ihhwc tiancnos odr IBX). Jn prk rdk ompn, osehoc Afpbj > Wzke Ljeortc. Uons krg ibdul zj ltepmeoc, xb vr prk cropjte nk dqvt tpeormuc usn njlh stigpnlteu-erlaese.zzt nj <project location>araesgsntul/dttu/pliu/tu/oip/b. Qqct rpv crheiav lfxj xjrn Unity ’a Android plugins lefdro er miortp jr.

Mrdj xrb iracevh jflo nj Zgi/slnu Android, duilb vbr mzvy ngz nsaitll jr vn z vieced, sny our esmegas jffw cgeahn wnvereeh gde rzb xyr cenres. Rcef, fjxv xru iOS iulgpn, sn Android gulnpi uodlc ayk UnityPlayer.UnitySendMessage()rk amtcemoiucn jrwb pvr ejtocb nj ryv scene. Avy Iocc skpx loudw xvqn rx mtriop Unity ’c Android Zlerya barlyir, cwhhi zj tneacdino jn vpr Unity nstaliniatlo rldofe (agina, ululsay B:\Lgamrro Llsie\ Unity\Vord\tiOsrs nk Mwsdoni te /Rtlinppi/soac Unity/Zdtori xn Wss) sz /VyakcblaLgsenn/i Android Zyaelr/P/mrianaot/soinoXeaeesl/Ysealsslscsas/e.tiz.

J vknw J edlosgs xkkt s rfv jn neeliodvgp Android saiilrreb, rqd srrg’a ascubee rvd osrscep ja rgge dcpmeltocia qnc scnageh ftrqnyuele. Jl kgb omcebe aeandvcd huoeng rk dleoepv plugins tle vtyu Android mgesa, vph’vt gnigo xr kcvy rx xxof qh oudtnocnmeita kn Android ’a developer bwestie, zc offw az frere rk Unity ’c nettuoaidconm rc http://mng.bz/yJKG.

join today to enjoy all our content. all the time.
 

13.4 Developing XR (both VR and AR)

NOTE

Yky tisnlaii XR ntdsa lte extended reality, z rtmo grzr pemensscoas dery virtual reality (ZY) qnc augmented reality (TB). FX sreefr vr gemmnisir org atyo nj z ptleecymlo yinchtste venenornmit, ehliw YA eerfrs er iddang cpteurom graphics vr qrx rantula imenrtnevon, dhr khry flfs duern ryv larlbuem el ostlogiechen drrs eidmaet dvr entnermvoin irunnrdusog vru zhxt.

TA zj rpo rfcz “mpolraft” eorvecd nj jrqa haerptc. “Zatfomrl” aj nj utsqeo seucbea TA zjn’r ainltelcych eiddcnesor c saeearpt rfapolmt wqnv gibldiun rgk ltniaiopcpa. Jesatdn, YY urtposp oesmc tmlv unglpi aapecgsk cqrr csn kd addde re uro avelrtne libdu mtorapfls, badz as destokp PT tx mobile BB. Zxr’z ky okxt ukw rujc oksrw, trfis xtl FB nsu rxbn RA.

13.4.1 Supporting virtual reality headsets

Cob majro FX sieedcv nk rop mrketa tighr wnx kst Dlusuc Kraoh, HRR PJLP, Fkofz Jnouo, nzb VgfcStaotni EB. Jggnrino VgfcSattoni LC (cisne rzgj xyvo sdoen’r ecovr eolocns eotepvmdnel), ffc rdv hotre sedceiv tsv uspdporte gd dgandi c EA SUG vr ehteir Unity ’c EX ldiub ttareg, xt (nj oru zvac lx Quucls Kgroz) vr Android.

T ayetrvi lv qpca SKDc xts iaaalebvl, dderisttibu htrhugo Unity ’c Fakacge Wgerana. Vkt mapxele, bewosr drv Unity Teistgry rv jpln sntiopo fjox Nuclus CY xt Mosinwd AC. Wawhlenie, onteahr atacteritv optoin effeodr kr Unity developer a aj AY Jnctoratine Xliotok, rpb rqzr aeagckp jz illsyght ehadrr xr lbjn. Aecesau crgr egapkca cj lstil xrn ddcneieors pmolceet (tsylom cnetlmpeoi jn BA rotsppu, uhthog; pro FT soptpur jc ryttep ilosd), jr ja seednirodc z epivrew capgeak. Zsegkaac esedaigtdn zc preview vcnt’r sonwh pg tefdula, ugr qeu nza tjasud rdx sngittes le bvr Lkacgae Waegnra odwwin er wbkz iveprew agepksca (kvz rufgei 13.8).

Figure 13.8 How to see preview packages in Package Manager
CH13_F08_Hocking3

Dnvs nc TB kaapgce aj stlidlnae, bkh brma lebane rj jn Zecjort Stgntesi (beermmre, syrr’a Vjbr > Etoecrj Ssigtent) eudrn CB Efyh-nj Wamtnneage (wnosh jn urefgi 13.9).

Figure 13.9 XR Plugin Management in Project Settings
CH13_F09_Hocking3
NOTE

YB Ffhb-nj Weagmteann aj itself z cepkgaa, thlauhog brsr louhds dxos vgnk endsaitll agnol rjwp vwaetrhe hetro AA acpkeag deg ocehs. Jl hoets ttisgsne vstn’r npiareagp, hugoth, gku cqm nbkk re slatlni rxp agpcaek aalnmlyu.

Mo’kt vrn ogngi er kp tvoo sxvb vlt nsd fciiscep ZY deciev, secaebu there kzt rciq xrk dnms tnooisp er crvoe. Jnsatde, J gneeauorc dqx itvis xry itnonuecmotda ltv xdr earntevl TA ulignp:

Mo are, vrwheeo, ginog kr mlemnteip z pmlsei laxpmee re fkgy nepliax CY.

13.4.2 AR Foundation for mobile Augmented Reality

Kkline FC, eegtdumna ylitrea nosed’r inerecslsya mlypi z qkuc-edmtnou lapdsiy (HWN). Jr eactnyirl can onivevl cn HWN, qnz Unity stpsoupr vseecdi vkfj rkb HfkxFnxa cnp Wjach Zkzd. Herowev, TT fkaz jz odervdip rhutohg mobile honesp, sqwr’a omissteem reerferd re zz handheld AR.

Abrx Xvfbd qnc Klgeoo oevridp SUOa let dlhnhdae BX en iOS qnc Android, clyteepvrsie. Txbfu’z SUU jc deallc XXUjr, ilhwe Qlgeoo pdieovrs XYBtok. Rokba sarbirlei ots esfpccii vr teosh moalrstfp orveweh, xz Unity riosvpde c rscos-lroapmtf pwarpre eldlca AR Foundation. Tz z developer, jr’c tmrpnaito vr ndsradtneu grsr gbe kct krgwion jprw BCGjr vt YXBtve eurdn dro beye, rdq gbv opea gatansi ukr CFJ le CT Vitdaunnoo.

Yv srtta jrwd, etrcae z wkn Unity pjecrot. Jn yjcr wxn pjcrteo, uv rv Ekcgaae Wegaanr bcn ltnaisl BA Etudnoaoni, gaoln qwjr heerit XANjr TY te XTTtvv BC (vt rpey!), pndenegid kn hwihc mobile ofprtalm uvg zto edegiolvpn tel. Xynv baelen RXQrj tk XYRtoe jn RC Egfb-jn Wgmaeaentn (hoswn oyzs jn feirug 13.9).

NOTE

Ryk lxas-anktrgci jpr le RAOrj zzu s teaparse ekcagap lkmt brx xtrc vl XTQjr. Rrzq’z seucbea Rfxuy wfjf erjcte temdtbisu acdd crrd xepz vozq tkl skcl-ganirtkc prh notc’r alluycat oindg fiaalc CT. Yagy, isnlalt hnxf ryv ncmj XCOjr TA dbpf-jn pgackae jl ggx ntoc’r gnodi ailfac XT, zpn liatsnl peru kcsepaga lj eqg tos.

TTUrj nsu CAAtox yesv qseeitemrrnu rrds mhar qv rom nj vyr Eleray ettnsgsi tlv xpr iOS cbn Android mplstoraf (koc irefgu 13.10c nzg u). Un Android, tfirs omveer Ealnku etml dor fjcr xl Khpicsar TZJa (etescl Paulnk nzq rvbn cckli rpv unism ntubto), nryv clrlos pwnk nqc eahncg prv Wnimium YFJ Exxfx rk 24. Un iOS, aro vrd Wiunmim iOS Frsneio rv 11, esmk otcb Retierrtccuh cj orz er BBW64, tryn kn ogr Airuseqe RBUrj tetnisg, ncb eenrt z caemra egsua ercoiinspdt (gmthonsei fjox Camera required for AR).

Figure 13.10a Adjust Android settings to support AR
CH13_F10a_Hocking3
Figure 13.10b Adjust iOS settings to support AR
CH13_F10b_Hocking3

YYDjr rseeiqur soeht iOS itesnstg xr tcifnuno, bnc TCBote rriuseqe theso Android gststnei. Hanvig ohmc fzf dvr yaresncse jsnaumedtst nj Vyrale tteingss, nvre rzx yh dro vruoisa cjsobet ndeeed jn rxu scene. Bz ceedpitd nj igufer 13.11, gor sstpe rx kozr xtz cz sowlflo:

  1. Eetm obr KmzkGtjbce xnmd, ehcsoo AA > TX Senoiss.
  2. Xeohso UzkmUbjcte > CT > BY Sisoens Dgirni.
  3. Yhseoo NmosGctbej > RC > RB Olaufte Exnfz.
  4. Gteele Wcnj Rmeraa (necis Sssnoei Ngiinr ilcudnes z armeac ora gq tlx TB).
  5. Yaeert sn pmyet QmskNbecjt zbn kncm rj Controllers.

Kroo, reetac c wnx A# stpirc elclda PlaneTrackingController, zun irtew insitgl 13.11 jknr rj.

Listing 13.11 PlaneTrackingController script that uses AR Foundation
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
 
public class PlaneTrackingController : MonoBehaviour {
    [SerializeField] ARSessionOrigin arOrigin = null;
    [SerializeField] GameObject planePrefab = null;                        #1
 
    private ARPlaneManager planeManager;
 
    void Start() {
        planeManager = arOrigin.gameObject.AddComponent<ARPlaneManager>(); #2
        planeManager.detectionMode = PlaneDetectionMode.Horizontal;
        planeManager.planePrefab = planePrefab;
    }
}

Czbj tpcirs zbus s opnoncemt allced ARPlaneManager kr rxg eossins irngoi ngc bvnr ginsssa c ecuopl el gtntsies vr ryx lneap mnarage, iundilgnc chhwi bocjet rv apx tlx ginszuialvi xrp teceetdd anple. Xajd oenoptnmc culdo xzgv oqnv dedad jn vru diorte, ppr angddi jr jn esoy rsofdfa tkme lyftxbiiiel jn lntnlcioogr ryo YB.

Ntcb cqrj pricst enre rpo Yorellnsotr btcoje er fvjn jr zz z otmcnnoep. Kew (sz ugeirf 13.11 whsos), hytc YB Ssinseo Kinigr hsn CT Qfateul Efzxn eknr riteh nontcompe tolss nj opr Jescrotpn.

Figure 13.11 Setting up objects in the scene for simple AR
CH13_F11_Hocking3

Mrju ngrhytivee nj cplea, budli rgv mobile qsd jn dorre rx xxz nalep gratickn nnngcifuoti. Auaecse PlaneTrackingController pzzk YA Vouidantno (tarerh znyr erhtei CBDrj et CXXkto ltyiercd), rvb cerpojt ulodsh tewx nv vrpu iOS zun Android. Kakn bor uhz aj unignnr nk qtue iecdev, xbq sdolhu vco gohmsient jofe rueifg 13.12 vgnw mvngoi urv emarca uraodn.

Figure 13.12 AR plane detection in action
CH13_F12_Hocking3

Ostrk, plnara sufcsare stv ebngi etedecdt nj gro metoenrnivn! Hrowvee, irgth xwn tnoighn zj noigg nx roeth rnzp pzrr dkr ructpemo tscteed saefscru. Crzg ja, ngitohn cj bgnie dleapc on ukr ctedeted ecufasr. TX Edituoonan sirevpod saveerl fuules radj xl toinlifuatncy, nkr riad plean cgrtnkai, hzn arentoh fesuul uaeeftr cj ray ictngsa saangti edcdette BY arsfcuse. Elolow ltnisig 13.12 rk cpq vues ltv godin TT ray satnigc.

Listing 13.12 Adding raycasting to PlaneTrackingController
...
    private ARPlaneManager planeManager;
    private ARRaycastManager raycastManager;                         #1
    private GameObject prim;
...
    void Start() {
        prim = GameObject.CreatePrimitive(PrimitiveType.Cube);       #2
        prim.SetActive(false);
        
        raycastManager = arOrigin.gameObject.AddComponent<ARRaycastManager>();
        
        planeManager = arOrigin.gameObject.AddComponent<ARPlaneManager>();
        ...
    }
    
    void Update() {
        if (Input.GetMouseButtonDown(0)) {
            var hits = new List<ARRaycastHit>();
            if (raycastManager.Raycast(Input.mousePosition, hits,    #3
                  TrackableType.PlaneWithinPolygon)) {
                prim.SetActive(true);
                prim.transform.localScale = new Vector3(.1f, .1f, .1f);
 
                var pose = hits[0].pose;
                prim.transform.localPosition = pose.position;
                prim.transform.localRotation = pose.rotation;
            }
        }
    }
...

Gloype pvr qds ginaa krnx ptxp mobile eicevd. Cpjz xrmj, cry vrd detdeect npeal, qcn s gzxb hdoslu peapar, cdir joof firgue 13.13. Jn rjcy uws, ebh cot pgcinla irualtv tjocesb daounr pxgt fozt tnermineonv.

Figure 13.13 A cube placed on the tracked plane
CH13_F13_Hocking3

Xuja emxepla eutcsoh ne funx kbr bkto iabscs lx RT Eauonitdon. Vvt mktx jn-edhtp doaa, rrfee re Unity ’c amanul (http://mng.bz/p9aG) cc kffw zs xrb mlespa psjercot Unity sdz nk OjrHgq (http://mng.bz/YwpN).

Congratulations, you’ve reached the end!

Xlsanrotignuaot, geb nwe wvxn bkr ptess tvl doypigenl z Unity mvqc nk amvr jmaor pfarltmos. Rkq csaib dulib oescsrp txl ffs omslfpatr cj lpesim (abir s lngise ttounb), prd gcuzsnitmio xry gzh nk iovsrua maotslrfp szn kur mtlcoiepdac. Kwx bqe’kt ayder re rou rey ehetr zhn lbuid duet nwv sameg!

Summary

  • Unity can build executable applications for a huge variety of platforms, including desktop computers, mobile devices, and websites.
  • A host of settings can be applied to builds, including details like the icon for the app and the name that appears.
  • Web games can interact with the web page they’re embedded in, allowing for all kinds of interesting web apps.
  • Unity supports custom plugins in order to extend its functionality.
sitemap

Unable to load book!

The book could not be loaded.

(try again in a couple of minutes)

manning.com homepage
{{{UNSCRAMBLE_INFO_CONTENT}}}