Πύλη AR στο Upside Down From Stranger Things: 10 βήματα (με εικόνες)
Πύλη AR στο Upside Down From Stranger Things: 10 βήματα (με εικόνες)

Βίντεο: Πύλη AR στο Upside Down From Stranger Things: 10 βήματα (με εικόνες)

Βίντεο: Πύλη AR στο Upside Down From Stranger Things: 10 βήματα (με εικόνες)
Βίντεο: Я есть. Ты есть. Он есть_Рассказ_Слушать 2025, Ιανουάριος
Anonim
Πύλη AR στο Upside Down From Stranger Things
Πύλη AR στο Upside Down From Stranger Things
Πύλη AR στο Upside Down From Stranger Things
Πύλη AR στο Upside Down From Stranger Things

Αυτό το Instructable θα περάσει από τη δημιουργία μιας εφαρμογής επαυξημένης πραγματικότητας για κινητά για το iPhone με μια πύλη που οδηγεί στην ανάποδη από τα Stranger Things. Μπορείτε να μπείτε μέσα στην πύλη, να περπατήσετε και να επιστρέψετε. Όλα μέσα στην πύλη φαίνονται μόνο μέσω της πύλης μέχρι να μπείτε μέσα. Μόλις μπείτε μέσα, όλα θα γίνουν παντού, μέχρι να επιστρέψετε στον πραγματικό κόσμο. Θα χρησιμοποιήσουμε τη μηχανή βιντεοπαιχνιδιών Unity 3D με την προσθήκη Apple ARKit. Όλο το λογισμικό που θα χρησιμοποιήσουμε μπορεί να μεταφορτωθεί και να χρησιμοποιηθεί δωρεάν. Δεν χρειάζεται να είστε ειδικός για να ακολουθήσετε, θα περάσουμε από κάθε βήμα!

Βήμα 1: Ξεκινήστε ένα νέο έργο Unity

Ξεκινήστε ένα νέο έργο ενότητας
Ξεκινήστε ένα νέο έργο ενότητας

Αρχικά, κατεβάστε το Unity3D και βεβαιωθείτε ότι έχετε εγκαταστήσει τα αρχεία δημιουργίας για την πλατφόρμα IOS. Θα χρειαστεί επίσης να κάνετε λήψη του Xcode και να εγγραφείτε για έναν δωρεάν λογαριασμό προγραμματιστή της Apple. Το iPhone σας θα πρέπει επίσης να εκτελεί IOS 11 ή νεότερο. Από σήμερα 5 Φεβρουαρίου 2018, το IOS 11.3 είναι εκτός, αλλά ο xCode 9.2 δεν έχει ακόμη αρχεία υποστήριξης για αυτό. Έτσι, εάν εκτελείτε την πιο πρόσφατη έκδοση IOS, βεβαιωθείτε ότι έχετε κατεβάσει την πιο πρόσφατη έκδοση Xcode beta από την Apple. Developer.com.

Μόλις έχετε όλα τα απαραίτητα προγράμματα, ανοίξτε την Unity και ξεκινήστε ένα νέο έργο, ονομάστε το όπως θέλετε. Θα χρειαστούμε το Apple ARKit plugin, ώστε να μπορούμε να χρησιμοποιήσουμε την κάμερα του τηλεφώνου μας για να εντοπίσουμε το έδαφος και να τοποθετήσουμε αντικείμενα στο πάτωμα. Ας το εισαγάγουμε τώρα μεταβαίνοντας στην καρτέλα Asset Store και αναζητώντας "ARKit". Θα χρειαστεί να δημιουργήσετε έναν δωρεάν λογαριασμό Unity εάν δεν τον έχετε ήδη, στη συνέχεια κάντε κλικ στην εισαγωγή για να λάβετε το πρόσθετο.

Μεταβείτε στο φάκελο παραδειγμάτων στο φάκελο ARKit και βρείτε το "UnityARKitScene". Κάντε διπλό κλικ σε αυτό για να το ανοίξετε. Θα χρησιμοποιήσουμε αυτήν τη σκηνή ως αφετηρία και θα αναπτυχθούμε από εδώ. Αυτή η σκηνή από προεπιλογή θα σας επιτρέψει να ανιχνεύσετε το έδαφος και όταν αγγίζετε την οθόνη, ένας κύβος θα τοποθετηθεί σε αυτή τη θέση.

