جدول المحتويات:

بوابة AR إلى الجزء المقلوب من Stranger Things: 10 خطوات (بالصور)
بوابة AR إلى الجزء المقلوب من Stranger Things: 10 خطوات (بالصور)

فيديو: بوابة AR إلى الجزء المقلوب من Stranger Things: 10 خطوات (بالصور)

فيديو: بوابة AR إلى الجزء المقلوب من Stranger Things: 10 خطوات (بالصور)
فيديو: الطاقة الداخلية وطريقة تفجيرها خارجيا لتحول أي شئ تلمسه الى سلاح قاتل | كيوكا 2024, شهر نوفمبر
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: ابدأ مشروع وحدة جديد

ابدأ مشروع وحدة جديد
ابدأ مشروع وحدة جديد

أولاً ، قم بتنزيل Unity3D وتأكد من تثبيت ملفات الإنشاء لمنصة IOS. ستحتاج أيضًا إلى تنزيل Xcode والتسجيل للحصول على حساب مطور Apple مجاني. يجب أن يعمل جهاز iPhone الخاص بك أيضًا بنظام IOS 11 أو إصدار أحدث. اعتبارًا من اليوم الخامس من فبراير 2018 ، تم إصدار IOS 11.3 ولكن لا يحتوي xCode 9.2 على ملفات دعم له بعد. لذلك إذا كنت تقوم بتشغيل أحدث إصدار من IOS ، فتأكد من تنزيل أحدث إصدار تجريبي من Xcode من Apple. Developer.com.

بمجرد حصولك على جميع البرامج اللازمة ، افتح Unity وابدأ مشروعًا جديدًا ، أطلق عليه ما تريد. سنحتاج إلى المكوِّن الإضافي Apple ARKit حتى نتمكن من استخدام كاميرا الهاتف لدينا لاكتشاف الأرض ووضع كائنات على الأرض. دعنا نستورد ذلك الآن بالانتقال إلى علامة التبويب Asset Store والبحث عن "ARKit". ستحتاج إلى إنشاء حساب Unity مجاني إذا لم يكن لديك حساب بالفعل ، ثم انقر فوق استيراد للحصول على المكون الإضافي.

انتقل إلى مجلد الأمثلة في مجلد ARKit وابحث عن "UnityARKitScene." انقر نقرًا مزدوجًا لفتحه. سنستخدم هذا المشهد كنقطة انطلاق ونبني من هنا. سيسمح لك هذا المشهد افتراضيًا باكتشاف الأرض وعندما تنقر على الشاشة ، سيتم وضع مكعب في هذا الموضع.

دعنا نحصل أولاً على إعدادات البناء في التربيعية حتى لا ننسى القيام بذلك لاحقًا. انقر فوق ملف ، وقم ببناء الإعدادات وإزالة جميع المشاهد من تلك القائمة. انقر فوق إضافة مشاهد مفتوحة لإضافة مشهدنا الحالي. آخر شيء نحتاج إلى إعداده هنا هو في إعدادات المشغل ، انتقل إلى معرّف الحزمة والتنسيق لهذه السلسلة هو com. YourCompanyName. YourAppName ، لذلك في حالتي أفعل شيئًا مثل com. MatthewHallberg. PortalTest.

الخطوة الثانية: قم بإعداد المشهد

قم بإعداد المشهد
قم بإعداد المشهد

ألقِ نظرة أولاً إلى اليسار وابحث عن كائن اللعبة المسمى "GeneratePlanes". مع تمييز ذلك ، انظر إلى اليمين الآن وانقر فوق خانة الاختيار لتعطيلها. بهذه الطريقة ، لا يتم إنشاء المربعات الزرقاء القبيحة عندما تكتشف ARKit مستوى أرضيًا. بعد ذلك ، احذف كائن لعبة "RandomCube" لأننا لا نريد أن نرى ذلك في مشهدنا.

