פורטל AR הפוך מדברים זרים: 10 שלבים (עם תמונות)
פורטל AR הפוך מדברים זרים: 10 שלבים (עם תמונות)

וִידֵאוֹ: פורטל AR הפוך מדברים זרים: 10 שלבים (עם תמונות)

וִידֵאוֹ: פורטל AR הפוך מדברים זרים: 10 שלבים (עם תמונות)
וִידֵאוֹ: The Ten Commandments | Dwight L Moody | Free Christian Audiobook 2025, יָנוּאָר
Anonim
פורטל AR אל הפוך מדברים זרים
פורטל AR אל הפוך מדברים זרים
פורטל AR אל הפוך מדברים זרים
פורטל AR אל הפוך מדברים זרים

מדריך זה יעבור על יצירת אפליקציית מובייל למציאות רבודה לאייפון עם פורטל המוביל להיפך מהדברים הזרים. אתה יכול להיכנס לפורטל, להסתובב ולחזור החוצה. הכל בתוך הפורטל ניתן לראות רק דרך הפורטל עד שנכנסים פנימה. כשהוא בפנים, הכל יתאפשר בכל מקום, עד שתחזור אל העולם האמיתי. נשתמש במנוע משחקי הווידאו 3D של Unity עם התוסף של Apple ARKit. ניתן להוריד את כל התוכנות בהן נשתמש ולהשתמש בהן בחינם. אינך צריך להיות מומחה בכדי לעקוב, אנו נעבור על כל שלב!

שלב 1: התחל פרויקט אחדות חדשה

התחל פרויקט אחדות חדשה
התחל פרויקט אחדות חדשה

ראשית, הורד את Unity3D וודא להתקין את קבצי הבנייה לפלטפורמת IOS. יהיה עליך גם להוריד את Xcode ולהירשם לחשבון מפתח של אפל בחינם. האייפון שלך יצטרך להריץ IOS 11 ומעלה. החל מהיום ה -5 בפברואר 2018, IOS 11.3 יוצא אך ל- xCode 9.2 עדיין אין קבצי תמיכה עבורו. אז אם אתה מפעיל את גרסת IOS העדכנית ביותר, הקפד להוריד את גרסת הבטא העדכנית ביותר של Xcode מ- Apple. Developer.com.

לאחר שיש לך את כל התוכניות הדרושות, פתח את אחדות והתחל בפרויקט חדש, קרא לזה איך שאתה רוצה. אנו נזדקק לתוסף Apple ARKit כדי שנוכל להשתמש במצלמת הטלפון שלנו כדי לזהות את הקרקע ולמקום חפצים על הרצפה. בואו לייבא זאת כעת על ידי מעבר ללשונית חנות הנכסים וחפש "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.

עבור אל גוגל והקלד במרקם עץ או קליפת עץ. הורד אחת מהתמונות האלה וגרור אותה לתיקיית הנכסים שלך ב- Unity. עכשיו גרור את התמונה הזו לכל הודעות הפורטל שלך.

לחץ שוב על האובייקט "פורטל" ולחץ על הוסף רכיב מימין. הוסף אליו את הסקריפט "UnityARHitTestExample". יש שם חריץ ריק עבור "Hit Transform", גרור את האובייקט "HitCubeParent" לתוך אותה חריץ.

שלב 3: בואו להכין חלקיקים

בואו להכין חלקיקים
בואו להכין חלקיקים

כעת אנו הולכים להשתמש במערכת החלקיקים של אחדות כדי ליצור אפקט עשן וחלקיקים צפים בתוך הפורטל שלנו. עבור אל נכסים בשורת התפריטים העליונה, נכסים סטנדרטיים ומערכות חלקיקי יבוא.

צור שני אובייקטים משחקיים ריקים בתוך הפורטל שלך וקרא לאחד "SmokeParticles" והשני "FloatingParticles".

הוסף רכיב מערכת חלקיקים לחלקיקי העשן.

לרכיב זה יש המון אפשרויות אבל אנחנו רק צריכים לשנות זוג.

שנה את צבע ההתחלה למשהו כחול כהה עם כ -50% שקיפות. הפוך את קצב הפליטה 100. צורה פנימית, הפוך את הרדיוס.01. בחלק העיבוד בתחתית שנה גודל מינימלי ל-.8 וגודל מקסימלי ל- 5. על רכיב החומר פשוט בחר את חומר העשן מהרשימה, אך אנו הולכים לשנות זאת מאוחר יותר.

