
Satura rādītājs:
- 1. darbība: sāciet jaunu vienotības projektu
- 2. darbība: iestatiet ainu
- 3. solis: izveidosim dažas daļiņas
- 4. solis: daļiņu palēnināšana
- 5. solis: izveidojiet portālu
- 6. darbība: daļiņu ēnotāji
- 7. darbība: izveidojiet Skybox
- 8. solis: portāla loģika
- 9. solis: gandrīz pabeigts
- 10. solis: ievietojiet lietotni savā tālrunī
2025 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2025-01-23 14:59


Šajā pamācībā tiks izveidota paplašinātās realitātes mobilā lietotne iPhone ar portālu, kas no Stranger Things novedīs otrādi. Jūs varat ieiet portālā, staigāt apkārt un atgriezties. Viss, kas atrodas portālā, ir redzams tikai caur portālu, līdz jūs ejat iekšā. Kad esat iekšā, viss parādīsies visur, līdz atgriezīsities reālajā pasaulē. Mēs izmantosim Unity 3D videospēļu dzinēju ar Apple ARKit spraudni. Visu programmatūru, ko izmantosim, var lejupielādēt un izmantot bez maksas. Jums nav jābūt ekspertam, lai sekotu līdzi, mēs veiksim katru soli!
1. darbība: sāciet jaunu vienotības projektu

Vispirms lejupielādējiet Unity3D un noteikti instalējiet IOS platformas būvniecības failus. Jums būs arī jālejupielādē Xcode un jāreģistrējas bezmaksas ābolu izstrādātāja kontam. Arī jūsu iPhone būs jādarbojas ar iOS 11 vai jaunāku versiju. No šodienas, 2018. gada 5. februāra, IOS 11.3 ir izlaists, bet xCode 9.2 tam vēl nav atbalsta failu. Tātad, ja izmantojat jaunāko IOS versiju, noteikti lejupielādējiet jaunāko Xcode beta versiju no Apple. Developer.com.
Kad esat ieguvis visas nepieciešamās programmas, atveriet Unity un sāciet jaunu projektu, sauciet to, kā vēlaties. Mums būs nepieciešams Apple ARKit spraudnis, lai mēs varētu izmantot tālruņa kameru, lai noteiktu zemi un novietotu objektus uz grīdas. Importēsim to tagad, dodoties uz cilni Aktīvu veikals un meklējot “ARKit”. Jums būs jāizveido bezmaksas Unity konts, ja jums tāda vēl nav, pēc tam noklikšķiniet uz Importēt, lai iegūtu spraudni.
Pārejiet uz mapi ARKit mapē Piemēri un atrodiet vienību UnityARKitScene. Veiciet dubultklikšķi uz tā, lai to atvērtu. Mēs izmantosim šo ainu kā sākumpunktu un veidosim no šejienes. Šī aina pēc noklusējuma ļaus jums noteikt zemi, un, pieskaroties ekrānam, šajā pozīcijā tiks ievietots kubs.
Vispirms ļaujiet mūsu būvēšanas iestatījumus salikt kvadrātā, lai neaizmirstu to izdarīt vēlāk. Noklikšķiniet uz faila, izveidojiet iestatījumus un noņemiet visas ainas no šī saraksta. Noklikšķiniet uz Pievienot atvērtas ainas, lai pievienotu mūsu pašreizējo ainu. Pēdējā lieta, kas mums šeit ir jāiestata, ir atskaņotāja iestatījumos iet uz paketes identifikatoru, un šīs virknes formāts ir com. YourCompanyName. YourAppName, tāpēc manā gadījumā es daru kaut ko līdzīgu com. MatthewHallberg. PortalTest.
2. darbība: iestatiet ainu