Ας πάρουμε πρώτα τις ρυθμίσεις κατασκευής μας στο τετράγωνο, ώστε να μην ξεχάσουμε να το κάνουμε αργότερα. Κάντε κλικ στο αρχείο, δημιουργήστε ρυθμίσεις και καταργήστε όλες τις σκηνές από αυτήν τη λίστα. Κάντε κλικ στην επιλογή προσθήκη ανοιχτών σκηνών για να προσθέσετε την τρέχουσα. Το τελευταίο πράγμα που πρέπει να ρυθμίσουμε εδώ είναι στις ρυθμίσεις του προγράμματος αναπαραγωγής να μεταβείτε στο αναγνωριστικό δέσμης και η μορφή αυτής της συμβολοσειράς είναι com. YourCompanyName. YourAppName, οπότε στην περίπτωσή μου κάνω κάτι σαν com. MatthewHallberg. PortalTest.

Βήμα 2: Ρύθμιση της σκηνής

Ρύθμιση της σκηνής
Ρύθμιση της σκηνής

Πρώτα ρίξτε μια ματιά προς τα αριστερά και βρείτε το αντικείμενο του παιχνιδιού που ονομάζεται "GeneratePlanes". Με τονισμένο αυτό, κοιτάξτε προς τα δεξιά τώρα και κάντε κλικ στο πλαίσιο ελέγχου για να το απενεργοποιήσετε. Με αυτόν τον τρόπο δεν έχουμε τα άσχημα μπλε τετράγωνα να δημιουργούνται όταν το ARKit ανιχνεύει ένα επίπεδο εδάφους. Στη συνέχεια διαγράψτε το αντικείμενο παιχνιδιού "RandomCube" επειδή δεν θέλουμε να το δούμε στη σκηνή μας.

Τώρα πρέπει πρώτα να δημιουργήσουμε την πόρτα της πύλης μας. Διαγράψτε τον κύβο που είναι παιδί του "HitCubeParent". Κάντε δεξί κλικ και επιλέξτε δημιουργία κενού αντικειμένου παιχνιδιού. Μετονομάστε το σε "Πύλη". Τώρα κάντε δεξί κλικ σε αυτό το αντικείμενο και δημιουργήστε έναν κύβο, αυτό θα το κάνει παιδί της πύλης. Μετονομάστε το σε "PostLeft" και αυτό θα είναι το αριστερό μήνυμα της πύλης μας. Κλιμακώστε το έτσι ώστε το x είναι 1 το y είναι 28 και το z είναι ένα. Κάντε το ίδιο πράγμα για τη σωστή ανάρτηση. Τώρα δημιουργήστε την κορυφαία ανάρτηση και κλιμακώστε το y στο 14. Γυρίστε το προς τα πλάγια και μετακινήστε το έτσι ώστε να συνδέει τις άλλες αναρτήσεις. Κάντε ολόκληρη την κλίμακα της πύλης 1,3 x 1,4 x 1.

Μεταβείτε στο google και πληκτρολογήστε υφή ξύλου ή φλοιού. Κατεβάστε μία από αυτές τις εικόνες και σύρετέ τη στο φάκελο στοιχείων σας στο Unity. Τώρα σύρετε αυτήν την εικόνα σε όλες τις αναρτήσεις της πύλης σας.

Κάντε ξανά κλικ στο αντικείμενο "Πύλη" και κάντε κλικ στην επιλογή προσθήκη στοιχείου στα δεξιά. Προσθέστε το σενάριο "UnityARHitTestExample" σε αυτό. Υπάρχει μια κενή υποδοχή για το "Hit Transform", σύρετε το αντικείμενο "HitCubeParent" σε αυτήν την υποδοχή.

Βήμα 3: Ας φτιάξουμε μερικά σωματίδια

Ας κάνουμε μερικά σωματίδια
Ας κάνουμε μερικά σωματίδια

Τώρα θα χρησιμοποιήσουμε το σύστημα Unity Particle για να δημιουργήσουμε εφέ καπνού και αιωρούμενων σωματιδίων για την εσωτερική πύλη μας. Μεταβείτε στην επιλογή Στοιχεία στην επάνω γραμμή μενού, τυπικά στοιχεία και εισαγάγετε συστήματα σωματιδίων.

Δημιουργήστε δύο κενά αντικείμενα παιχνιδιού μέσα στην πύλη σας και ονομάστε το ένα "SmokeParticles" και το άλλο "FloatingParticles".

Προσθέστε ένα συστατικό συστήματος σωματιδίων στα σωματίδια καπνού.

Αυτό το στοιχείο έχει πολλές επιλογές, αλλά πρέπει να αλλάξουμε μόνο ένα ζευγάρι.

