Turinys:
- 1 žingsnis: pradėkite naują „Unity“projektą
- 2 žingsnis: nustatykite sceną
- 3 žingsnis: Padarykime daleles
- 4 žingsnis: sulėtinkite daleles
- 5 žingsnis: sukurkite portalą
- 6 žingsnis: dalelių šešėliai
- 7 veiksmas: sukurkite „Skybox“
- 8 žingsnis: portalo logika
- 9 žingsnis: beveik baigta
- 10 veiksmas: įdėkite programą į savo telefoną
Video: AR portalas aukštyn kojom nuo nepažįstamų dalykų: 10 žingsnių (su nuotraukomis)
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:48
Šis „Instructable“padės sukurti papildytos realybės programą mobiliesiems, skirtą „iPhone“, su portalu, kuris veda aukštyn kojomis nuo „Stranger Things“. Galite įeiti į portalą, pasivaikščioti ir grįžti. Viskas, kas yra portalo viduje, gali būti matoma tik per portalą, kol neįeini į vidų. Kai būsite viduje, viskas pasirodys visur, kol grįšite į tikrąjį pasaulį. Mes naudosime „Unity 3D“vaizdo žaidimų variklį su „Apple ARKit“papildiniu. Visą programinę įrangą, kurią naudosime, galima atsisiųsti ir naudoti nemokamai. Jums nereikia būti ekspertu, kad galėtumėte sekti, mes eisime per kiekvieną žingsnį!
1 žingsnis: pradėkite naują „Unity“projektą
Pirmiausia atsisiųskite „Unity3D“ir būtinai įdiekite „IOS“platformos kūrimo failus. Taip pat turėsite atsisiųsti „Xcode“ir prisiregistruoti gauti nemokamą „Apple“kūrėjo paskyrą. Jūsų „iPhone“taip pat turės veikti „IOS 11“ar naujesnė versija. Nuo 2018 m. Vasario 5 d. „IOS 11.3“neveikia, tačiau „xCode 9.2“dar neturi palaikymo failų. Taigi, jei naudojate pačią naujausią „IOS“versiją, būtinai atsisiųskite naujausią „Xcode“beta versiją iš „Apple. Developer.com“.
Kai turėsite visas reikalingas programas, atidarykite „Unity“ir pradėkite naują projektą, pavadinkite jį, kaip norite. Mums reikės „Apple ARKit“papildinio, kad galėtume naudoti savo telefono kamerą, kad aptiktų žemę ir padėtų objektus ant grindų. Importuokime tai dabar, eidami į skirtuką Turto parduotuvė ir ieškodami „ARKit“. Turėsite sukurti nemokamą „Unity“paskyrą, jei jos dar neturite, tada spustelėkite importuoti, kad gautumėte papildinį.
Eikite į pavyzdžių aplanką ARKit aplanke ir raskite „UnityARKitScene“. Dukart spustelėkite jį, kad jį atidarytumėte. Mes naudosime šią sceną kaip atspirties tašką ir statysime iš čia. Ši scena pagal numatytuosius nustatymus leis aptikti žemę, o kai paliesite ekraną, kubas bus patalpintas toje vietoje.
Pirmiausia suskaidykime savo kūrimo nustatymus, kad nepamirštume to padaryti vėliau. Spustelėkite failą, sukurkite nustatymus ir pašalinkite visas scenas iš to sąrašo. Norėdami pridėti dabartinę, spustelėkite Pridėti atvirų scenų. Paskutinis dalykas, kurį turime čia nustatyti, yra grotuvo nustatymuose, eikite į paketo identifikatorių, o šios eilutės formatas yra com. YourCompanyName. YourAppName, todėl mano atveju darau kažką panašaus į com. MatthewHallberg. PortalTest.
2 žingsnis: nustatykite sceną
Pirmiausia pažiūrėkite į kairę ir suraskite žaidimo objektą pavadinimu „GeneratePlanes“. Kai tai paryškinta, dabar žiūrėkite į dešinę ir spustelėkite žymės langelį, kad jį išjungtumėte. Tokiu būdu mes neturime sukurti negražių mėlynų kvadratų, kai „ARKit“aptinka įžeminimo plokštumą. Toliau ištrinkite žaidimo „RandomCube“objektą, nes nenorime to matyti savo scenoje.
Dabar pirmiausia turime sukurti savo portalo duris. Ištrinkite kubą, kuris yra „HitCubeParent“vaikas. Dešiniuoju pelės mygtuku spustelėkite ir pasirinkite sukurti tuščią žaidimo objektą. Pervardykite jį į „portalą“. Dabar dešiniuoju pelės mygtuku spustelėkite tą objektą ir sukurkite kubą, tai padarys jį portalo antruoju. Pervardykite jį į „PostLeft“ir tai bus kairysis mūsų portalo įrašas. Mastelis taip, kad x yra 1, y yra 28, o z yra vienas. Atlikite tą patį tinkamam įrašui. Dabar sukurkite viršutinį stulpelį ir skalę y iki 14. Pasukite tai į šoną ir perkelkite taip, kad sujungtų kitus stulpelius. Padarykite visą portalo skalę 1,3 x 1,4 x 1.
Eikite į „Google“ir įveskite medžio ar žievės tekstūrą. Atsisiųskite vieną iš šių vaizdų ir vilkite jį į „Unity“išteklių aplanką. Dabar vilkite tą vaizdą į visus savo portalo įrašus.
Dar kartą spustelėkite objektą „Portalas“ir dešinėje spustelėkite Pridėti komponentą. Pridėkite prie jo „UnityARHitTestExample“scenarijų. Ten yra tuščias „Hit Transform“lizdas, vilkite „HitCubeParent“objektą į tą lizdą.
3 žingsnis: Padarykime daleles
Dabar mes naudosime „Unity Particle“sistemą, kad padarytume dūmų ir plaukiojančių dalelių efektą mūsų portale. Eikite į „Ištekliai“viršutinėje meniu juostoje, standartinį turtą ir importuokite dalelių sistemas.
Savo portale sukurkite du tuščius žaidimo objektus ir vieną pavadinkite „SmokeParticles“, o kitą - „FloatingParticles“.
Prie dūmų dalelių pridėkite dalelių sistemos komponentą.
Šis komponentas turi daugybę variantų, tačiau turime pakeisti tik porą.
Pakeiskite pradžios spalvą į kažką tamsiai mėlynos, maždaug 50% skaidrumo. Padarykite emisijos normą 100. Formos viduje padarykite spindulį.01. Apatinėje atvaizdavimo dalyje pakeiskite minimalų dydį į.8 ir maksimalų dydį į 5. Medžiagos komponente tiesiog pasirinkite dūmų medžiagą iš sąrašo, bet mes tai pakeisime vėliau.
Dabar pridėkite dalelių sistemą prie plaukiojančių dalelių žaidimo objekto ir nustatykite emisiją iki 500. Nustatykite pradžios trukmę 2, spindulį - 10, min. Dalelių dydį - 0,01, o maksimalų dalelių dydį - 0,15. Kol kas nustatykite medžiagą į numatytąją dalelę.
Galiausiai paimkite abu žaidimo objektus ir pasukite juos 90 laipsnių kampu x ir pakelkite juos į orą, kad jie skleistųsi į portalo duris.
4 žingsnis: sulėtinkite daleles
Kadangi norime, kad šios dalelės apimtų didelį plotą, bet ir lėtai judėtų, turime sukurti savo mėginio funkciją. Taigi dešiniuoju pelės mygtuku spustelėkite išteklių aplanką ir sukurkite naują C# scenarijų ir pavadinkite jį „ParticleSample“. Nukopijuokite ir įklijuokite šį kodą:
naudojant System. Collections;
naudojant System. Collections. Generic; naudojant „UnityEngine“; public class ParticleSample: MonoBehaviour {private ParticleSystem ps; // Naudokite tai inicijuodami void Start () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. Žaisti (); pajamingumas grąžina naujas „WaitForSeconds“(.1f); main.simulationSpeed =.05f; }}
Dabar vilkite šį scenarijų ant kiekvieno dalelių sistemos žaidimo objekto.
5 žingsnis: sukurkite portalą
Dabar turime sukurti portalą, todėl dešiniuoju pelės mygtuku spustelėkite portalo žaidimo objektą ir sukurkite keturratį. Padidinkite keturkampį, kad jis apimtų visą portalą, tai taps mūsų portalo langu. Pirmas dalykas, kurį turime pridėti, yra portalo šešėlis, tai padarys objektus tik su kitu konkrečiu šešėliu. Dešiniuoju pelės mygtuku spustelėkite išteklių aplanką ir sukurkite naują neapšviestą šešėlį. Pašalinkite viską ten ir įklijuokite šį kodą:
Shader "Portalas/portalWindow"
{SubShader {Zwrite off Colormask 0 cull off Trafaretas {Ref 1 Pass change} Pass {}}}
Dešiniuoju pelės mygtuku spustelėkite hierarchiją ir sukurkite naują medžiagą, pavadinkite ją „PortalWindowMat“, šios medžiagos išskleidžiamajame meniu raskite portalo skyrių ir pasirinkite portalo langą. Vilkite šią medžiagą į savo portalo kvadratą.
6 žingsnis: dalelių šešėliai
Dar kartą dešiniuoju pelės mygtuku spustelėkite išteklių aplanką ir sukurkite naują šešėlį. Turime padaryti dalelių, kurios patenka į portalą, šešėlius. Pakeiskite visą kodą taip:
„Shader“portalas/dalelės “{
Savybės {_TintColor ("atspalvio spalva", spalva) = (0,5, 0,5, 0,5, 0,5) _MainTex ("Dalelių tekstūra", 2D) = "balta" {} _InvFade ("Minkštųjų dalelių faktorius", diapazonas (0,01, 3,0)) = 1.0 _Stencil ("trafaretas", int) = 6} Kategorija {Žymos {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"} Maišyti SrcAlpha OneMinusSrcAlpha „ColorMask RGB Cull Off Lighting Off“ZWrite Off SubShader {Trafaretas {Ref 1 Comp [_Stencil]} Praleisti {CGPROGRAM #pragma vertex vert #pragma fragment fragment #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCT.exe" fiksuotas4 _TintColor; structure appdata_t {float4 viršūnė: POSITION; fiksuota4 spalva: SPALVA; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; structure v2f {float4 viršūnė: SV_POSITION; fiksuota4 spalva: SPALVA; 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); grįžti 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)))); plūdės dalisZ = i.projPos.z; float fade = prisotinti (_InvFade * (sceneZ-partZ)); i.color.a *= išblukti; #endif fix4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG („i.fogCoord“, stulpelis); grįžti col; } PABAIGA}}}}
Sukurkite dvi naujas medžiagas, vieną - portalSmoke, o kitą - portalParticles.
Kiekvienam pasirinkite šį šešėlį, iš išskleidžiamojo meniu, portaluose, dalelių. Dūmų dalelėms pasirinkite dūmų tekstūrą, o dalelėms - dalelių tekstūrą. Pakeiskite dūmų spalvą į tamsesnę mėlyną su maždaug 50% skaidrumu. Eikite į kiekvienos dalelių sistemos atvaizdavimo komponentą savo portale ir pasirinkite atitinkamą medžiagą, kurią ką tik sukūrėme.
7 veiksmas: sukurkite „Skybox“
Kad tikrai sukurtume apverstą išvaizdą, turime viską nuspalvinti tamsiai mėlyna spalva. Tam mes naudosime skaidrią skybox, todėl sukurkite naują šešėlį ir įklijuokite šį kodą:
Shader "Portalas/portalSkybox" {
Savybės {_Tint ("Atspalvio spalva", spalva) = (.5,.5,.5,.5) [Gamma] _Exposure ("Exposure", Diapazonas (0, 8)) = 1,0 _Rotation ("Rotation", Diapazonas (0, 360)) = 0 [NoScaleOffset] _Tex ("Cubemap (HDR)", Cube) = "pilka" {} _Stencil ("StencilNum", int) = 6} SubShader {Tags {"Queue" = "Background" "RenderType" = "Background" "PreviewType" = "Skybox"} Panaikinti ZWrite išjungimo mišinį SrcAlpha OneMinusSrcAlpha trafaretas {Ref 1 Comp [_Stencil]} Praleisti {CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #include "UnC.cginc "samplerCUBE _Tex; half4 _Tex_HDR; half4 _Tint; pusė _Exposure; plūdė _Rotacija; float3 RotateAroundYInDegrees (plūdė3 viršūnė, plūdės laipsniai) {plūdė alfa = laipsniai * UNITY_PI / 180.0; plūdė sina, cosa; sinkos (alfa, sina, cosa); float2x2 m = float2x2 (cosa, -sina, sina, cosa); grįžti float3 (mul (m, viršūnė.xz), viršūnė.y).xzy; } szerkezet appdata_t {float4 viršūnė: POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID}; structure v2f {float4 viršūnė: 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 (pasukta); o.texcoord = v.vertex.xyz; grįžti o; } fiksuotas4 fragmentas (v2f i): SV_Target {half4 tex = texCUBE (_Tex, i.texcoord); half3 c = dekoduotiHDR (tex, _Tex_HDR); c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb; c *= _ ekspozicija; grąžinti pusę4 (c,.5); } ENDCG}} Atsarginė išjungta}
Dabar sukurkite naują „Skybox“medžiagą, pavadinkite ją „PortalSkybox“ir pasirinkite šį portalSkybox shader iš portalo meniu. Eikite į langą „Apšvietimas“viršuje ir pasirinkite šią ką tik sukurtą „Skybox“. Eikite į pagrindinę kamerą ir nustatykite aiškias vėliavas į „Skybox“. Kol esame čia, galime pridėti kai kuriuos fotoaparato komponentus, kad galėtume aptikti susidūrimus. Pridėkite standų kėbulo komponentą prie fotoaparato ir panaikinkite žymėjimą naudoti gravitaciją. Pridėkite langelio greitintuvą ir patikrinkite, ar suveikia. Padarykite dėžutės greitintuvų dydį.5 x 1 x 4. Nustatykite fotoaparato kirpimo plokštumą į.01.
8 žingsnis: portalo logika
Paskutinis dalykas, kurį turime padaryti, yra sukurti mūsų portalą valdančią logiką. Sukurkite naują C# scenarijų ir pavadinkite jį „PortalController“.
naudojant System. Collections;
naudojant System. Collections. Generic; naudojant „UnityEngine“; vardų sritis UnityEngine. XR.iOS {public class PortalController: MonoBehaviour {public Material medžiagos; public MeshRenderer meshRenderer; viešas „UnityARVideo“„UnityARVideo“; private bool isInside = false; private bool isOutside = true; // Naudokite tai inicijuodami 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 = tiesa; InsidePortal (); }} else {if (isInside) {isInside = false; isOutside = tiesa; OutsidePortal (); }}} void OutsidePortal () {StartCoroutine (DelayChangeMat (3)); } void InsidePortal () {StartCoroutine (DelayChangeMat (6)); } IEnumerator DelayChangeMat (int stencilNum) {UnityARVideo.shouldRender = false; pajamingumas grąžina naują WaitForEndOfFrame (); meshRenderer.enabled = false; foreach (Medžiagos kilimėlis medžiagose) {mat. SetInt ("_Stencil", trafaretasNum); } pajamingumas grąžina naują WaitForEndOfFrame (); meshRenderer.enabled = tiesa; UnityARVideo.shouldRender = tiesa; }}}
Vilkite šį naują scenarijų į savo portalo langą. Tai pakeis mus į portalą ir iš jo, kai mūsų fotoaparato susidūrėjas susidurs su portalo langu. Dabar funkcijoje, kuri keičia visas medžiagas, mes liepiame „ARkit“papildiniui nerodyti kadro, todėl eikite į pagrindinę kamerą ir atidarykite „UnityARVideo“scenarijų. Viršuje sukurkite viešą „boRoolRender“ir nustatykite jį kaip „true“. Funkcijoje OnPreRender () viską įvyniokite į teiginį, kuriame viskas bus vykdoma tik tuo atveju, jei „ifRender“yra teisinga. Visas scenarijus turėtų atrodyti taip:
naudojant sistemą;
naudojant System. Runtime. InteropServices; naudojant „UnityEngine“; naudojant „UnityEngine. Rendering“; vardų sritis UnityEngine. XR.iOS {public class UnityARVideo: MonoBehaviour {public Material m_ClearMaterial; [HideInInspector] public bool shouldRender = true; privatus „CommandBuffer“m_VideoCommandBuffer; privati tekstūra2D _videoTextureY; privati tekstūra2D _videoTextureCbCr; privatus Matrix4x4 _displayTransform; privatus bool bCommandBufferInitialized; public void Start () {UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = klaidinga; } 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 = naujas „CommandBuffer“(); m_VideoCommandBuffer. Blit (null, BuiltinRenderTextureType. CurrentActive, m_ClearMaterial); GetComponent (). AddCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); bCommandBufferInitialized = tiesa; } void OnDestroy () {GetComponent (). RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent -= UpdateFrame; bCommandBufferInitialized = klaidinga; } #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 (); } Skiriamoji geba currentResolution = Screen.currentResolution; // Y tekstūra, jei (_videoTextureY == null) {_videoTextureY = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. R8, false, false, (System. IntPtr) rankenos.tekstūraY); _videoTextureY.filterMode = FilterMode. Bilinear; _videoTextureY.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ textureY", _videoTextureY); } // Tekstūros CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. IntPtr) handlesCtecC; _videoTextureCbCr.filterMode = FilterMode. Bilinear; _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 (tekstūra2D UVTex) {_videoTextureCbCr = UVTex; } public void OnPreRender () {if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture ("_ textureY", _videoTextureY); m_ClearMaterial. SetTexture ("_ textureCbCr", _videoTextureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); } #endif}}
9 žingsnis: beveik baigta
Galiausiai, kai spustelime ekraną ir patalpiname portalą, norime, kad jis visada būtų su mumis. Norėdami tai padaryti, eikite į portalo scenarijų „UnityARHitTestExample“. Viską viduje pakeiskite taip:
naudojant sistemą;
naudojant System. Collections. Generic; vardų sritis UnityEngine. XR.iOS {public class UnityARHitTestExample: MonoBehaviour {public Transform m_HitTransform; viešoji plūdė maxRayDistance = 30.0f; public LayerMask collisionLayer = 1 <0) {foreach (var hitResult in hitResults) {Debug. Log ("Gavau smūgį!"); 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 = naujas Vector3 (currAngle.x, transform.eulerAngles.y, currAngle.z); grįžti tiesa; }} return false; } // Atnaujinimas iškviečiamas kartą per kadrą negaliojantis Atnaujinimas () {#if UNITY_EDITOR // šį scenarijų naudosime tik redaktoriaus pusėje, nors nėra nieko, kas neleistų jam veikti įrenginyje, jei (Input. GetMouseButtonDown (0)) {Ray ray = Camera.main. ScreenPointToRay (Input.mousePosition); „RaycastHit“hitas; // bandysime pataikyti į vieną iš lėktuvo susidūrimo žaidimo objektų, kuriuos sukūrė papildinys // veiksmingai panašus į „HitTest“iškvietimą naudojant ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent if (Physics. Raycast (ray, out hit, maxRayDistance, collisionLayer)) {// poziciją gausime iš kontaktinio taško 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)); // ir sukimasis iš plokštumos greitintuvo transformacijos m_HitTransform.rotation = hit.transform.rotation; }} #else if (Input.touchCount> 0 && m_HitTransform! = null) {var touch = Input. GetTouch (0); if (touch.phase == TouchPhase. Began || touch.phase == TouchPhase. Moved) {var screenPosition = Camera.main. ScreenToViewportPoint (touch.position); ARPoint taškas = naujas ARPoint {x = screenPosition.x, y = screenPosition.y}; // Pirmenybės reults tipai ARHitTestResultType resultTypes = {ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent, //, jei norite naudoti begalinės plokštumos naudoti šį: //ARHitTestResultType. ARHitTestResultTypeExistingPlane, ARHitTestResultType. ARHitTestResultTypeHorizontalPlane, ARHitTestResultType. ARHitTestResultTypeFeaturePoint}; foreach (ARHitTestResultType resultType in resultTypes) {if (HitTestWithResultType (point, resultType)) {return; }}}} #endif}}}
10 veiksmas: įdėkite programą į savo telefoną
Pagaliau mes baigėme. Eikite į failą, sukurkite nustatymus ir spustelėkite kurti. Atidarykite „Xcode“ir pasirinkite aplanką, sukurtą iš versijos. Pasirinkite savo kūrėjų komandą ir įdėkite programą į savo telefoną! Galbūt norėsite pakeisti dalelių ir skybox dėžutės spalvas, kad jos atitiktų jūsų poreikius. Praneškite man komentaruose, jei turite klausimų ir ačiū, kad ieškojote!
Rekomenduojamas:
Paprasta roboto gamyba iš dalykų, kuriuos galite rasti savo namuose (karšto rato versija): 5 žingsniai
Paprasta roboto gamyba iš daiktų, kuriuos galite rasti savo namuose (karšto rato versija): Ši instrukcija parodys, kaip pasigaminti savaeigį greitkelį, veikiantį su dvigubos A baterijomis. Jums reikės naudoti tik tai, ką greičiausiai rasite savo namuose. Atminkite, kad šis robotas greičiausiai neis tiesiai
4 bitų dvejetainis skaitiklis aukštyn/žemyn: 11 žingsnių
4 bitų dvejetainis skaitiklis aukštyn/žemyn: Skaitiklis yra 4 bitų dvejetainis skaitiklis aukštyn/žemyn. Tai reiškia, kad šis skaitiklis gali skaičiuoti nuo 0 iki 15 arba nuo 15 iki 0, nes jis skaičiuojamas aukštyn arba žemyn. Projektas yra dvejetainis skaitiklis, pagamintas naudojant 4029, 555 ir 4-10 mm LED, daugiausia naudojant dvigubą panardinimą
Kaip ieškoti dalykų „Google Chrome“naudojant „Microsoft Excel“makrokomandas (NĖRA REIKALINGŲ KODAVIMO ŽINIŲ): 10 žingsnių
Kaip ieškoti dalykų „Google Chrome“naudojant „Microsoft Excel“makrokomandas (NĖRA REIKALINGŲ KODAVIMO ŽINIŲ): Ar žinojote, kad galite lengvai pridėti paieškos funkciją prie „Excel“skaičiuoklės?! Galiu parodyti, kaip tai padaryti per kelis paprastus veiksmus! Norėdami tai padaryti, jums reikės: Kompiuterio - (PATIKRINKITE!) „Microsoft Excel Google Chrome“įdiegta
„GreyBOX“- apsaugos nuo nelaimingų atsitikimų ir apsaugos nuo vagystės sistema: 4 žingsniai (su paveikslėliais)
„GrayBOX“- apsaugos nuo nelaimingų atsitikimų ir vagysčių sistema: „GrayBOX“yra įrenginys, apsaugantis jus ir jūsų transporto priemonę*. Šis prietaisas bus sumontuotas jūsų automobilyje*ir automatiškai atliks kai kurias užduotis, kad išgelbėtų jus ir jūsų transporto priemonę*. „GrayBOX“yra SIM kortelė, todėl galite bendrauti su juo teksto žinute
Arduino Uno portalas „Du sargybos bokšteliai“: 6 žingsniai (su nuotraukomis)
Arduino Uno portalas „Two Sentry Turret“: šis nurodymas buvo sukurtas vykdant Pietų Floridos universiteto „Makecourse“projekto reikalavimą (www.makecourse.com)