Vispirms paskatieties pa kreisi un atrodiet spēles objektu ar nosaukumu "GeneratePlanes". Kad tas ir iezīmēts, skatieties pa labi un noklikšķiniet uz izvēles rūtiņas, lai to atspējotu. Tādā veidā mums netiek ģenerēti neglītie zilie kvadrāti, kad ARKit atklāj iezemētu plakni. Pēc tam izdzēsiet spēles objektu "RandomCube", jo mēs to nevēlamies redzēt savā ainā.
Tagad mums vispirms ir jāizveido mūsu portāla durvis. Izdzēsiet kubu, kas ir "HitCubeParent" bērns. Ar peles labo pogu noklikšķiniet un izvēlieties izveidot tukšu spēles objektu. Pārdēvējiet to par portālu. Tagad ar peles labo pogu noklikšķiniet uz šī objekta un izveidojiet kubu, tas padarīs to par portāla bērnu. Pārdēvējiet to par "PostLeft", un šī būs mūsu portāla kreisā ziņa. Mērogojiet to tā, lai x būtu 1, y būtu 28 un z būtu viens. Dariet to pašu pareizajam amatam. Tagad izveidojiet augšējo stabu un mērogojiet y līdz 14. Pagrieziet to uz sāniem un pārvietojiet tā, lai tas savienotu pārējos stabiņus. Padariet visu portāla mērogu 1,3 x 1,4 x 1.
Iet uz google un ierakstiet koka vai mizas tekstūru. Lejupielādējiet vienu no šiem attēliem un velciet to savā Unity aktīvu mapē. Tagad velciet šo attēlu uz visām portāla ziņām.
Vēlreiz noklikšķiniet uz objekta "Portāls" un labajā pusē noklikšķiniet uz Pievienot komponentu. Pievienojiet tam skriptu "UnityARHitTestExample". Tur ir tukšs slots "Hit Transform", velciet "HitCubeParent" objektu šajā slotā.
3. solis: izveidosim dažas daļiņas

Tagad mēs izmantosim Unity Particle sistēmu, lai mūsu portālā radītu dūmu un peldošo daļiņu efektu. Augšējā izvēlņu joslā atveriet Aktīvi, standarta līdzekļi un importējiet daļiņu sistēmas.
Portālā izveidojiet divus tukšus spēles objektus un vienu sauciet par “SmokeParticles”, bet otru - par “FloatingParticles”.
Pievienojiet dūmu daļiņām daļiņu sistēmas sastāvdaļu.
Šim komponentam ir daudz iespēju, taču mums ir jāmaina tikai pāris.
Mainiet sākuma krāsu uz kaut ko tumši zilu ar aptuveni 50% caurspīdīgumu. Padariet emisijas ātrumu 100. Formas iekšpusē izveidojiet rādiusu.01. Apmetuma daļā apakšā mainiet minimālo izmēru uz 0,8 un maksimālo izmēru līdz 5. Materiāla komponentam vienkārši izvēlieties dūmu materiālu no saraksta, bet mēs to mainīsim vēlāk.
Pievienojiet daļiņu sistēmu peldošo daļiņu spēles objektam tūlīt un iestatiet emisiju uz 500. Iestatiet sākuma dzīves ilgumu uz 2, rādiusu līdz 10, minimālo daļiņu izmēru līdz 0,01 un maksimālo daļiņu izmēru uz.015. Pagaidām iestatiet materiālu uz noklusējuma daļiņu.
Visbeidzot paņemiet abus spēles objektus un pagrieziet tos par 90 grādiem pa x un paceliet tos gaisā, lai tie izstarotos uz portāla durvīm.
4. solis: daļiņu palēnināšana