Αλλάξτε το χρώμα εκκίνησης σε κάτι σκούρο μπλε με περίπου 50% διαφάνεια. Κάντε το ποσοστό εκπομπών 100. Στο εσωτερικό σχήμα, κάντε την ακτίνα.01. Στο τμήμα renderer στο κάτω μέρος αλλάξτε το ελάχιστο μέγεθος σε 0,8 και το μέγιστο σε 5. Στο συστατικό του υλικού απλώς επιλέξτε το υλικό καπνού από τη λίστα, αλλά θα το αλλάξουμε αργότερα.

Προσθέστε ένα σύστημα σωματιδίων στο αντικείμενο παιχνιδιού αιωρούμενων σωματιδίων και ορίστε την εκπομπή σε 500. Ορίστε τη διάρκεια έναρξης σε 2, ακτίνα σε 10, ελάχιστο μέγεθος σωματιδίων σε 0,01 και μέγιστο μέγεθος σωματιδίων σε 0,015. Ρυθμίστε το υλικό στο προεπιλεγμένο σωματίδιο προς το παρόν.

Τέλος, πάρτε και τα δύο αντικείμενα παιχνιδιού και περιστρέψτε τα κατά 90 μοίρες στο x και σηκώστε τα στον αέρα έτσι ώστε να εκπέμπουν προς τα κάτω στην πόρτα της πύλης.

Βήμα 4: Επιβράδυνση των σωματιδίων

Επιβράδυνση των σωματιδίων
Επιβράδυνση των σωματιδίων

Δεδομένου ότι θέλουμε αυτά τα σωματίδια να καλύπτουν μια μεγάλη περιοχή αλλά και να κινούνται αργά πρέπει να δημιουργήσουμε τη δική μας συνάρτηση δείγματος. Κάντε δεξί κλικ στο φάκελο ενεργητικών και δημιουργήστε ένα νέο σενάριο C# και ονομάστε το "ParticleSample". Αντιγράψτε και επικολλήστε σε αυτόν τον κωδικό:

χρησιμοποιώντας System. Collections;

χρησιμοποιώντας System. Collections. Generic; χρησιμοποιώντας το UnityEngine. δημόσια τάξη ParticleSample: MonoBehaviour {private ParticleSystem ps; // Χρησιμοποιήστε αυτό για αρχικοποίηση κενό Έναρξη () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. Play (); απόδοση απόδοσης νέο WaitForSeconds (.1f). main.simulationSpeed =.05f; }}

Τώρα σύρετε αυτό το σενάριο σε καθένα από τα αντικείμενα παιχνιδιού σωματιδιακού συστήματος.

Βήμα 5: Δημιουργία της Πύλης

Δημιουργία της Πύλης!
Δημιουργία της Πύλης!

Τώρα πρέπει να δημιουργήσουμε την πύλη, οπότε κάντε δεξί κλικ στο αντικείμενο του παιχνιδιού πύλης και δημιουργήστε ένα τετράγωνο. Κλιμακώστε το τετράγωνο έτσι ώστε να καλύπτει ολόκληρη την πύλη, αυτό θα γίνει το παράθυρο της πύλης μας. Το πρώτο πράγμα που πρέπει να προσθέσουμε είναι το shader της πύλης, αυτό θα αποδώσει μόνο αντικείμενα με άλλο συγκεκριμένο shader πάνω τους. Κάντε δεξί κλικ στο φάκελο στοιχείων και δημιουργήστε ένα νέο μη φωτισμένο shader. Αφαιρέστε τα πάντα εκεί και επικολλήστε αυτόν τον κώδικα:

Shader "Portal/portalWindow"

{SubShader {Zwrite off Colormask 0 cull off Stencil {Ref 1 Pass αντικατάσταση} Pass {}}}

Κάντε δεξί κλικ στην ιεραρχία και δημιουργήστε ένα νέο υλικό, ονομάστε το PortalWindowMat, στο αναπτυσσόμενο μενού για αυτό το υλικό βρείτε την ενότητα πύλης και επιλέξτε παράθυρο πύλης. Σύρετε αυτό το υλικό στο τετράγωνο της πύλης σας.

Βήμα 6: Shader Shader

Σκιάσεις σωματιδίων
Σκιάσεις σωματιδίων

Κάντε ξανά δεξί κλικ στο φάκελο ενεργητικού και δημιουργήστε ένα νέο shader. Πρέπει να φτιάξουμε τα σκίαση για τα σωματίδια που μπαίνουν μέσα στην πύλη. Αντικαταστήστε όλο τον κώδικα με αυτό:

Shader "Portal/Particles" {

Ιδιότητες {_TintColor ("Tint Color", Color) = (0.5, 0.5, 0.5, 0.5) _MainTex ("Particle Texture", 2D) = "white" {} _InvFade ("Soft Particles Factor", Range (0.01, 3.0)) = 1.0 _Stencil ("stencil", int) = 6} Κατηγορία {Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"} Blend SrcAlpha OneMinusSrcAlpha ColorMask RGB Cull Off Lighting Off ZWrite Off SubShader {Stencil {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog fixed4 _TintColor; struct appdata_t {float4 vertex: POSITION; σταθερό4 χρώμα: ΧΡΩΜΑ? float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; struct v2f {float4 vertex: SV_POSITION; σταθερό4 χρώμα: ΧΡΩΜΑ? 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.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); επιστροφή o? } UNITY_DECLARE_DEPTH_TEXTURE (_CameraDepthTexture); float _InvFade; fixed4 frag (v2f i): SV_Target {#ifdef SOFTPARTICLES_ON float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ (_CameraDepthTexture, UNITY_PROJ_COORD (i.projPos))); float partZ = i.projPos.z; float fade = κορεσμός (_InvFade * (σκηνήZ-partZ)); i.color.a *= ξεθώριασμα; #endif fixed4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, col); επιστροφή κολ. } ENDCG}}}}

Δημιουργήστε δύο νέα υλικά, ένα που ονομάζεται portalSmoke και ένα που ονομάζεται portalParticles.

Για καθένα επιλέξτε αυτό το σκίαστρο, από το αναπτυσσόμενο μενού, σε πύλες, σωματίδια. Για τα σωματίδια καπνού επιλέξτε μια υφή καπνού και για τα σωματίδια επιλέξτε την υφή των σωματιδίων. Αλλάξτε το χρώμα του καπνού σε πιο σκούρο μπλε με διαφάνεια περίπου 50%. Μεταβείτε στο στοιχείο απόδοσης κάθε συστήματος σωματιδίων στην πύλη σας και επιλέξτε τα αντίστοιχα υλικά που μόλις δημιουργήσαμε.

Βήμα 7: Δημιουργήστε το Skybox

Δημιουργήστε το Skybox
Δημιουργήστε το Skybox

Τώρα για να δημιουργήσουμε πραγματικά το ανάποδο είδος εμφάνισης πρέπει να χρωματίσουμε τα πάντα σκούρο μπλε. Για αυτό θα χρησιμοποιήσουμε ένα διαφανές skybox, οπότε δημιουργήστε ένα νέο shader και επικολλήστε σε αυτόν τον κώδικα:

Shader "Portal/portalSkybox" {

Ιδιότητες {_Tint ("Tint Color", Color) = (.5,.5,.5,.5) [Gamma] _Exposure ("Exposure", Range (0, 8)) = 1.0 _Rotation ("Rotation", Range (0, 360)) = 0 [NoScaleOffset] _Tex ("Cubemap (HDR)", Cube) = "gray" {} _Stencil ("StencilNum", int) = 6} SubShader {Tags {"Queue" = "Background" "RenderType" = "Ιστορικό" "PreviewType" = "Skybox"} Cull Off ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Stencil {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target Unity #pragma Unity 2.0 #include.cginc "samplerCUBE _Tex; half4 _Tex_HDR; half4 _Χρώμα? μισή _Εκθεση? float _ Περιστροφή? float3 RotateAroundYInDegrees (κορυφή float3, βαθμοί float) {float alpha = μοίρες * UNITY_PI / 180.0; float sina, cosa? sincos (άλφα, σίνα, κόσα)? float2x2 m = float2x2 (cosa, -sina, sina, cosa); επιστροφή float3 (mul (m, vertex.xz), vertex.y).xzy; } struct appdata_t {float4 vertex: POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID}; struct v2f {κορυφή float4: 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 (ο); float3 περιστρεφόταν = RotateAroundYInDegrees (v.vertex, _Rotation); o.vertex = UnityObjectToClipPos (περιστρεφόμενο); o.texcoord = v.vertex.xyz; επιστροφή o? } fixed4 frag (v2f i): SV_Target {half4 tex = texCUBE (_Tex, i.texcoord); half3 c = Αποκωδικοποίηση HDR (tex, _Tex_HDR); c = c * _Tint.rgb * unit_ColorSpaceDouble.rgb; c *= _Έκθεση; επιστροφή μισό4 (γ,.5); } ENDCG}} Offback Off}

Τώρα δημιουργήστε ένα νέο υλικό skybox, ονομάστε το "PortalSkybox" και επιλέξτε αυτό το shader portalSkybox από το μενού της πύλης. Μεταβείτε στο παράθυρο, φωτισμός, στο επάνω μέρος και επιλέξτε αυτό το skybox που μόλις δημιουργήσαμε. Μεταβείτε στην κύρια κάμερα και ορίστε καθαρές σημαίες στο skybox. Ενώ είμαστε εδώ, ας προσθέσουμε μερικά στοιχεία στην κάμερά μας, ώστε να μπορούμε να εντοπίσουμε συγκρούσεις. Προσθέστε ένα στοιχείο άκαμπτου σώματος στην κάμερα και καταργήστε την επιλογή χρήσης βαρύτητας. Προσθέστε ένα κουτί σύγκρουσης και ελέγξτε αν είναι ενεργοποιητής. Κάντε το μέγεθος του κουτιού συγκρούσεις.5 x 1 x 4. Ρυθμίστε το επίπεδο αποκοπής στην κάμερα σε.01.

Βήμα 8: Λογική πύλης

Λογική Πύλης
Λογική Πύλης

Το τελευταίο πράγμα που πρέπει να κάνουμε είναι να δημιουργήσουμε τη λογική που ελέγχει την πύλη μας. Δημιουργήστε ένα νέο σενάριο C# και ονομάστε το PortalController.

χρησιμοποιώντας System. Collections;

χρησιμοποιώντας System. Collections. Generic; χρησιμοποιώντας το UnityEngine. namespace UnityEngine. XR.iOS {public class PortalController: MonoBehaviour {public Material υλικά; δημόσιο MeshRenderer meshRenderer; δημόσια UnityARVideo UnityARVideo; private bool isInside = false; private bool isOutside = true? // Χρησιμοποιήστε αυτό για αρχικοποίηση 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 = true? 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; απόδοση απόδοσης νέο WaitForEndOfFrame (); meshRenderer.enabled = false; foreach (Στρώμα υλικού σε υλικά) {mat. SetInt ("_Stencil", stencilNum); } απόδοση απόδοσης νέο WaitForEndOfFrame (); meshRenderer.enabled = true; UnityARVideo.shouldRender = true; }}}

Σύρετε αυτό το νέο σενάριο στο παράθυρο της πύλης σας. Αυτό θα μας μεταφέρει μέσα και έξω από την πύλη κάθε φορά που ο συγκρούτης της κάμεράς μας συγκρούεται με το παράθυρο της πύλης. Τώρα στη συνάρτηση που αλλάζει όλα τα υλικά λέμε στο πρόσθετο ARkit να μην αποδίδει το πλαίσιο, οπότε μεταβείτε στην κύρια κάμερα και ανοίξτε το σενάριο UnityARVideo. Δημιουργήστε ένα δημόσιο bool shouldRender στην κορυφή και ορίστε το ίσο με true. Κάτω στη συνάρτηση OnPreRender () τυλίξτε τα πάντα σε μια δήλωση if όπου όλα μέσα θα εκτελούνται μόνο εάν το shouldRender είναι αληθές. Ολόκληρο το σενάριο θα πρέπει να μοιάζει με αυτό:

χρήση συστήματος ·

χρησιμοποιώντας System. Runtime. InteropServices, χρησιμοποιώντας το UnityEngine. χρησιμοποιώντας UnityEngine. Rendering; namespace UnityEngine. XR.iOS {public class UnityARVideo: MonoBehaviour {public Material m_ClearMaterial; [HideInInspector] public bool shouldRender = true; ιδιωτικό CommandBuffer m_VideoCommandBuffer; ιδιωτικό Texture2D _videoTextureY; ιδιωτικό Texture2D _videoTextureCbCr; ιδιωτικό Matrix4x4 _displayTransform; ιδιωτικό bool bCommandBufferInitialized; public void Start () {UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = false; } void UpdateFrame (UnityARCamera cam) {_displayTransform = νέο 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 = νέο CommandBuffer (); m_VideoCommandBuffer. Blit (null, BuiltinRenderTextureType. CurrentActive, m_ClearMaterial); GetComponent (). AddCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); bCommandBufferInitialized = true; } void OnDestroy () {GetComponent (). RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent -= UpdateFrame; bCommandBufferInitialized = false; } #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 (); } Ανάλυση currentResolution = Screen.currentResolution; // Υφή Y εάν (_videoTextureY == null) {_videoTextureY = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. R8, false, false, (System. IntPtr) handles.textureY); _videoTextureY.filterMode = FilterMode. Bilinear; _videoTextureY.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ υφήY", _videoTextureY); } // Texture CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. IntPtrr); _videoTextureCbCr.filterMode = FilterMode. Bilinear; _videoTextureCbCr.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ TextCbCr", _videoTextureCbCr); } _videoTextureY. UpdateExternalTexture (handles.textureY); _videoTextureCbCr. UpdateExternalTexture (handles.textureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); }} #else public void SetYTexure (Texture2D YTex) {_videoTextureY = YTex; } δημόσιο κενό SetUVTexure (Texture2D UVTex) {_videoTextureCbCr = UVTex; } public void OnPreRender () {if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture ("_ TextY", _videoTextureY); m_ClearMaterial. SetTexture ("_ TextCbCr", _videoTextureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); } #τέλος εαν } }

Βήμα 9: Σχεδόν Έγινε

Σχεδόν τελείωσα!
Σχεδόν τελείωσα!

Τέλος όταν κάνουμε κλικ στην οθόνη και τοποθετήσουμε την πύλη θέλουμε να είναι πάντα απέναντί μας. Για να το κάνετε αυτό, μεταβείτε στο σενάριο "UnityARHitTestExample" στην πύλη. Αντικαταστήστε τα πάντα μέσα με αυτό:

χρήση συστήματος ·

χρησιμοποιώντας System. Collections. Generic; namespace UnityEngine. XR.iOS {public class UnityARHitTestExample: MonoBehaviour {public Transform m_HitTransform; public float 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 = transform.eulerAngles; transform. LookAt (Camera.main.transform); transform.eulerAngles = νέο Vector3 (currAngle.x, transform.eulerAngles.y, currAngle.z); επιστροφή αληθινός? }} return false? } // Η ενημέρωση καλείται μία φορά ανά πλαίσιο void Update () {#if UNITY_EDITOR // θα χρησιμοποιήσουμε αυτό το σενάριο μόνο από την πλευρά του επεξεργαστή, αν και δεν υπάρχει τίποτα που να το εμποδίζει να λειτουργεί στη συσκευή εάν (Input. GetMouseButtonDown (0)) {Ray ray = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit χτύπησε? // θα προσπαθήσουμε να χτυπήσουμε ένα από τα αντικείμενα σύγκρουσης αεροπλάνων που δημιουργήθηκαν από το πρόσθετο // αποτελεσματικά παρόμοια με την κλήση HitTest με ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent if (Physics. Raycast (ray, out hit, maxRayDistance, collisionLayer)) {// θα πάρουμε τη θέση από το σημείο επαφής 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)); // και η περιστροφή από τον μετασχηματισμό του επιπέδου σύγκρουσης 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 point = νέο ARPoint {x = screenPosition.x, y = screenPosition.y}; // Προτεραιότητα reults τύπους ARHitTestResultType resultTypes = {ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent, // αν θέλετε να χρησιμοποιήσετε το άπειρο αεροπλάνα χρησιμοποιούν αυτό: //ARHitTestResultType. ARHitTestResultTypeExistingPlane, ARHitTestResultType. ARHitTestResultTypeHorizontalPlane, ARHitTestResultType. ARHitTestResultTypeFeaturePoint}? foreach (ARHitTestResultType resultType in resultTypes) {if (HitTestWithResultType (point, resultType)) {return; } } } } #τέλος εαν } } }

Βήμα 10: Βάλτε την εφαρμογή στο τηλέφωνό σας

Βάλτε την εφαρμογή στο τηλέφωνό σας!
Βάλτε την εφαρμογή στο τηλέφωνό σας!

Τελικά τελειώσαμε. Μεταβείτε στο αρχείο, δημιουργήστε τις ρυθμίσεις και κάντε κλικ στο build. Ανοίξτε το Xcode και επιλέξτε το φάκελο που δημιουργήθηκε από την κατασκευή. Επιλέξτε την ομάδα ανάπτυξης και τοποθετήστε την εφαρμογή στο τηλέφωνό σας! Μπορεί να θέλετε να αλλάξετε τα χρώματα των σωματιδίων και του skybox για να ταιριάξετε στις ανάγκες σας. Ενημερώστε με στα σχόλια εάν έχετε οποιεσδήποτε ερωτήσεις και ευχαριστώ για την αναζήτηση!