Სარჩევი:
- ნაბიჯი 1: დაიწყეთ ახალი ერთობის პროექტი
- ნაბიჯი 2: სცენის დაყენება
- ნაბიჯი 3: მოდით გავაკეთოთ ნაწილაკები
- ნაბიჯი 4: ნაწილაკების შენელება
- ნაბიჯი 5: შექმენით პორტალი
- ნაბიჯი 6: ნაწილაკების საპარსები
- ნაბიჯი 7: შექმენით Skybox
- ნაბიჯი 8: პორტალის ლოგიკა
- ნაბიჯი 9: თითქმის შესრულებულია
- ნაბიჯი 10: განათავსეთ აპლიკაცია თქვენს ტელეფონში
ვიდეო: AR პორტალი თავდაყირა უცნაური საგნებიდან: 10 ნაბიჯი (სურათებით)
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:20
ეს ინსტრუქცია გაივლის iPhone– ის დამატებული რეალობის მობილური აპლიკაციის შექმნას პორტალით, რომელიც იწვევს უცნაური საგნების თავდაყირა. შეგიძლიათ შეხვიდეთ პორტალის შიგნით, იაროთ და დაბრუნდეთ. პორტალის შიგნით ყველაფერი მხოლოდ პორტალის საშუალებით ჩანს, სანამ არ შეხვალ შიგნით. შიგნით შესვლისთანავე, ყველაფერი დალაგდება ყველგან, სანამ არ დაბრუნდებით რეალურ სამყაროში. ჩვენ გამოვიყენებთ Unity 3D ვიდეო თამაშის ძრავას Apple ARKit მოდულით. ყველა პროგრამული უზრუნველყოფა, რომელსაც ჩვენ გამოვიყენებთ, შეიძლება გადმოწერილი და უფასოდ გამოიყენოთ. თქვენ არ გჭირდებათ იყოთ ექსპერტი, რომ გაჰყვეთ, ჩვენ ყველა ნაბიჯს გადავდგამთ!
ნაბიჯი 1: დაიწყეთ ახალი ერთობის პროექტი
პირველ რიგში, ჩამოტვირთეთ Unity3D და დარწმუნდით, რომ დააინსტალირეთ ასაშენებელი ფაილები IOS პლატფორმისთვის. თქვენ ასევე უნდა ჩამოტვირთოთ Xcode და დარეგისტრირდეთ ვაშლის დეველოპერის უფასო ანგარიშზე. თქვენს iPhone- ს ასევე უნდა ჰქონდეს IOS 11 ან უფრო მაღალი. 2018 წლის 5 თებერვლის მდგომარეობით, IOS 11.3 გამოვიდა, მაგრამ xCode 9.2– ს ჯერ არ აქვს ამის დამხმარე ფაილები. ასე რომ, თუ თქვენ გაშვებული უახლესი IOS ვერსია დარწმუნდით ჩამოტვირთოთ უახლესი Xcode ბეტა ვერსია Apple. Developer.com.
მას შემდეგ რაც გაქვს ყველა საჭირო პროგრამა, გახსენი Unity და დაიწყე ახალი პროექტი, დაარქვი მას როგორც გინდა. ჩვენ დაგვჭირდება Apple ARKit მოდული, ასე რომ ჩვენ შეგვიძლია გამოვიყენოთ ჩვენი ტელეფონის კამერა, რათა გამოვავლინოთ მიწა და მოვათავსოთ საგნები იატაკზე. მოდით ახლა შემოვიტანოთ აქტივების მაღაზიის ჩანართზე და მოძებნოთ "ARKit". თქვენ უნდა შექმნათ უფასო Unity ანგარიში, თუ ჯერ არ გაქვთ, შემდეგ დააწკაპუნეთ იმპორტზე, რომ მიიღოთ მოდული.
გადადით ARKit საქაღალდეში მაგალითების საქაღალდეში და იპოვეთ "UnityARKitScene". ორჯერ დააწკაპუნეთ მასზე გასახსნელად. ჩვენ ვაპირებთ გამოვიყენოთ ეს სცენა, როგორც ამოსავალი წერტილი და განვავითაროთ აქედან. ეს სცენა ნაგულისხმევად მოგცემთ საშუალებას აღმოაჩინოთ მიწა და ეკრანზე დაჭერისას კუბი მოთავსდება ამ მდგომარეობაში.
მოდით, თავიდან ავიღოთ ჩვენი პარამეტრების კვადრატი, რათა არ დაგვავიწყდეს ამის გაკეთება მოგვიანებით. დააწკაპუნეთ ფაილზე, შექმენით პარამეტრები და ამოიღეთ ყველა სცენა ამ სიიდან. დააწკაპუნეთ ღია სცენების დამატებაზე, რომ დაამატოთ ჩვენი ახლანდელი. ბოლო რაც ჩვენ უნდა დავაყენოთ აქ არის მოთამაშის პარამეტრებში ქვემოთ ჩავიდეთ პაკეტის იდენტიფიკატორი და ამ სტრიქონის ფორმატი არის com. YourCompanyName. YourAppName, ასე რომ ჩემს შემთხვევაში მე ვაკეთებ რაღაცას com. MatthewHallberg. PortalTest.
ნაბიჯი 2: სცენის დაყენება
ჯერ გადახედეთ მარცხნივ და იპოვეთ თამაშის ობიექტი სახელწოდებით "GeneratePlanes". ამის ხაზგასმით, გადახედეთ ახლავე და დააწკაპუნეთ ჩამრთველზე, რომ გამორთოთ იგი. ამ გზით ჩვენ არ გვაქვს მახინჯი ლურჯი კვადრატები, რომლებიც წარმოიქმნება ARKit– ის მიერ აღმოჩენილი მიწის სიბრტყის დროს. შემდეგ წაშალეთ "RandomCube" თამაშის ობიექტი, რადგან ჩვენ არ გვინდა ამის დანახვა ჩვენს სცენაზე.
ახლა ჩვენ უნდა შევქმნათ ჩვენი პორტალის კარიბჭე. წაშალეთ კუბი, რომელიც "HitCubeParent" - ის შვილია. დააწკაპუნეთ მარჯვენა ღილაკით და აირჩიეთ ცარიელი თამაშის ობიექტის შექმნა. დაარქვით მას "პორტალი". ახლა დააწკაპუნეთ მარჯვენა ღილაკით იმ ობიექტზე და შექმენით კუბი, ეს გახდის მას პორტალის შვილი. დაარქვით მას "PostLeft" და ეს იქნება ჩვენი პორტალის მარცხენა პოსტი. გავაფართოვოთ ის x 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. ქვედა ნაწილში რენდერერის ნაწილში შეცვალეთ min ზომა.8 და მაქსიმალური ზომა 5 -მდე. მასალის კომპონენტზე უბრალოდ აირჩიეთ კვამლის მასალა სიიდან, მაგრამ ჩვენ ამას მოგვიანებით შევცვლით.
დაამატეთ ნაწილაკების სისტემა მცურავი ნაწილაკების სათამაშო ობიექტს და დააყენეთ ემისია 500. დააყენეთ დაწყების სიცოცხლე 2, რადიუსი 10, მინ ნაწილაკების ზომა.01 და მაქსიმალური ნაწილაკების ზომა.015. ახლა დააყენეთ მასალა ნაგულისხმევ ნაწილაკზე.
ბოლოს აიღეთ ორივე თამაშის ობიექტი და გადააბრუნეთ ისინი 90 გრადუსით x– ზე და ასწიეთ ისინი ჰაერში ისე, რომ ისინი ასხივებენ პორტალის კარზე.
ნაბიჯი 4: ნაწილაკების შენელება
ვინაიდან ჩვენ გვსურს, რომ ეს ნაწილაკები ფარავდეს დიდ ტერიტორიას, მაგრამ ასევე ნელა მოძრაობდეს, ჩვენ უნდა შევქმნათ ჩვენი საკუთარი ნიმუშის ფუნქცია. ასე რომ, მარჯვენა ღილაკით დააწკაპუნეთ აქტივების საქაღალდეში და შექმენით ახალი C# სკრიპტი და დაარქვით მას "ParticleSample". დააკოპირეთ და ჩასვით ამ კოდში:
System. Collection- ების გამოყენებით;
System. Collections. Generic- ის გამოყენებით; UnityEngine- ის გამოყენებით; საჯარო კლასი ParticleSample: MonoBeviviour {private ParticleSystem ps; // გამოიყენეთ ეს ინიციალიზაციისთვის void Start () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. თამაში (); შემოსავლის დაბრუნების ახალი WaitForSeconds (.1f); main.simulationSpeed =.05f; }}
ახლა გადაიტანეთ ეს სკრიპტი თქვენი ნაწილაკების სისტემის თამაშის თითოეულ ობიექტზე.
ნაბიჯი 5: შექმენით პორტალი
ახლა ჩვენ უნდა შევქმნათ პორტალი, ასე რომ მარჯვენა ღილაკით დააწკაპუნეთ პორტალის თამაშის ობიექტზე და შექმენით ოთხკუთხედი. გააფართოვეთ ოთხკუთხედი ისე, რომ იგი მოიცავს მთელ პორტალს, ეს გახდება ჩვენი პორტალის ფანჯარა. პირველი რაც ჩვენ უნდა დავამატოთ არის პორტალის შადერი, ეს მხოლოდ ობიექტებს გახდის სხვა კონკრეტული შადრით. დააწკაპუნეთ მარჯვენა ღილაკით აქტივების საქაღალდეში და შექმენით ახალი შუქნიშანი. ამოიღეთ ყველაფერი იქ და ჩასვით ამ კოდში:
Shader "პორტალი/პორტალი ფანჯარა"
{SubShader {Zwrite off Colormask 0 cull off Stencil {Ref 1 Pass შეცვლა} Pass {}}}
იერარქიაში დააწკაპუნეთ მარჯვენა ღილაკით და შექმენით ახალი მასალა, დაარქვით მას PortalWindowMat, ამ მასალის ჩამოსაშლელ პუნქტში იპოვეთ პორტალის განყოფილება და აირჩიეთ პორტალის ფანჯარა. გადაიტანეთ ეს მასალა თქვენი პორტალის ოთხკუთხედზე.
ნაბიჯი 6: ნაწილაკების საპარსები
კვლავ დააწკაპუნეთ აქტივების საქაღალდეში და შექმენით ახალი shader. ჩვენ უნდა შევქმნათ შადერები ნაწილაკებისათვის, რომლებიც შედიან პორტალის შიგნით. შეცვალეთ ყველა კოდი ამით:
Shader "პორტალი/ნაწილაკები" {
თვისებები {_TintColor ("ელფერი ფერი", ფერი) = (0.5, 0.5, 0.5, 0.5) _MainTex ("ნაწილაკების ტექსტურა", 2D) = "თეთრი" {} _InvFade ("რბილი ნაწილაკების ფაქტორი", დიაპაზონი (0.01, 3.0)) = 1.0 _Stencil ("სტენცილი", int) = 6} კატეგორია {ტეგები {"რიგი" = "გამჭვირვალე" "IgnoreProjector" = "ჭეშმარიტი" "RenderType" = "გამჭვირვალე" "PreviewType" = "თვითმფრინავი"} ნაზავია 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 დაფიქსირდა 4 _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; ფიქსირებული 4 ფრაგმენტი (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 *= fade; #endif fixed4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, col); დაბრუნების პოლკოვნიკი; } ENDCG}}}}
შექმენით ორი ახალი მასალა, ერთი სახელწოდებით portalSmoke და ერთი სახელწოდებით portalParticles.
თითოეულისთვის შეარჩიეთ ეს შადრევანი, ჩამოსაშლელიდან, პორტალებში, ნაწილაკები. კვამლის ნაწილაკებისათვის შეარჩიეთ კვამლის ტექსტურა და ნაწილაკებისთვის ნაწილაკების ტექსტურა. შეცვალეთ კვამლის ფერი მუქი ლურჯად, დაახლოებით 50% გამჭვირვალობით. გადადით თქვენს პორტალში თითოეული ნაწილაკების სისტემის შემქმნელის კომპონენტზე და შეარჩიეთ შესაბამისი მასალები, რომლებიც ჩვენ შევქმენით.
ნაბიჯი 7: შექმენით Skybox
ახლა კი თავდაყირა გარეგნობის შესაქმნელად, ჩვენ უნდა შევარჩიოთ ყველაფერი მუქი ლურჯში. ამისათვის ჩვენ გამოვიყენებთ გამჭვირვალე skybox- ს, ასე რომ გააკეთეთ ახალი shader და ჩასვით ამ კოდში:
Shader "Portal/portalSkybox" {
თვისებები {_Tint ("Tint ფერი", ფერი) = (.5,.5,.5,.5) [გამა] _ექსპოზიცია ("ექსპოზიცია", დიაპაზონი (0, 8)) = 1.0 _ბრუნება ("როტაცია", დიაპაზონი (0, 360)) = 0 [NoScaleOffset] _Tex ("Cubemap (HDR)", Cube) = "ნაცრისფერი" {} _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 un 2.0 #inc.ccinc "samplerCUBE _Tex; half4 _Tex_HDR; ნახევარი 4 _ფერი; ნახევარი _ექსპოზიცია; float _ როტაცია; float3 RotateAroundYInDerees (float3 წვერო, float ხარისხი) {float alpha = გრადუსი * UNITY_PI / 180.0; float sina, cosa; სინკოსი (ალფა, სინა, კოსა); 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 vertex: 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 (c,.5); } ENDCG}} უკუკავშირი გამორთულია}
ახლა შექმენით ახალი Skybox მასალა, დაარქვით მას "PortalSkybox" და შეარჩიეთ ეს portalSkybox shader პორტალის მენიუდან. გადადით ფანჯარაში, განათება, ზედა ნაწილში და შეარჩიეთ ეს Skybox, რომელიც ჩვენ შევქმენით. გადადით მთავარ კამერაზე და დააყენეთ ნათელი დროშები Skybox– ზე. სანამ ჩვენ აქ ვართ, მოდით დავამატოთ რამდენიმე კომპონენტი ჩვენს კამერაზე, ასე რომ ჩვენ შეგვიძლია გამოვავლინოთ შეჯახება. დაამატეთ ხისტი კომპონენტი კამერას და გააუქმეთ გრავიტაციის გამოყენება. დაამატეთ ყუთის კოლაიდერი და შეამოწმეთ არის გამომწვევი. გააკეთეთ ყუთში კოლაიდერების ზომა.5 x 1 x 4. დააყენეთ კამერაზე ამომრთველი თვითმფრინავი.01.
ნაბიჯი 8: პორტალის ლოგიკა
ბოლო რაც უნდა გავაკეთოთ არის ლოგიკის შექმნა, რომელიც აკონტროლებს ჩვენს პორტალს. შექმენით ახალი C# სკრიპტი და დაარქვით მას PortalController.
System. Collection- ების გამოყენებით;
System. Collections. Generic- ის გამოყენებით; UnityEngine- ის გამოყენებით; namespace UnityEngine. XR.iOS {საჯარო კლასი PortalController: MonoBehaviour {საჯარო მასალა მასალები; საჯარო MeshRenderer meshRenderer; საზოგადოებრივი ერთობა ARVideo UnityARVideo; პირადი ბოლი isInside = ყალბი; 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 = ჭეშმარიტი; InsidePortal (); }} სხვა {თუ (isInside) {isInside = ყალბი; 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 სკრიპტი. შექმენით public bool shouldRender ზედა ნაწილში და დააყენეთ ის ჭეშმარიტის ტოლი. ქვემოთ OnPreRender () ფუნქციაში შეფუთეთ ყველაფერი if განცხადებაში, სადაც ყველაფერი შიგნით მხოლოდ იმ შემთხვევაში იმუშავებს, თუ shouldRender არის ჭეშმარიტი. მთელი სკრიპტი ასე უნდა გამოიყურებოდეს:
სისტემის გამოყენებით;
System. Runtime. InteropServices- ის გამოყენებით; UnityEngine- ის გამოყენებით; UnityEngine. Rendering– ის გამოყენებით; namespace UnityEngine. XR.iOS {საჯარო კლასი UnityARVideo: MonoBeviviour {საჯარო მასალა m_ClearMaterial; [HideInInspector] public bool shouldRender = true; პირადი CommandBuffer m_VideoCommandBuffer; პირადი ტექსტურა 2D _ ვიდეო ტექსტი Y; პირადი Texture2D _videoTextureCbCr; პირადი Matrix4x4 _displayTransform; პირადი ბოლი bCommandBufferInitialized; public void დაწყება () {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 = ჭეშმარიტი; } 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) {დაბრუნება; } if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } რეზოლუცია currentResolution = Screen.currentResolution; // ტექსტურა Y თუ (_videoTextureY == null) {_videoTextureY = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. R8, false, false, (System. IntPtr) სახელურები. ტექსტურა Y); _videoTextureY.filterMode = FilterMode. Bilinear; _videoTextureY.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ ტექსტურა Y", _ ვიდეო ტექსტი Y); } // Texture CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. Inttext); _videoTextureCbCr.filterMode = FilterMode. Bilinear; _videoTextureCbCr.wrapMode = TextureWrapMode. გაიმეორეთ; m_ClearMaterial. SetTexture ("_ ტექსტურაCbCr", _videoTextureCbCr); } _videoTextureY. UpdateExternalTexture (სახელურები. ტექსტურა Y); _videoTextureCbCr. UpdateExternalTexture (სახელურები. ტექსტურა CbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); }} #სხვა საჯარო ბათილად SetYTexure (ტექსტურა 2D YTex) {_videoTextureY = YTex; } public void SetUVTexure (Texture2D UVTex) {_videoTextureCbCr = UVTex; } public void OnPreRender () {if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } m_ClearMaterial. SetTexture ("_ ფაქტურა Y", _ ვიდეო ტექსტი Y); m_ClearMaterial. SetTexture ("_ ტექსტურაCbCr", _videoTextureCbCr); m_ClearMaterial. SetMatrix ("_ DisplayTransform", _displayTransform); } #დაასრულე თუ } }
ნაბიჯი 9: თითქმის შესრულებულია
დაბოლოს, როდესაც ჩვენ ვაწკაპუნებთ ეკრანზე და ვდებთ პორტალს, გვსურს ის ყოველთვის ჩვენს წინაშე იყოს. ამისათვის გადადით პორტალზე "UnityARHitTestExample" სკრიპტზე. შეცვალეთ ყველაფერი შიგნით:
სისტემის გამოყენებით;
System. Collections. Generic- ის გამოყენებით; namespace UnityEngine. XR.iOS {საჯარო კლასი UnityARHitTestExample: მონოქცევა {საჯარო ტრანსფორმაცია m_HitTransform; public float 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 = ახალი ვექტორი 3 (currAngle.x, transform.eulerAngles.y, currAngle.z); ჭეშმარიტი დაბრუნება; }} დაბრუნება false; } // განახლება ეწოდება ერთხელ ჩარჩოში void განახლება () { #თუ 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 in resultTypes) {if (HitTestWithResultType (წერტილი, resultType)) {დაბრუნება; } } } } #დაასრულე თუ } } }
ნაბიჯი 10: განათავსეთ აპლიკაცია თქვენს ტელეფონში
საბოლოოდ ჩვენ დავასრულეთ. გადადით ფაილზე, შექმენით პარამეტრები და დააჭირეთ მშენებლობას. გახსენით Xcode და შეარჩიეთ საქაღალდე, რომელიც შეიქმნა აშენებიდან. შეარჩიეთ თქვენი განვითარების გუნდი და განათავსეთ აპლიკაცია თქვენს ტელეფონში! შეიძლება დაგჭირდეთ ნაწილაკების და სკიბოქსის ფერების შეცვლა, რათა დააკმაყოფილოთ თქვენი მოთხოვნილებები. შემატყობინეთ კომენტარებში, თუ თქვენ გაქვთ რაიმე შეკითხვა და მადლობა ძიებისთვის!
გირჩევთ:
როგორ გავაკეთე საკუთარი უცნაური Bluetooth სპიკერი: 4 ნაბიჯი
როგორ გავაკეთე ჩემი საკუთარი უცნაური Bluetooth სპიკერი: ამ ინსტრუქციებში მე გაჩვენებთ როგორ გავაკეთე ჩემი საკუთარი ეს უცნაური Bluetooth სპიკერი, რომელიც წარმოშობს წარმოუდგენელ ხმას ბასით ბოთლით გამოყენებისას
ხმის რეაქტიული ნათურა მონიტორები + უცნაური რამ : 8 ნაბიჯი (სურათებით)
ხმის რეაქტიული ნათურა აჩვენებს + უცნაურ ნივთებს …: მეტი ფოტოსა და პროექტის განახლებებისთვის: @capricorn_one
პორტალი 2 Turret - ოსტატის Turret კონტროლი: 9 ნაბიჯი (სურათებით)
Portal 2 Turret-Master Turret Control: ეს პროექტი არის ჩემი ორიგინალური პორტალის Turret გაფართოება ან რემიქსი Instructables (Portal-2-Turret-Gun). ის ასევე შეიძლება გამოყენებულ იქნას როგორც იაფი კონტროლერი ყველაფრის გასაკონტროლებლად, რომელიც იყენებს nRF24L01 რადიო ჩიპს. LCD ეკრანი განსაკუთრებით სასარგებლოა, როდესაც
პორტალი 2 Companion Cube აუდიო სპიკერი: 23 ნაბიჯი (სურათებით)
პორტალი 2 კომპანიონი Cube აუდიო სპიკერი: 3D ბეჭდვა ჩემი დიდი ჰობია. ბევრ დროს ვიყენებ ჩემი საყვარელი ფილმებისა და თამაშების გულშემატკივართა ნამუშევრების შესაქმნელად; ჩვეულებრივ ნივთები მინდა, მაგრამ ვერ ვპოულობ მაღაზიებში ან ინტერნეტში შესაძენად. ყველა დროის ერთ -ერთი ჩემი საყვარელი თამაში არის პორტალი 2. როგორც პროექტის იდეა
როგორ გააკეთოთ უცნაური ხმის კლიპი: 5 ნაბიჯი
როგორ გავაკეთოთ უცნაური ხმის კლიპი: კარგი, მეორე დღეს გაბედულად ვტრიალებდი და გადავწყვიტე რაღაც უცნაური გამეკეთებინა, ამიტომ ჩავწერე სხვადასხვა ხმები და შევაგროვე ისინი უცნაური და უცნაური ხმის კლიპის მისაღებად