الآن نحتاج أولاً إلى إنشاء مدخل بوابتنا. احذف المكعب الذي يعتبر تابعًا لـ "HitCubeParent". انقر بزر الماوس الأيمن واختر إنشاء كائن لعبة فارغ. قم بإعادة تسميته "البوابة". الآن انقر بزر الماوس الأيمن على هذا الكائن وقم بإنشاء مكعب ، وهذا سيجعله تابعًا للبوابة الإلكترونية. قم بإعادة تسميته "PostLeft" وسيكون هذا هو المنشور الأيسر لبوابتنا. قم بقياسها بحيث يكون x يساوي 1 و y يساوي 28 و z يساوي واحدًا. افعل نفس الشيء للمنصب الصحيح. الآن قم بإنشاء المنشور الأعلى وقم بقياس y إلى 14. اقلب هذا الجانب وحركه بحيث يربط المنشورات الأخرى. اجعل مقياس البوابة بأكمله 1.3 × 1.4 × 1.

اذهب إلى جوجل واكتب مادة الخشب أو اللحاء. قم بتنزيل إحدى تلك الصور واسحبها إلى مجلد الأصول في الوحدة. الآن اسحب تلك الصورة إلى جميع منشورات بوابتك.

انقر فوق كائن "Portal" مرة أخرى وانقر فوق إضافة مكون على اليمين. أضف البرنامج النصي "UnityARHitTestExample" إليه. هناك فتحة فارغة هناك لـ "Hit Transform" ، اسحب كائن "HitCubeParent" إلى تلك الفتحة.

الخطوة الثالثة: لنصنع بعض الجسيمات

لنصنع بعض الجسيمات
لنصنع بعض الجسيمات

الآن سنستخدم نظام Unity Particle لعمل تأثير الدخان والجسيمات العائمة داخل بوابتنا. انتقل إلى الأصول في شريط القائمة العلوي ، والأصول القياسية ، وأنظمة استيراد الجسيمات.

قم بإنشاء كائني لعبة فارغين داخل البوابة الخاصة بك وقم باستدعاء أحدهما "SmokeParticles" والآخر "FloatingParticles".

أضف مكونًا لنظام الجسيمات إلى جزيئات الدخان.

يحتوي هذا المكون على مجموعة من الخيارات لكننا نحتاج فقط إلى تغيير زوجين.

قم بتغيير لون البداية إلى اللون الأزرق الداكن بنسبة شفافية تبلغ حوالي 50٪. اجعل معدل الانبعاث 100. الشكل الداخلي ، اجعل نصف القطر 0.10. في جزء العارض في الجزء السفلي ، قم بتغيير الحجم الأدنى إلى.8 والحجم الأقصى إلى 5. في مكون المادة ، اختر فقط مادة الدخان من القائمة ، لكننا سنقوم بتغيير هذا لاحقًا.

أضف نظام جسيمات إلى كائن لعبة الجسيمات العائمة الآن واضبط الانبعاث على 500. اضبط عمر البدء على 2 ، ونصف القطر إلى 10 ، وحجم الجسيمات الأدنى إلى.01 ، وأقصى حجم للجسيمات إلى 0.015. اضبط المادة على الجسيم الافتراضي في الوقت الحالي.

أخيرًا ، خذ كلاً من كائنات اللعبة وقم بتدويرها بمقدار 90 درجة على x ورفعها لأعلى في الهواء بحيث تنبعث منها على مدخل البوابة.

الخطوة 4: إبطاء الجسيمات

إبطاء الجسيمات
إبطاء الجسيمات

نظرًا لأننا نريد أن تغطي هذه الجسيمات مساحة كبيرة ولكن أيضًا تتحرك ببطء ، فنحن بحاجة إلى إنشاء وظيفة العينة الخاصة بنا. لذا انقر بزر الماوس الأيمن في مجلد الأصول وأنشئ نصًا جديدًا لـ C # وأطلق عليه اسم "ParticleSample." انسخ والصق هذا الرمز:

باستخدام System. Collections.