Tā kā mēs vēlamies, lai šīs daļiņas aptvertu lielu teritoriju, bet arī kustētos lēni, mums ir jāizveido sava parauga funkcija. Tāpēc ar peles labo pogu noklikšķiniet uz aktīvu mapes un izveidojiet jaunu C# skriptu un nosauciet to par "ParticleSample". Kopējiet un ielīmējiet šo kodu:
izmantojot System. Collections;
izmantojot System. Collections. Generic; izmantojot UnityEngine; publiskā klase ParticleSample: MonoBehaviour {private ParticleSystem ps; // Izmantojiet to inicializēšanai void Start () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. Spēlēt (); ienesīgums atdod jaunu WaitForSeconds (.1f); main.simulationSpeed =.05f; }}
Tagad velciet šo skriptu uz katru savu daļiņu sistēmas spēles objektu.
5. solis: izveidojiet portālu

Tagad mums ir jāizveido portāls, tāpēc ar peles labo pogu noklikšķiniet uz portāla spēles objekta un izveidojiet četrstūri. Mērogojiet četrstūri, lai tas aptvertu visu portālu, tas kļūs par mūsu portāla logu. Pirmā lieta, kas mums jāpievieno, ir portāla ēnotājs, tas tikai padarīs objektus ar citu konkrētu ēnotāju. Ar peles labo pogu noklikšķiniet uz aktīvu mapes un izveidojiet jaunu neapgaismotu ēnotāju. Noņemiet visu tur esošo un ielīmējiet šo kodu:
Shader "Portāls/portālsLogs"
{SubShader {Zwrite off Colormask 0 cull off Trafarets {Ref 1 Pass aizstāt} Pass {}}}
Ar peles labo pogu noklikšķiniet uz hierarhijas un izveidojiet jaunu materiālu, nosauciet to par PortalWindowMat, šī materiāla nolaižamajā izvēlnē atrodiet portāla sadaļu un izvēlieties portāla logu. Velciet šo materiālu uz savu portāla četrstūri.
6. darbība: daļiņu ēnotāji

Vēlreiz ar peles labo pogu noklikšķiniet uz aktīvu mapes un izveidojiet jaunu ēnotāju. Mums ir jāveido ēnotāji daļiņām, kas nonāk portālā. Aizstājiet visu kodu ar šo:
Shader "Portāls/daļiņas" {
Rekvizīti {_TintColor ("Tint Color", Color) = (0,5, 0,5, 0,5, 0,5) _MainTex ("Particle Texture", 2D) = "white" {} _InvFade ("Soft Particles Factor", diapazons (0,01, 3,0)) = 1.0 _Stencil ("trafarets", int) = 6} Kategorija {Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"} Blend SrcAlpha OneMinusSrcAlpha ColorMask RGB Cull Off Lighting Off ZWrite Off SubShader {Trafarets {Ref 1 Comp [_Stencil]} Iziet {CGPROGRAM #pragma vertex vert #pragma fragment fragment #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCG.cinc fiksēts4 _TintColor; structure appdata_t {float4 virsotne: POSITION; fiksēta4 krāsa: KRĀSA; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; structure v2f {float4 virsotne: SV_POSITION; fiksēta4 krāsa: KRĀSA; 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); atgriezties o; } UNITY_DECLARE_DEPTH_TEXTURE (_CameraDepthTexture); pludiņš _InvFade; fiksēts4 fragments (v2f i): SV_Target {#ifdef SOFTPARTICLES_ON float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ (_CameraDepthTexture, UNITY_PROJ_COORD (i.projPos)))); pludiņa partZ = i.projPos.z; pludiņš izbalināt = piesātināt (_InvFade * (ainaZ-partZ)); i.color.a *= izbalināt; #endif fix4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, kol.); atgriešanās col; } ENDCG}}}}
Izveidojiet divus jaunus materiālus, vienu ar nosaukumu portalSmoke, bet otru - portalParticles.
Katram izvēlieties šo ēnotāju no nolaižamā saraksta, portālos, daļiņās. Dūmu daļiņām izvēlieties dūmu tekstūru, bet daļiņām - daļiņu faktūru. Mainiet dūmu krāsu uz tumšāku zilu ar aptuveni 50% caurspīdīgumu. Dodieties uz katras daļiņu sistēmas renderētāja komponentu savā portālā un izvēlieties attiecīgos materiālus, kurus mēs tikko izveidojām.
7. darbība: izveidojiet Skybox

Tagad, lai patiešām radītu otrādi vērstu izskatu, mums viss ir jākrāso tumši zilā krāsā. Šim nolūkam mēs izmantosim caurspīdīgu skybox, tāpēc izveidojiet jaunu ēnotāju un ielīmējiet šo kodu:
Shader "Portāls/portalSkybox" {
Rekvizīti {_Tint ("Tint Color", Color) = (.5,.5,.5,.5) [Gamma] _Exposure ("Exposure", Range (0, 8)) = 1,0 _Rotation ("Rotation", Diapazons (0, 360)) = 0 [NoScaleOffset] _Tex ("Cubemap (HDR)", Cube) = "pelēks" {} _Stencil ("StencilNum", int) = 6} SubShader {Tags {"Queue" = "Background" "RenderType" = "Background" "PreviewType" = "Skybox"} Izslēgt ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Trafarets {Ref 1 Comp [_Stencil]} Iziet {CGPROGRAM #pragma vertex vert #pragma fragments frag #pragma target 2.0 #include "UnC.cginc "samplerCUBE _Tex; puse4 _Tex_HDR; half4 _Tint; puse _Exposure; pludiņš _Rotācija; float3 RotateAroundYInDegrees (pludiņš3 virsotne, peldošie grādi) {pludiņš alfa = grādi * UNITY_PI / 180.0; pludiņš sina, cosa; sinkos (alfa, sina, cosa); float2x2 m = float2x2 (cosa, -sina, sina, cosa); atgriešanās pludiņš3 (mul (m, virsotne.xz), virsotne.y).xzy; } structure appdata_t {float4 virsotne: POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID}; structure v2f {float4 virsotne: 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 pagriezts = RotateAroundYInDegrees (v.vertex, _Rotation); o.vertex = UnityObjectToClipPos (pagriezts); o.texcoord = v.vertex.xyz; atgriezties o; } fiksēts4 fragments (v2f i): SV_Target {half4 tex = texCUBE (_Tex, i.texcoord); puse3 c = dekodētHDR (tex, _Tex_HDR); c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb; c *= _ ekspozīcija; atgriešanās puse4 (c,.5); } ENDCG}} Fallback Off}
Tagad izveidojiet jaunu skybox materiālu, nosauciet to par "PortalSkybox" un izvēlieties šo portalSkybox shader no portāla izvēlnes. Augšpusē dodieties uz logu, apgaismojums un izvēlieties šo tikko izveidoto skybox. Dodieties uz galveno kameru un iestatiet skaidrus karodziņus uz skybox. Kamēr mēs esam šeit, mēs varam pievienot kamerai dažus komponentus, lai mēs varētu noteikt sadursmes. Pievienojiet kamerai cietā korpusa komponentu un noņemiet atzīmi no izvēles smaguma. Pievienojiet kastes sadursmi un pārbaudiet, vai ir sprūda. Padariet kastes sadursmes izmērus.5 x 1 x 4. Iestatiet kameras griešanas plakni uz.01.
8. solis: portāla loģika

Pēdējā lieta, kas mums jādara, ir izveidot loģiku, kas kontrolē mūsu portālu. Izveidojiet jaunu C# skriptu un nosauciet to par PortalController.
izmantojot System. Collections;
izmantojot System. Collections. Generic; izmantojot UnityEngine; vārdtelpa UnityEngine. XR.iOS {publiskās klases PortalController: MonoBehaviour {public Material materiāli; publiskais MeshRenderer meshRenderer; publiskais UnityARVideo UnityARVideo; privāts bool isInside = false; private bool isOutside = true; // Izmantojiet to inicializēšanai 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 = taisnība; InsidePortal (); }} else {if (isInside) {isInside = false; isOutside = true; OutsidePortal (); }}} void OutsidePortal () {StartCoroutine (DelayChangeMat (3)); } void InsidePortal () {StartCoroutine (DelayChangeMat (6)); } IEnumerator DelayChangeMat (int stencilNum) {UnityARVideo.shouldRender = false; ienesīgums atgriežas jauns WaitForEndOfFrame (); meshRenderer.enabled = false; foreach (Materiāla paklājs materiālos) {mat. SetInt ("_Stencil", trafaretsNum); } ienesīgums atdod jaunu WaitForEndOfFrame (); meshRenderer.enabled = true; UnityARVideo.shouldRender = true; }}}
Velciet šo jauno skriptu uz portāla logu. Tas mūs pārvietos portālā un no tā, kad mūsu kameras sadursme sadursies ar portāla logu. Tagad funkcijā, kas maina visus materiālus, mēs sakām, ka spraudnis ARkit neatveido rāmi, tāpēc dodieties uz galveno kameru un atveriet UnityARVideo skriptu. Augšpusē izveidojiet publisku bool shouldRender un iestatiet to kā patiesu. Funkcijā OnPreRender () visu iesaiņojiet paziņojumā if, kur viss iekšpusē darbosies tikai tad, ja vajadzētu būt patiesam. Visam skriptam vajadzētu izskatīties šādi:
izmantojot sistēmu;
izmantojot System. Runtime. InteropServices; izmantojot UnityEngine; izmantojot UnityEngine. Rendering; nosaukumvieta UnityEngine. XR.iOS {public class UnityARVideo: MonoBehaviour {public Material m_ClearMaterial; [HideInInspector] public bool shouldRender = true; privāts CommandBuffer m_VideoCommandBuffer; privāta Texture2D _videoTextureY; privāta Texture2D _videoTextureCbCr; privāts Matrix4x4 _displayTransform; privāts bool bCommandBufferInitialized; public void Start () {UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = nepatiess; } 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 = jauns CommandBuffer (); m_VideoCommandBuffer. Blit (null, BuiltinRenderTextureType. CurrentActive, m_ClearMaterial); GetComponent (). AddCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); bCommandBufferInitialized = patiess; } void OnDestroy () {GetComponent (). RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent -= UpdateFrame; bCommandBufferInitialized = nepatiess; } #if! UNITY_EDITOR public void OnPreRender () {if (shouldRender) {ARTextureHandles rokturi = UnityARSessionNativeInterface. GetARSessionNativeInterface (). GetARVideoTextureHandles (); if (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) {return; } if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } Izšķirtspēja currentResolution = Screen.currentResolution; // Texture Y if (_videoTextureY == null) {_videoTextureY = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. R8, false, false, (System. IntPtr) rokturi.textureY); _videoTextureY.filterMode = FilterMode. Bilinear; _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) handlesCtecC; teksts; _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 (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); } #endif}}
9. solis: gandrīz pabeigts

Visbeidzot, noklikšķinot uz ekrāna un ievietojot portālu, mēs vēlamies, lai tas vienmēr būtu vērsts pret mums. Lai to izdarītu, dodieties uz portāla skriptu "UnityARHitTestExample". Aizstājiet visu iekšpusē ar šo:
izmantojot sistēmu;
izmantojot System. Collections. Generic; nosaukumvieta UnityEngine. XR.iOS {public class UnityARHitTestExample: MonoBehaviour {public Transform m_HitTransform; publiskais pludiņš maxRayDistance = 30.0f; public LayerMask collisionLayer = 1 <0) {foreach (var hitResult in hitResults) {Debug. Log ("Got hit!"); 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 = pārveidot.eulerAngles; transform. LookAt (Camera.main.transform); transform.eulerAngles = jauns Vector3 (currAngle.x, transform.eulerAngles.y, currAngle.z); atgriezties patiesi; }} atgriezt nepatiesu; } // Atjauninājums tiek izsaukts vienu reizi kadrā void Update () {#if UNITY_EDITOR // mēs izmantosim šo skriptu tikai redaktora pusē, lai gan nekas neliedz tam darboties ierīcē, ja (Input. GetMouseButtonDown (0)) {Ray ray = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit hit; // mēs mēģināsim trāpīt vienam no lidmašīnas sadursmes spēles objektiem, ko ģenerēja spraudnis // faktiski līdzīgs izsaukumam HitTest ar ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent if (Physics. Raycast (ray, out hit, maxRayDistance, collisionLayer)) {// mēs iegūsim pozīciju no kontaktpunkta 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)); // un rotācija no plaknes sadursmes pārveidotāja m_HitTransform.rotation = hit.transform.rotation; }} #else if (Input.touchCount> 0 && m_HitTransform! = null) {var touch = Input. GetTouch (0); ja (touch.phase == TouchPhase. Began || touch.phase == TouchPhase. Moved) {var screenPosition = Camera.main. ScreenToViewportPoint (touch.position); ARPoint punkts = jauns ARPoint {x = screenPosition.x, y = screenPosition.y}; // Izvirzīt reults veidi ARHitTestResultType resultTypes = {ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent, // ja jūs vēlaties izmantot bezgalīgs lidmašīnas izmanto šo: //ARHitTestResultType. ARHitTestResultTypeExistingPlane, ARHitTestResultType. ARHitTestResultTypeHorizontalPlane, ARHitTestResultType. ARHitTestResultTypeFeaturePoint}; foreach (ARHitTestResultType resultType in resultTypes) {if (HitTestWithResultType (point, resultType)) {return; }}}} #endif}}}
10. solis: ievietojiet lietotni savā tālrunī

Beidzot esam pabeiguši. Dodieties uz failu, izveidojiet iestatījumus un noklikšķiniet uz veidot. Atveriet Xcode un izvēlieties mapi, kas tika izveidota no būvējuma. Izvēlieties savu izstrādes komandu un ievietojiet lietotni savā tālrunī! Iespējams, vēlēsities mainīt daļiņu un skybox krāsu, lai atbilstu jūsu vajadzībām. Paziņojiet man komentāros, ja jums ir kādi jautājumi un paldies, ka meklējāt!
Ieteicams:
Portāls: 23 soļi

Portāls: Materiāli: NeoPixel spole (60) Arduino UNO1/4 " akrila stieņi (~ 18 ') 1 3 mm biezs 12 " x 12 " akrila loksne1 barošanas poga (fiksējoša) 1 īslaicīga poga1 mikrofons1 2 " x 6 " x 2 collu koka vadi
Šovasar mazuļa vēsuma uzturēšana - mēmo ventilatoru kontrole ar gudrām lietām!: 6 soļi (ar attēliem)

Uzturot savu mazuli vēsu šovasar - mēmo ventilatoru kontrole ar gudrām lietām !: Jau pirms divām nedēļām šī raksta rakstīšanas laikā es kļuvu par tēti neticamam zēnam! Mainoties gadalaikam, dienām kļūstot garākām un temperatūrai kļūstot siltākai, es domāju, ka būtu labi, ja naktī būtu kāds monitors
ESP32 notveršanas portāls statisko un DHCP IP iestatījumu konfigurēšanai: 8 soļi

ESP32 notveršanas portāls statisko un DHCP IP iestatījumu konfigurēšanai: ESP 32 ir ierīce ar integrētu WiFi un BLE. Tas ir sava veida svētība IoT projektiem. Vienkārši norādiet savu SSID, paroli un IP konfigurāciju un integrējiet lietas mākonī. Bet IP iestatījumu un lietotāja akreditācijas datu pārvaldība var būt galva
2. portāls Wheatley skaļrunis !: 4 soļi

2. portāla Wheatley skaļrunis !: Jau daudzus gadus esmu bijis milzīgs portāla ventilators, un es beidzot nolēmu uzbūvēt skaļruni, kas veidots kā mans mīļākais varonis Vitlijs. Būtībā šis projekts ir 3D drukāts Wheatley, kas var turēt skaļruņus abās pusēs. Krāsojot, tas izskatās patiešām
Kā izveidot RC gaisa laivu! Ar 3D drukātajām detaļām un citām lietām: 5 soļi (ar attēliem)

Kā izveidot RC gaisa laivu! Ar 3D drukātajām detaļām un citām lietām: Gaisa laivas ir lieliskas, jo ar tām ir ļoti patīkami braukt, un tās darbojas arī uz dažāda veida virsmām, piemēram, ūdens, sniega, ledus, asfalta vai jebkura cita, ja motors ir pietiekami jaudīgs. nav ļoti sarežģīti, un, ja jums jau ir elektrons