הוסף כעת מערכת חלקיקים לאובייקט המשחק של חלקיקים צפים והגדר את הפליטה ל -500. הגדר את חיי ההתחלה ל -2, רדיוס ל -10, גודל החלקיקים המינימלי ל -01, וגודל החלקיקים המרבי ל -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 "פורטל/פורטל ווינדו"

{SubShader {Zwrite off Colormask 0 cull off Stencil {Ref 1 Pass להחליף} Pass {}}}

לחץ באמצעות לחצן העכבר הימני בהיררכיה וצור חומר חדש, קרא לו PortalWindowMat, הנפתח עבור חומר זה מצא את קטע הפורטל ובחר חלון פורטל. גרור חומר זה לרבע הפורטל שלך.

שלב 6: שיידר חלקיקים

שיידר חלקיקים
שיידר חלקיקים

לחץ לחיצה ימנית שוב על תיקיית הנכסים וצור שיידר חדש. עלינו לייצר את החלקים עבור החלקיקים שנכנסים לפורטל. החלף את כל הקוד בזה:

שאדר "פורטל/חלקיקים" {

מאפיינים {_TintColor ("צבע גוון", צבע) = (0.5, 0.5, 0.5, 0.5) _MainTex ("מרקם חלקיקים", 2D) = "לבן" {} _InvFade ("גורם חלקיקים רכים", טווח (0.01, 3.0)) = 1.0 _Stencil ("סטנסיל", int) = 6} קטגוריה {תגים {"תור" = "שקוף" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"} Blend SrcAlpha OneMinusSrcAlpha ColorMask RGB ביטול התאורה כבוי 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 #include "UnityCG.cginc"; fixed4 _TintColor; struct appdata_t {קודקוד float4: POSITION; צבע fixed4: COLOR; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; struct v2f {קודקוד float4: SV_POSITION; צבע fixed4: COLOR; 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); להחזיר 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))); צף חלק Z = i.projPos.z; דהייה צפה = רוויה (_InvFade * (sceneZ-partZ)); i.color.a *= דהייה; #endif fixed4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, קול); לחזור קול; } ENDCG}}}}}

צור שני חומרים חדשים, אחד בשם portalSmoke, ואחד בשם portalParticles.

לכל אחד בחר את הצללית הזו, מהתפריט הנפתח, בפורטלים, חלקיקים. עבור חלקיקי העשן בחר מרקם עשן ולחלקיקים בחר את מרקם החלקיקים. שנה את צבע העשן לכחול כהה יותר עם כ -50% שקיפות. עבור אל רכיב העיבוד של כל מערכת חלקיקים בפורטל שלך ובחר את החומרים המתאימים שלהם שיצרנו זה עתה.

שלב 7: צור את ה- Skybox

צור את ה- Skybox
צור את ה- Skybox

עכשיו כדי באמת ליצור את סוג המראה הפוך עלינו לגוון הכל כחול כהה. לשם כך נשתמש ב- skybox שקוף אז צור שיידר חדש והדבק את הקוד הזה:

Shader "Portal/portalSkybox" {

מאפיינים {_Tint ("צבע גוון", צבע) = (.5,.5,.5,.5) [Gamma] _Exposure ("חשיפה", טווח (0, 8)) = 1.0 _ סיבוב ("סיבוב", טווח (0, 360)) = 0 [NoScaleOffset] _Tex ("קוביית מפה (HDR)", קוביה) = "אפור" {} _Stencil ("StencilNum", int) = 6} SubShader {תגים {"תור" = "רקע" "RenderType" = "רקע" "PreviewType" = "Skybox"} ביטול ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Stencil {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertx vert #fragm fragment frag #pragma target 2.0 #include "UnityCG.cginc "דוגמת CUBE _Tex; half4 _Tex_HDR; half4 _Tint; חצי _חשיפה; float _Rotation; float3 RotateAroundYInDegrees (float3 קודקוד, צף מעלות) {float alpha = degrees * UNITY_PI / 180.0; צף סינה, קוסה; סינקוס (אלפא, סינה, קוסה); float2x2 m = float2x2 (cosa, -sina, sina, cosa); float3 (mul (m, vertex.xz), vertex.y).xzy; } struct appdata_t {קודקוד float4: 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 (o); float3 rotated = 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 = DecodeHDR (tex, _Tex_HDR); c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb; c *= _ חשיפה; החזר חצי 4 (ג,.5); } ENDCG}} כיבוי חוזר}

כעת צור חומר חדש של סקייבוקס, קרא לו "PortalSkybox" ובחר את הצללית הזו של portalSkybox מתפריט הפורטל. עבור אל חלון, תאורה, למעלה ובחר את ארגז השמיים הזה שיצרנו זה עתה. עבור אל המצלמה הראשית והגדר דגלים ברורים ל- Skybox. בזמן שאנחנו כאן אפשר להוסיף כמה רכיבים במצלמה שלנו כדי שנוכל לזהות התנגשויות. הוסף רכיב גוף נוקשה למצלמה ובטל את הסימון של שימוש בכוח הכבידה. הוסף מתקן קופסא ובדוק אם הוא מפעיל. הפוך את גודל הקופסאים למתנגדי.5 x 1 x 4. הגדר את מישור החיתוך במצלמה ל -01.

שלב 8: לוגיקת פורטל

לוגיקה של פורטל
לוגיקה של פורטל

הדבר האחרון שעלינו לעשות הוא ליצור את ההיגיון השולט בפורטל שלנו. צור סקריפט C# חדש וקרא לו PortalController.

שימוש ב- System. Collections;

באמצעות System. Collections. Generic; שימוש ב- UnityEngine; מרחב שמות UnityEngine. XR.iOS {class public PortalController: MonoBehaviour {public Material חומרים; MeshRenderer ציבורי meshRenderer; ציבורי UnityARVideo UnityARVideo; bool פרטי isInside = false; bool פרטי isOutside = true; // השתמש בזה לאתחול חלל התחל () {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)); } בטל 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. צור בול ציבורי צריך לעבד בחלק העליון ולהגדיר אותו שווה לאמיתי. למטה בפונקציה OnPreRender () עוטף הכל במשפט if אם הכל בפנים יפעל רק אם shouldRender נכון. כל התסריט צריך להיראות כך:

שימוש במערכת;

שימוש ב- System. Runtime. InteropServices; שימוש ב- UnityEngine; שימוש ב- UnityEngine. Rendering; מרחב שמות UnityEngine. XR.iOS {class public UnityARVideo: MonoBehaviour {public material m_ClearMaterial; [HideInInspector] 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) {_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 חלל ציבורי OnPreRender () {if (shouldRender) {ARTextureHandles handles = UnityARSessionNativeInterface. GetARSessionNativeInterface (). GetARVideoTextureHandles (); if (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) {return; } אם (! bCommandBufferInitialized) {InitializeCommandBuffer (); } Resolution 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 ("_ textureY", _videoTextureY); } // Texture CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. IntPtr) handles.textureCbCr); _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; } חלל ציבורי SetUVTexure (Texture2D UVTex) {_videoTextureCbCr = UVTex; } חלל ציבורי OnPreRender () {if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture ("_ textureY", _videoTextureY); m_ClearMaterial. SetTexture ("_ textureCbCr", _videoTextureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); } #endif}}

שלב 9: כמעט סיימתי

כמעט סיימתי!
כמעט סיימתי!

לבסוף כאשר אנו לוחצים על המסך ומניחים את הפורטל אנו רוצים שהוא תמיד יפנה אלינו. לשם כך עבור אל התסריט "UnityARHitTestExample" בפורטל. החלף את כל מה שבפנים בזה:

שימוש במערכת;

באמצעות System. Collections. Generic; מרחב שמות UnityEngine. XR.iOS {class publicity UnityARHitTestExample: MonoBehaviour {public Transform m_HitTransform; צף ציבורי maxRayDistance = 30.0f; public LayerMask collisionLayer = 1 <0) {foreach (var hitResult in hitResults) {Debug. Log ("קיבלתי מכה!"); 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); להחזיר נכון; }} החזר שקר; } // עדכון נקרא פעם בכל מסגרת עדכון חלל () {#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); אם (touch.phase == TouchPhase. Began || touch.phase == TouchPhase. Moved) {var screenPosition = Camera.main. ScreenToViewportPoint (touch.position); נקודת ARPoint = 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 (נקודה, resultType)) {return; }}}} #endif}}}

שלב 10: שים את האפליקציה בטלפון שלך

שים את האפליקציה בטלפון שלך!
שים את האפליקציה בטלפון שלך!

סוף סוף סיימנו. עבור לקובץ, בנה הגדרות ולחץ על build. פתח את Xcode ובחר את התיקייה שנוצרה מהמבנה. בחר את צוות הפיתוח שלך והעלה את האפליקציה לטלפון שלך! מומלץ לשנות את צבעי החלקיקים וסקייבוקס על מנת להתאים לצרכיך. הודע לי בתגובות אם יש לך שאלות ותודה שהסתכלת!