باستخدام System. Collections. Generic ؛ باستخدام UnityEngine ؛ فئة عامة ParticleSample: MonoBehaviour {private ParticleSystem ps؛ // استخدم هذا لتهيئة الفراغ Start () {ps = GetComponent () ؛ StartCoroutine (SampleParticleRoutine ()) ، } IEnumerator SampleParticleRoutine () {var main = ps.main؛ main.simulationSpeed = 1000f ؛ بلاي ستيشن () ؛ العائد العائد الجديد WaitForSeconds (.1f) ؛ main.simulationSpeed =.05f ؛ }}

الآن اسحب هذا البرنامج النصي إلى كل عنصر من عناصر لعبة نظام الجسيمات.

الخطوة الخامسة: إنشاء البوابة

إنشاء البوابة!
إنشاء البوابة!

نحتاج الآن إلى إنشاء البوابة ، لذا انقر بزر الماوس الأيمن على كائن لعبة البوابة وإنشاء رباعية. قم بتوسيع النطاق بحيث يغطي البوابة بالكامل ، وستصبح نافذة البوابة الخاصة بنا. أول شيء نحتاج إلى إضافته إليه هو تظليل البوابة ، وهذا لن يؤدي إلا إلى عرض الكائنات مع تظليل آخر محدد عليها. انقر بزر الماوس الأيمن في مجلد الأصول وقم بإنشاء تظليل جديد غير مضاء. أزل كل شيء هناك والصق هذا الرمز:

Shader "البوابة / portalWindow"

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

انقر بزر الماوس الأيمن في التسلسل الهرمي وأنشئ مادة جديدة ، وأطلق عليها اسم PortalWindowMat ، في القائمة المنسدلة لهذه المادة ، ابحث عن قسم المدخل ، واختر نافذة البوابة الإلكترونية. اسحب هذه المادة على البوابة الرباعية الخاصة بك.

الخطوة 6: تظليل الجسيمات

تظليل الجسيمات
تظليل الجسيمات

انقر بزر الماوس الأيمن في مجلد الأصول مرة أخرى وأنشئ تظليلًا جديدًا. نحتاج إلى عمل تظليل للجسيمات التي تدخل داخل البوابة. استبدل كل الكود بهذا:

Shader "بوابة / جسيمات" {

الخصائص {_TintColor ("Tint Color" ، اللون) = (0.5، 0.5، 0.5، 0.5) _MainTex ("Particle Texture"، 2D) = "white" {} _InvFade ("عامل الجسيمات اللينة" ، النطاق (0.01 ، 3.0)) = 1.0 _Stencil ("stencil"، int) = 6} الفئة {العلامات {"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]} تمرير {CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCGer2cginc" fix4 _TintColor ؛ Struct appdata_t {float4 vertex: POSITION؛ ثابت 4 لون: اللون ؛ float2 texcoord: TEXCOORD0؛ UNITY_VERTEX_INPUT_INSTANCE_ID} ، هيكل 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 (ت) ، 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) ، عودة س ؛ } UNITY_DECLARE_DEPTH_TEXTURE (_CameraDepthTexture) ، تعويم _InvFade ؛ fix4 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 fix4 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 ("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 {العلامات {"Queue" = "Background" "RenderType" = "Background" "PreviewType" = "Skybox"} استبعد ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Stencil {Ref 1 Comp [_Stencil]} تمرير {CGPROGRAM #pragma vertex vert #pragma frag #pragma target 2.0 # تضمين "UnityC.cginc "samplerCUBE _Tex؛ half4 _Tex_HDR ؛ half4 _Tint ؛ نصف تعرض ؛ تعويم _Rotation ؛ float3 RotateAroundYInDegrees (رأس عائم 3 ، درجات عائمة) {عائم ألفا = درجات * UNITY_PI / 180.0 ؛ تطفو سينا ، كوسا ؛ سينكوس (ألفا ، سينا ، كوسا) ؛ 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} ، هيكل v2f {float4 vertex: SV_POSITION ؛ float3 texcoord: TEXCOORD0؛ UNITY_VERTEX_OUTPUT_STEREO} ، v2f vert (appdata_t v) {v2f o ؛ UNITY_SETUP_INSTANCE_ID (ت) ، UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO (o) ، float3 rotated = RotateAroundYInDegrees (v.vertex، _Rotation) ؛ o.vertex = UnityObjectToClipPos (مستدير) ، o.texcoord = v.vertex.xyz ؛ عودة س ؛ } fix4 frag (v2f i): SV_Target {half4 tex = texCUBE (_Tex، i.texcoord) ؛ half3 c = DecodeHDR (tex، _Tex_HDR) ؛ c = c * _Tint.rgb * union_ColorSpaceDouble.rgb ؛ ج * = _ التعرض ؛ إرجاع half4 (ج ،.5) ؛ } ENDCG}} إيقاف احتياطي}

الآن قم بإنشاء مادة skybox جديدة ، وأطلق عليها اسم "PortalSkybox" واختر هذا portalSkybox shader من قائمة البوابة. انتقل إلى Window ، Lighting ، في الجزء العلوي واختر صندوق السماء هذا الذي أنشأناه للتو. انتقل إلى الكاميرا الرئيسية وقم بتعيين أعلام واضحة على skybox. بينما نحن هنا ، دعونا نضيف بعض المكونات على الكاميرا حتى نتمكن من اكتشاف الاصطدامات. أضف مكونًا صلبًا للكاميرا وقم بإلغاء تحديد استخدام الجاذبية. إضافة مصادم مربع والتحقق هو المشغل. اجعل حجم مصادمات الصندوق 0.5 × 1 × 4. اضبط مستوى القطع على الكاميرا على 0.01.

الخطوة 8: Portal Logic

منطق البوابة
منطق البوابة

آخر شيء يتعين علينا القيام به هو إنشاء المنطق الذي يتحكم في بوابتنا. قم بإنشاء برنامج نصي C # جديد وقم بتسميته PortalController.

باستخدام System. Collections.

باستخدام System. Collections. Generic ؛ باستخدام UnityEngine ؛ مساحة الاسم UnityEngine. XR.iOS {public class PortalController: MonoBehaviour {public Material materials؛ شبكة MeshRenderer العامة العامة UnityARVideo UnityARVideo؛ منطقية خاصة داخل = خطأ ؛ منطقي خاص خارج = صحيح ؛ // Use this for initialization void Start () {OutsidePortal ()؛ } باطل 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 = صحيح ؛ InsidePortal () ؛ }} else {if (isInside) {isInside = false؛ isOutside = صحيح ؛ OutsidePortal () ، }}} void OutsidePortal () {StartCoroutine (DelayChangeMat (3))؛ } void InsidePortal () {StartCoroutine (DelayChangeMat (6))؛ } IEnumerator DelayChangeMat (int stencilNum) {UnityARVideo.shouldRender = false؛ العائد العائد الجديد WaitForEndOfFrame () ؛ meshRenderer.enabled = خطأ ؛ foreach (حصيرة المواد في المواد) {mat. SetInt ("_Stencil"، stencilNum)؛ } العائد إرجاع WaitForEndOfFrame () جديد؛ meshRenderer.enabled = صحيح ؛ UnityARVideo.shouldRender = صحيح ، }}}

اسحب هذا البرنامج النصي الجديد إلى نافذة البوابة الإلكترونية. سيؤدي ذلك إلى نقلنا داخل وخارج البوابة عندما يصطدم المصادم الموجود على الكاميرا بنافذة البوابة. الآن في الوظيفة التي تغير جميع المواد ، نطلب من المكون الإضافي ARkit عدم عرض الإطار ، لذا انتقل إلى الكاميرا الرئيسية وافتح البرنامج النصي UnityARVideo. إنشاء منطقية عامة يجب عرضها في الجزء العلوي وتعيينها على أنها صحيحة. لأسفل في وظيفة OnPreRender () ، قم بلف كل شيء في عبارة if حيث سيتم تشغيل كل شيء بالداخل فقط إذا كان يجب أن يكون العرض صحيحًا. يجب أن يبدو النص بالكامل كما يلي:

باستخدام النظام ؛

باستخدام System. Runtime. InteropServices ؛ باستخدام UnityEngine ؛ باستخدام UnityEngine. Rendering. مساحة الاسم UnityEngine. XR.iOS {public class UnityARVideo: MonoBehaviour {public Material m_ClearMaterial؛ [HideInspector] منطقي عام shouldRender = صحيح ؛ خاص CommandBuffer m_VideoCommandBuffer ؛ خاص Texture2D _videoTextureY؛ خاص Texture2D _videoTextureCbCr ؛ المصفوفة الخاصة 4x4 _displayTransform ؛ منطقية خاصة bCommandBufferInitialized ؛ بداية الفراغ العام () {UnityARSessionNativeInterface. ARFrameUpdatedEvent + = UpdateFrame ؛ bCommandBufferInitialized = خطأ ، } 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 = new CommandBuffer ()؛ m_VideoCommandBuffer. Blit (null، BuiltinRenderTextureType. CurrentActive، m_ClearMaterial) ؛ GetComponent (). AddCommandBuffer (CameraEvent. BeforeForwardOpaque، m_VideoCommandBuffer) ؛ bCommandBufferInitialized = صحيح ، } void OnDestroy () {GetComponent (). RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque، m_VideoCommandBuffer) ؛ UnityARSessionNativeInterface. ARFrameUpdatedEvent - = UpdateFrame ؛ bCommandBufferInitialized = خطأ ، } #if! UNITY_EDITOR عام باطل OnPreRender () {if (shouldRender) {ARTextureHandles handles = UnityARSessionNativeInterface. GetARSessionNativeInterface (). GetARVideoTextureHandles ()؛ إذا (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) {return؛ } if (! bCommandBufferInitialized) {InitializeCommandBuffer ()؛ } Resolution currentResolution = Screen.currentResolution ؛ // Texture Y if (_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 ("_ TextYY"، _videoTextureY) ؛ } // Texture CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width، currentResolution.height، TextureFormat. RG16، false، false، (System. IntPtr) handles.texture)؛ _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 ؛ مساحة الاسم UnityEngine. XR.iOS {فئة عامة UnityARHitTestExample: MonoBehaviour {public Transform m_HitTransform؛ 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)) ؛ Vector3urrAngle = transform.eulerAngles ؛ convert. LookAt (Camera.main.transform) ؛ transform.eulerAngles = Vector3 جديد (urrAngle.x، transform.eulerAngles.y ،urrAngle.z) ؛ العودة صحيح } } عودة كاذبة؛ } // يتم استدعاء التحديث مرة واحدة لكل إطار باطل 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 = ARPoint جديدة {x = screenPosition.x، y = screenPosition.y} ؛ // إعطاء الأولوية reults أنواع ARHitTestResultType = {resultTypes ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent، // إذا كنت ترغب في استخدام الطائرات تستخدم لانهائية هذا: //ARHitTestResultType. ARHitTestResultTypeExistingPlane، ARHitTestResultType. ARHitTestResultTypeHorizontalPlane، ARHitTestResultType. ARHitTestResultTypeFeaturePoint}؛ foreach (ARHitTestResultType resultType في resultTypes) {if (HitTestWithResultType (point، resultType)) {return؛ } } } } #إنهاء إذا } } }

الخطوة 10: ضع التطبيق على هاتفك

ضع التطبيق على هاتفك!
ضع التطبيق على هاتفك!

أخيرا انتهينا. انتقل إلى ملف ، وقم ببناء الإعدادات وانقر فوق إنشاء. افتح Xcode واختر المجلد الذي تم إنشاؤه من الإصدار. اختر فريق التطوير وضع التطبيق على هاتفك! قد ترغب في تغيير ألوان الجسيمات و skybox لتناسب احتياجاتك. اسمحوا لي أن أعرف في التعليقات إذا كان لديك أي أسئلة وشكرا للبحث!

موصى به: