AR -portaali ylösalaisin vieraista asioista: 10 vaihetta (kuvilla)
AR -portaali ylösalaisin vieraista asioista: 10 vaihetta (kuvilla)

Video: AR -portaali ylösalaisin vieraista asioista: 10 vaihetta (kuvilla)

Video: AR -portaali ylösalaisin vieraista asioista: 10 vaihetta (kuvilla)
Video: Kävely vanhassa Odessassa! Kirpputori ja ainutlaatuinen ELÄINtori. Koirarodut top 10 2025, Tammikuu
Anonim
AR -portaali ylösalaisin vieraista asioista
AR -portaali ylösalaisin vieraista asioista
AR -portaali ylösalaisin vieraista asioista
AR -portaali ylösalaisin vieraista asioista

Tämä Instructable luo lisätyn todellisuuden mobiilisovelluksen iPhonelle, jossa on portaali, joka johtaa ylösalaisin Stranger Thingsista. Voit mennä portaalin sisään, kävellä ympäri ja tulla takaisin ulos. Kaikki portaalin sisällä voidaan nähdä vain portaalin läpi, kunnes kävelet sisään. Kun olet sisällä, kaikki hajoaa kaikkialla, kunnes kävelet takaisin todelliseen maailmaan. Käytämme Unity 3D -videopelimoottoria Applen ARKit -laajennuksen kanssa. Kaikki käyttämämme ohjelmistot voidaan ladata ja käyttää ilmaiseksi. Sinun ei tarvitse olla asiantuntija seurataksesi, käymme läpi kaikki askeleet!

Vaihe 1: Aloita uusi Unity -projekti

Aloita uusi Unity -projekti
Aloita uusi Unity -projekti

Lataa ensin Unity3D ja varmista, että asennat IOS -alustan koontitiedostot. Sinun on myös ladattava Xcode ja tilattava ilmainen Apple -kehittäjätili. Myös iPhonessa on oltava käytössä IOS 11 tai uudempi. Tänään helmikuun 5. päivänä 2018 IOS 11.3 on poissa käytöstä, mutta xCode 9.2: lla ei ole vielä tukitiedostoja. Joten jos käytät uusinta IOS -versiota, lataa uusin Xcode -beetaversio osoitteesta Apple. Developer.com.

Kun sinulla on kaikki tarvittavat ohjelmat, avaa Unity ja aloita uusi projekti, kutsu sitä miten haluat. Tarvitsemme Apple ARKit -laajennuksen, jotta voimme käyttää puhelimen kameraa havaitsemaan maan ja asettamaan esineitä lattialle. Tuodaan se nyt menemällä Asset Store -välilehdelle ja tekemällä haku "ARKit". Sinun on luotava ilmainen Unity -tili, jos sinulla ei vielä ole sitä, ja napsauta sitten tuodaksesi laajennuksen.

Siirry ARKit -kansion esimerkkikansioon ja etsi "UnityARKitScene". Avaa se kaksoisnapsauttamalla sitä. Käytämme tätä kohtausta lähtökohtana ja rakennamme tästä eteenpäin. Tämän kohtauksen avulla voit oletuksena havaita maan ja kun napautat näyttöä, kuutio sijoitetaan kyseiseen kohtaan.

Saamme ensin kokoonpanoasetuksemme neliöön, jotta emme unohda tehdä sitä myöhemmin. Napsauta tiedostoa, luo asetukset ja poista kaikki kohtaukset luettelosta. Napsauta Lisää avoimet kohtaukset lisätäksesi nykyisen. Viimeinen asia, joka meidän on määritettävä täällä, on soittimen asetuksissa mennä nipun tunnisteeseen ja tämän merkkijonon muoto on com. YourCompanyName. YourAppName, joten tapauksessani teen jotain com. MatthewHallberg. PortalTest.

Vaihe 2: Määritä kohtaus

Määritä kohtaus
Määritä kohtaus

Katso ensin vasemmalle ja etsi peliobjekti nimeltä "GeneratePlanes". Kun tämä on korostettu, katso oikealle ja poista se käytöstä napsauttamalla valintaruutua. Tällä tavalla meillä ei ole rumia sinisiä neliöitä, kun ARKit havaitsee maatason. Poista seuraavaksi "RandomCube" -pelin objekti, koska emme halua nähdä sitä kohtauksessamme.

Nyt meidän on ensin luotava portaaliovemme. Poista kuutio, joka on HitCubeParentin lapsi. Napsauta hiiren kakkospainikkeella ja valitse Luo tyhjä peliobjekti. Nimeä se uudelleen portaaliksi. Napsauta nyt objektia hiiren kakkospainikkeella ja luo kuutio, jolloin siitä tulee portaalin lapsi. Nimeä se uudelleen "PostLeft" ja tämä on portaalin vasen viesti. Skaalaa se niin, että x on 1, y on 28 ja z on yksi. Tee sama oikeaan viestiin. Luo nyt ylempi pylväs ja skaalaa y arvoon 14. Käännä tätä sivuttain ja siirrä sitä siten, että se yhdistää muut pylväät. Tee koko portaalin mittakaava 1,3 x 1,4 x 1.

Siirry Googleen ja kirjoita puun tai kuoren rakenne. Lataa yksi näistä kuvista ja vedä se Unityn resurssikansioon. Vedä nyt tämä kuva kaikkiin portaaliviesteihisi.

Napsauta "Portaali" -objektia uudelleen ja napsauta Lisää komponentti oikealla. Lisää siihen UnityARHitTestExample -skripti. Siellä on tyhjä paikka "Hit Transformille", vedä "HitCubeParent" -objekti kyseiseen paikkaan.

Vaihe 3: Tehdään hiukkasia

Tehdään hiukkasia
Tehdään hiukkasia

Nyt aiomme käyttää Unity Particle -järjestelmää savun ja kelluvien hiukkasten tehostamiseksi portaalimme sisällä. Siirry ylävalikkopalkin Omaisuuksiin, vakioresursseihin ja tuo hiukkasjärjestelmiä.

Luo portaaliisi kaksi tyhjää peliobjektia ja kutsu toista "SmokeParticles" ja toista "FloatingParticles".

Lisää hiukkasjärjestelmän komponentti savuhiukkasiin.

Tässä osassa on joukko vaihtoehtoja, mutta meidän on vaihdettava vain pari.

Vaihda aloitusväri johonkin tummansiniseen noin 50%: n läpinäkyvyydellä. Tee päästöaste 100. Tee sisäpuolelle säde.01. Muuta alareunan renderointiosassa minikoko 0,8 ja maksimi 5. Materiaalikomponentissa valitse vain savumateriaali luettelosta, mutta aiomme muuttaa tämän myöhemmin.

Lisää hiukkasjärjestelmä kelluvaan hiukkaspeliobjektiin nyt ja aseta emissioksi 500. Aseta aloitusajaksi 2, säde 10, minimihiukkaskoko 0,01 ja maksimipartikkelikoko 0,05. Aseta materiaali toistaiseksi oletuspartikkeliksi.

Ota lopuksi molemmat peliesineet ja käännä niitä 90 astetta x: llä ja nosta ne ilmaan niin, että ne lähettävät alas portaalin oviaukolle.

Vaihe 4: Hiukkasten hidastaminen

Hiukkasten hidastaminen
Hiukkasten hidastaminen

Koska haluamme näiden hiukkasten peittävän suuren alueen mutta myös liikkuvan hitaasti, meidän on luotava oma näytefunktio. Joten napsauta hiiren kakkospainikkeella resurssien kansiota ja luo uusi C# -skripti ja kutsu sitä "ParticleSample". Kopioi ja liitä tämä koodi:

System. Collectionsin avulla;

käyttämällä System. Collections. Generic; käyttämällä UnityEngineä; julkinen luokka ParticleSample: MonoBehaviour {private ParticleSystem ps; // Käytä tätä alustamiseen void Start () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. Play (); tuotto uusi WaitForSeconds (.1f); main.simulationSpeed =.05f; }}

Vedä nyt tämä skripti jokaiseen hiukkasjärjestelmäpeliobjektiisi.

Vaihe 5: Luo portaali

Portaalin luominen!
Portaalin luominen!

Nyt meidän on luotava portaali, joten napsauta hiiren kakkospainikkeella portaalipeliobjektia ja luo quad. Skaalaa quad niin, että se kattaa koko portaalin, tästä tulee portaali -ikkuna. Ensimmäinen asia, joka meidän on lisättävä siihen, on portaalin varjostin, tämä tekee vain esineistä toisen tietyn varjostimen. Napsauta resurssikansio hiiren kakkospainikkeella ja luo uusi valaisematon varjostin. Poista kaikki sieltä ja liitä tämä koodi:

Shader "Portal/portalWindow"

{SubShader {Zwrite off Colormask 0 cull off Stencil {Ref 1 Pass vaihda} Pass {}}}

Napsauta hiiren kakkospainikkeella hierarkiaa ja luo uusi materiaali, nimeltään se PortalWindowMat, etsi tämän materiaalin pudotusvalikosta portaali -osa ja valitse portaali -ikkuna. Vedä tämä materiaali portaalin quadiin.

Vaihe 6: Hiukkasvarjostimet

Hiukkasvarjostimet
Hiukkasvarjostimet

Napsauta hiiren kakkospainikkeella resurssien kansiota uudelleen ja luo uusi varjostin. Meidän on tehtävä varjostimet hiukkasille, jotka menevät portaalin sisään. Korvaa kaikki koodit tällä:

Shader "Portaali/hiukkaset" {

Ominaisuudet {_TintColor ("Värisävy", Väri) = (0,5, 0,5, 0,5, 0,5) _MainTex ("Hiukkasrakenne", 2D) = "valkoinen" {} _InvFade ("Pehmeiden hiukkasten tekijä", alue (0,01, 3,0)) = 1.0 _Stencil ("stencil", int) = 6} Luokka {Tunnisteet {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"} Sekoita SrcAlpha OneMinusSrcAlpha ColorMask RGB Cull Off Lighting Off ZWrite Off SubShader {Stencil {Ref 1 Comp [_Stencil]} Hyväksy {CGPROGRAM #pragma vertex vert #pragma fragment fragment #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCT.exe" kiinteä4 _TintColor; structure appdata_t {float4 -kärki: POSITION; kiinteä4 väri: VÄRI; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; strukt v2f {float4 -kärki: SV_POSITION; kiinteä4 väri: VÄRI; float2 texcoord: TEXCOORD0; UNITY_FOG_COORDS (1) #ifdef SOFTPARTICLES_ON float4 projPos: TEXCOORD2; #endif UNITY_VERTEX_OUTPUT_STEREO}; float4 _MainTex_ST; v2f vert (appdata_t v) {v2f o; UNITY_SETUP_INSTANCE_ID (v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO (o); o.vertex = UnityObjectToClipPos (v.vertex); #ifdef SOFTPARTICLES_ON o.projPos = ComputeScreenPos (o.vertex); COMPUTE_EYEDEPTH (o.projPos.z); #endif o.color = v.color * _TintColor; o.texcoord = TRANSFORM_TEX (v.texcoord, _MainTex); UNITY_TRANSFER_FOG (o, o.vertex); paluu o; } UNITY_DECLARE_DEPTH_TEXTURE (_CameraDepthTexture); float _InvFade; fix4 frag (v2f i): SV_Target {#ifdef SOFTPARTICLES_ON float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ (_CameraDepthTexture, UNITY_PROJ_COORD (i.projPos)))); kelluva osaZ = i.projPos.z; float fade = kylläinen (_InvFade * (sceneZ-partZ)); i.color.a *= haalistu; #endif fix4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, sarake); paluu col; } LOPPU}}}}

Luo kaksi uutta materiaalia, joista toinen on portalSmoke ja toinen portalParticles.

Valitse jokaiselle tämä varjostin pudotusvalikosta portaaleissa hiukkasia. Savuhiukkasille valitse savun rakenne ja hiukkasille hiukkasrakenne. Vaihda savun väri tummempaan siniseen noin 50%: n läpinäkyvyydellä. Siirry portaalin jokaisen hiukkasjärjestelmän renderoijakomponenttiin ja valitse juuri luomamme materiaalit.

Vaihe 7: Luo Skybox

Luo Skybox
Luo Skybox

Jotta voimme todella luoda ylösalaisin ulkonäön, meidän on sävytettävä kaikki tummansinisiksi. Tätä varten käytämme läpinäkyvää skyboxia, joten tee uusi varjostin ja liitä tämä koodi:

Shader "Portal/portalSkybox" {

Ominaisuudet {_Tint ("Värisävy", Väri) = (.5,.5,.5,.5) [Gamma] _Valotus ("Valotus", alue (0, 8)) = 1,0 _Kierros ("Kierto", alue) (0, 360)) = 0 [NoScaleOffset] _Tex ("Cubemap (HDR)", Cube) = "harmaa" {} _Stencil ("StencilNum", int) = 6} SubShader {Tunnisteet {"Queue" = "Tausta" "RenderType" = "Background" "PreviewType" = "Skybox"} Poista ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Stencil {Ref 1 Comp [_Stencil]} Hyväksy {CGPROGRAM #pragma vertex vert #pragma fragment fragment #pragma target 2.0 #include "UnC.cginc "samplerCUBE _Tex; puoli4 _Tex_HDR; half4 _Tint; puoli _Valotus; float _Rotation; float3 RotateAroundYInDegrees (float3 -kärki, float -asteet) {float alpha = astetta * UNITY_PI / 180.0; kellua sina, cosa; sincos (alfa, sina, cosa); float2x2 m = float2x2 (cosa, -sina, sina, cosa); return float3 (mul (m, vertex.xz), vertex.y).xzy; } structure appdata_t {float4 -kärki: POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID}; strukt v2f {float4 -kärki: SV_POSITION; float3 texcoord: TEXCOORD0; UNITY_VERTEX_OUTPUT_STEREO}; v2f vert (appdata_t v) {v2f o; UNITY_SETUP_INSTANCE_ID (v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO (o); float3 rotated = RotateAroundYInDegrees (v.vertex, _Rotation); o.vertex = UnityObjectToClipPos (käännetty); o.texcoord = v.vertex.xyz; paluu o; } kiinteä4 fragmentti (v2f i): SV_Target {half4 tex = texCUBE (_Tex, i.texcoord); half3 c = DecodeHDR (tex, _Tex_HDR); c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb; c *= _Valotus; paluu puoli4 (c,.5); } ENDCG}} Fallback Off}

Luo nyt uusi skybox -materiaali, kutsu sitä "PortalSkybox" ja valitse tämä portalSkybox -varjostin portaalivalikosta. Siirry yläosassa olevaan Ikkuna, valaistus -kohtaan ja valitse tämä juuri luomaamme laatikko. Siirry pääkameraan ja aseta selkeät liput skyboxiin. Kun olemme täällä, voimme lisätä joitain komponentteja kameraamme, jotta voimme havaita törmäykset. Lisää jäykkä runko -osa kameraan ja poista valinta painovoiman käytöstä. Lisää laatikon törmäyslaite ja tarkista liipaisin. Tee laatikon törmäyskoko.5 x 1 x 4. Aseta kameran leikkaustaso arvoon.01.

Vaihe 8: Portaalilogiikka

Portaalin logiikka
Portaalin logiikka

Viimeinen asia, joka meidän on tehtävä, on luoda logiikka, joka ohjaa portaaliamme. Luo uusi C# -skripti ja kutsu sitä PortalControlleriksi.

System. Collectionsin avulla;

käyttämällä System. Collections. Generic; käyttämällä UnityEngineä; nimitila UnityEngine. XR.iOS {public class PortalController: MonoBehaviour {public Material materiaalit; julkinen MeshRenderer meshRenderer; julkinen UnityARVideo UnityARVideo; yksityinen bool isInside = false; yksityinen bool isOutside = true; // Käytä tätä alustukseen void Start () {OutsidePortal (); } void OnTriggerStay (Collider col) {Vector3 playerPos = Camera.main.transform.position + Camera.main.transform.forward * (Camera.main.nearClipPlane * 4); if (transform. InverseTransformPoint (playerPos).z <= 0) {if (isOutside) {isOutside = false; isInside = totta; InsidePortal (); }} else {if (isInside) {isInside = false; isOutside = totta; OutsidePortal (); }}} void OutsidePortal () {StartCoroutine (DelayChangeMat (3)); } void InsidePortal () {StartCoroutine (DelayChangeMat (6)); } IEnumerator DelayChangeMat (int stencilNum) {UnityARVideo.shouldRender = false; tuotto uusi WaitForEndOfFrame (); meshRenderer.enabled = false; foreach (Materiaalimatto materiaaleissa) {mat. SetInt ("_Stencil", stencilNum); } tuotto palauttaa uuden WaitForEndOfFrame (); meshRenderer.enabled = true; UnityARVideo.shouldRender = true; }}}

Vedä tämä uusi komentosarja portaali -ikkunaan. Tämä siirtää meidät sisään ja ulos portaalista aina, kun kameramme törmäyslaite törmää portaali -ikkunaan. Nyt funktiossa, joka muuttaa kaikkia materiaaleja, kehotamme ARkit -laajennusta olemaan muodostamatta kehystä, joten siirry pääkameraan ja avaa UnityARVideo -skripti. Luo julkinen bool shouldRender yläreunassa ja aseta arvoksi true. Alas OnPreRender () -funktiossa kääri kaikki if -lauseeseen, jossa kaikki sisällä suoritetaan vain, jos shouldRender on tosi. Koko käsikirjoituksen pitäisi näyttää tältä:

järjestelmän käyttö;

käyttämällä System. Runtime. InteropServices; käyttämällä UnityEngineä; käyttämällä UnityEngine. Rendering; nimitila UnityEngine. XR.iOS {public class UnityARVideo: MonoBehaviour {public Material m_ClearMaterial; [HideInInspector] public bool shouldRender = true; yksityinen CommandBuffer m_VideoCommandBuffer; yksityinen Texture2D _videoTextureY; yksityinen Texture2D _videoTextureCbCr; yksityinen Matrix4x4 _displayTransform; yksityinen bool bCommandBufferInitialized; public void Start () {UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = epätosi; } void UpdateFrame (UnityARCamera cam) {_displayTransform = new Matrix4x4 (); _displayTransform. SetColumn (0, cam.displayTransform.column0); _displayTransform. SetColumn (1, cam.displayTransform.column1); _displayTransform. SetColumn (2, cam.displayTransform.column2); _displayTransform. SetColumn (3, cam.displayTransform.column3); } void InitializeCommandBuffer () {m_VideoCommandBuffer = uusi CommandBuffer (); m_VideoCommandBuffer. Blit (null, BuiltinRenderTextureType. CurrentActive, m_ClearMaterial); GetComponent (). AddCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); bCommandBufferInitialized = tosi; } void OnDestroy () {GetComponent (). RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent -= UpdateFrame; bCommandBufferInitialized = epätosi; } #if! UNITY_EDITOR public void OnPreRender () {if (shouldRender) {ARTextureHandles handles = UnityARSessionNativeInterface. GetARSessionNativeInterface (). GetARVideoTextureHandles (); if (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) {return; } if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } Resoluutio currentResolution = Screen.currentResolution; // Rakenne Y jos (_videoTextureY == null) {_videoTextureY = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. R8, false, false, (System. IntPtr) kahvat.tekstuuriY); _videoTextureY.filterMode = Suodatintila. Bilineaarinen; _videoTextureY.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ textureY", _videoTextureY); } // Texture CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. IntPtr) handles.texC; _videoTextureCbCr.filterMode = Suodatintila. Bilineaarinen; _videoTextureCbCr.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ textureCbCr", _videoTextureCbCr); } _videoTextureY. UpdateExternalTexture (handles.textureY); _videoTextureCbCr. UpdateExternalTexture (handles.textureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); }} #else public void SetYTexure (Texture2D YTex) {_videoTextureY = YTex; } public void SetUVTexure (Texture2D UVTex) {_videoTextureCbCr = UVTex; } public void OnPreRender () {if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture ("_ textureY", _videoTextureY); m_ClearMaterial. SetTexture ("_ textureCbCr", _videoTextureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); } #loppu Jos } }

Vaihe 9: melkein valmis

Melkein valmis!
Melkein valmis!

Lopuksi, kun napsautamme näyttöä ja sijoitamme portaalin, haluamme sen olevan aina meitä kohti. Voit tehdä tämän siirtymällä UnityARHitTestExample -komentosarjaan portaalissa. Korvaa kaikki sisäpuolella tällä:

järjestelmän käyttö;

käyttämällä System. Collections. Generic; nimiavaruus UnityEngine. XR.iOS {public class UnityARHitTestExample: MonoBehaviour {public Transform m_HitTransform; julkinen float maxRayDistance = 30.0f; public LayerMask collisionLayer = 1 <0) {foreach (var hitResult in hitResults) {Debug. Log ("Sain osuman!"); m_HitTransform.position = UnityARMatrixOps. GetPosition (hitResult.worldTransform); m_HitTransform.rotation = UnityARMatrixOps. GetRotation (hitResult.worldTransform); Debug. Log (string. Format ("x: {0: 0. ######} y: {1: 0. ######} z: {2: 0. ###### } ", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z)); Vector3 currAngle = transform.eulerAngles; transform. LookAt (Camera.main.transform); transform.eulerAngles = uusi Vector3 (currAngle.x, transform.eulerAngles.y, currAngle.z); palaa tosi; }} return false; } // Päivitys kutsutaan kerran kehystä kohti tyhjä Päivitys () {#if UNITY_EDITOR // käytämme tätä komentosarjaa vain editorin puolella, vaikka mikään ei estä sitä toimimasta laitteella, jos (Input. GetMouseButtonDown (0)) {Ray ray = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit osuma; // yritämme osua johonkin laajennuksen luomaan lentokoneen törmäyspeliobjektiin // joka on käytännössä samanlainen kuin HitTestin kutsuminen ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent if (Physics. Raycast (ray, out hit, maxRayDistance, collisionLayer)) {// saamme paikan yhteyspisteestä m_HitTransform.position = hit.point; Debug. Log (string. Format ("x: {0: 0. ######} y: {1: 0. ######} z: {2: 0. ###### } ", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z)); // ja kierto tasotörmäimen muunnoksesta m_HitTransform.rotation = hit.transform.rotation; }} #else if (Input.touchCount> 0 && m_HitTransform! = null) {var touch = Input. GetTouch (0); jos (touch.phase == TouchPhase. Began || touch.phase == TouchPhase. Moved) {var screenPosition = Camera.main. ScreenToViewportPoint (touch.position); ARPoint -piste = uusi ARPoint {x = screenPosition.x, y = screenPosition.y}; // ensisijaisuus reults tyyppejä ARHitTestResultType resultTypes = {ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent, // jos haluat käyttää ääretöntä lentokoneet käyttävät tätä: //ARHitTestResultType. ARHitTestResultTypeExistingPlane, ARHitTestResultType. ARHitTestResultTypeHorizontalPlane, ARHitTestResultType. ARHitTestResultTypeFeaturePoint}; foreach (ARHitTestResultType resultType in resultTypes) {if (HitTestWithResultType (point, resultType)) {return; } } } } #loppu Jos } } }

Vaihe 10: Laita sovellus puhelimeesi

Laita sovellus puhelimeesi!
Laita sovellus puhelimeesi!

Lopulta olemme valmiit. Siirry tiedostoon, luo asetukset ja napsauta rakenna. Avaa Xcode ja valitse kansio, joka luotiin koontiversiosta. Valitse kehitystiimi ja laita sovellus puhelimeesi! Voit halutessasi vaihtaa hiukkasten ja skyboxin värit tarpeidesi mukaan. Kerro minulle kommenteissa, jos sinulla on kysyttävää ja kiitos etsimisestä!