Mục lục:
- Bước 1: Bắt đầu một dự án hợp nhất mới
- Bước 2: Thiết lập cảnh
- Bước 3: Hãy tạo một số hạt
- Bước 4: Làm chậm các hạt
- Bước 5: Tạo Cổng thông tin
- Bước 6: Đổ bóng hạt
- Bước 7: Tạo Skybox
- Bước 8: Cổng Logic
- Bước 9: Sắp hoàn tất
- Bước 10: Đặt ứng dụng trên điện thoại của bạn
Video: Cổng thông tin AR đến sự lộn ngược từ những điều kỳ lạ: 10 bước (có hình ảnh)
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:35
Hướng dẫn này sẽ thông qua việc tạo một ứng dụng di động thực tế tăng cường cho iPhone với một cổng dẫn đến sự lộn ngược từ Stranger Things. Bạn có thể vào bên trong cổng, đi bộ xung quanh và quay lại. Mọi thứ bên trong cổng chỉ có thể được nhìn thấy thông qua cổng cho đến khi bạn bước vào bên trong. Khi vào bên trong, mọi thứ sẽ hiển thị ở mọi nơi, cho đến khi bạn quay trở lại thế giới thực. Chúng tôi sẽ sử dụng công cụ trò chơi video Unity 3D với plugin Apple ARKit. Tất cả phần mềm chúng tôi sẽ sử dụng có thể được tải xuống và sử dụng miễn phí. Bạn không cần phải là một chuyên gia để làm theo cùng, chúng tôi sẽ đi qua từng bước!
Bước 1: Bắt đầu một dự án hợp nhất mới
Trước hết, hãy tải xuống Unity3D và đảm bảo cài đặt các tệp xây dựng cho nền tảng IOS. Bạn cũng sẽ cần tải xuống Xcode và đăng ký tài khoản nhà phát triển apple miễn phí. IPhone của bạn cũng sẽ phải chạy IOS 11 trở lên. Kể từ hôm nay, ngày 5 tháng 2 năm 2018, IOS 11.3 đã ra mắt nhưng xCode 9.2 vẫn chưa có tệp hỗ trợ cho nó. Vì vậy, nếu bạn đang chạy phiên bản IOS mới nhất, hãy đảm bảo tải xuống phiên bản Xcode beta mới nhất từ Apple. Developer.com.
Khi bạn đã có tất cả các chương trình cần thiết, hãy mở Unity và bắt đầu một dự án mới, gọi nó là bất cứ thứ gì bạn muốn. Chúng tôi sẽ cần plugin Apple ARKit để chúng tôi có thể sử dụng máy ảnh của điện thoại để phát hiện mặt đất một vị trí các đối tượng trên sàn nhà. Hãy nhập nội dung đó ngay bây giờ bằng cách chuyển đến tab Cửa hàng tài sản và tìm kiếm "ARKit". Bạn sẽ cần tạo một tài khoản Unity miễn phí nếu bạn chưa có, sau đó nhấp vào nhập để tải plugin.
Điều hướng đến thư mục ví dụ trong thư mục ARKit và tìm "UnityARKitScene." Nhấp đúp vào đó để mở nó. Chúng tôi sẽ sử dụng cảnh này làm điểm bắt đầu và xây dựng từ đây. Cảnh này theo mặc định sẽ cho phép bạn phát hiện mặt đất và khi bạn chạm vào màn hình, một khối lập phương sẽ được đặt vào vị trí đó.
Trước tiên, hãy bình phương cài đặt xây dựng của chúng tôi để chúng tôi không quên thực hiện điều đó sau. Nhấp vào tệp, cài đặt xây dựng và xóa tất cả các cảnh khỏi danh sách đó. Nhấp vào thêm cảnh đang mở để thêm cảnh hiện tại của chúng tôi. Điều cuối cùng chúng ta cần thiết lập ở đây là trong cài đặt trình phát đi xuống mã định danh gói và định dạng cho chuỗi này là com. YourCompanyName. YourAppName, vì vậy trong trường hợp của tôi, tôi làm một cái gì đó như com. MatthewHallberg. PortalTest.
Bước 2: Thiết lập cảnh
Đầu tiên hãy nhìn sang bên trái và tìm đối tượng trò chơi có tên "GeneratePlanes". Khi được đánh dấu, hãy nhìn sang bên phải và nhấp vào hộp kiểm để tắt nó. Bằng cách này, chúng tôi không có các hình vuông màu xanh xấu xí được tạo ra khi ARKit phát hiện một máy bay trên mặt đất. Tiếp theo xóa đối tượng trò chơi "RandomCube" vì chúng tôi không muốn thấy điều đó trong cảnh của chúng tôi.
Bây giờ, trước tiên chúng ta cần tạo lối vào cổng thông tin của mình. Xóa khối lập phương là con của "HitCubeParent". Nhấp chuột phải và chọn tạo đối tượng trò chơi trống. Đổi tên nó thành "Cổng thông tin". Bây giờ nhấp chuột phải vào đối tượng đó và tạo một khối lập phương, điều này sẽ làm cho nó trở thành con của cổng thông tin. Đổi tên nó thành "PostLeft" và đây sẽ là bài đăng bên trái của cổng thông tin của chúng tôi. Chia tỷ lệ để x là 1, y là 28 và z là một. Làm điều tương tự cho bài viết bên phải. Bây giờ, tạo bài đăng trên cùng và chia tỷ lệ y thành 14. Xoay nó sang một bên và di chuyển nó sao cho nó kết nối các bài đăng khác. Làm cho toàn bộ cổng có tỷ lệ 1,3 x 1,4 x 1.
Lên google và gõ kết cấu gỗ hoặc vỏ cây. Tải xuống một trong những hình ảnh đó và kéo nó vào thư mục nội dung của bạn trong Unity. Bây giờ, hãy kéo hình ảnh đó vào tất cả các bài đăng trên cổng thông tin của bạn.
Nhấp vào đối tượng "Cổng thông tin" một lần nữa và nhấp vào thêm thành phần ở bên phải. Thêm tập lệnh "UnityARHitTestExample" vào nó. Có một khe trống ở đó cho "Hit Transform", hãy kéo đối tượng "HitCubeParent" vào khe đó.
Bước 3: Hãy tạo một số hạt
Bây giờ chúng ta sẽ sử dụng hệ thống Unity Particle để tạo hiệu ứng khói và hạt lơ lửng cho bên trong cổng thông tin của chúng ta. Chuyển đến Nội dung ở thanh menu trên cùng, nội dung tiêu chuẩn và nhập hệ thống hạt.
Tạo hai đối tượng trò chơi trống bên trong cổng thông tin của bạn và gọi một đối tượng là "SmokeParticles" và đối tượng còn lại là "FloatingParticles."
Thêm một thành phần hệ thống hạt vào các hạt khói.
Thành phần này có một loạt các tùy chọn nhưng chúng ta chỉ cần thay đổi một vài tùy chọn.
Thay đổi màu bắt đầu thành màu xanh lam đậm với độ trong suốt khoảng 50%. Làm cho tỷ lệ phát xạ 100. Hình dạng bên trong, làm cho bán kính.01. Trong phần trình kết xuất ở dưới cùng, thay đổi kích thước tối thiểu thành.8 và kích thước tối đa thành 5. Trên thành phần material, chỉ cần chọn vật liệu khói từ danh sách, nhưng chúng tôi sẽ thay đổi điều này sau.
Thêm một hệ thống hạt vào đối tượng trò chơi các hạt trôi nổi ngay bây giờ và đặt mức phát xạ thành 500. Đặt thời gian tồn tại bắt đầu thành 2, bán kính thành 10, kích thước hạt tối thiểu là 0,01 và kích thước hạt tối đa là 0,15. Đặt vật liệu thành hạt mặc định ngay bây giờ.
Cuối cùng, lấy cả hai vật thể trò chơi và xoay chúng 90 độ trên x và nâng chúng lên không trung để chúng phát ra từ cửa cổng thông tin.
Bước 4: Làm chậm các hạt
Vì chúng ta muốn những hạt này bao phủ một khu vực rộng lớn nhưng cũng di chuyển chậm, chúng ta cần tạo ra hàm mẫu của riêng chúng ta. Vì vậy, hãy nhấp chuột phải vào thư mục nội dung và tạo một tập lệnh C # mới và gọi nó là "ParticleSample". Sao chép và dán mã này:
sử dụng System. Collections;
sử dụng System. Collections. Generic; sử dụng UnityEngine; public class ParticleSample: MonoBehaviour {private ParticleSystem ps; // Sử dụng cái này để khởi tạo void Start () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. Play (); lợi nhuận trả về WaitForSeconds mới (.1f); main.simulationSpeed =.05f; }}
Bây giờ hãy kéo tập lệnh này vào từng đối tượng trò chơi hệ thống hạt của bạn.
Bước 5: Tạo Cổng thông tin
Bây giờ chúng ta cần tạo cổng, vì vậy hãy nhấp chuột phải vào đối tượng cổng trò chơi và tạo một quad. Chia tỷ lệ quad để nó bao phủ toàn bộ cổng thông tin, đây sẽ trở thành cửa sổ cổng thông tin của chúng tôi. Điều đầu tiên chúng ta cần thêm vào nó là bộ đổ bóng cổng thông tin, điều này sẽ chỉ hiển thị các đối tượng với một bộ đổ bóng cụ thể khác trên chúng. Nhấp chuột phải vào thư mục nội dung và tạo một bộ đổ bóng mới. Xóa mọi thứ trong đó và dán vào mã này:
Shader "Portal / PortalWindow"
{SubShader {Zwrite off Colormask 0 cull off Stencil {Ref 1 Pass thay thế} Pass {}}}
Nhấp chuột phải vào hệ thống phân cấp và tạo một tài liệu mới, gọi nó là PortalWindowMat, trong menu thả xuống cho tài liệu này, hãy tìm phần cổng thông tin và chọn cửa sổ cổng thông tin. Kéo vật liệu này vào quad cổng thông tin của bạn.
Bước 6: Đổ bóng hạt
Nhấp chuột phải vào thư mục nội dung một lần nữa và tạo một bộ đổ bóng mới. Chúng ta cần tạo bóng đổ cho các hạt đi bên trong cổng thông tin. Thay thế tất cả mã bằng mã này:
Shader "Cổng / Hạt" {
Thuộc tính {_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} Danh mục {Thẻ {"Hàng đợi" = "Trong suốt" "Bỏ quaProjector" = "Đúng" "RenderType" = "Trong suốt" "PreviewType" = "Mặt phẳng"} Hỗn hợp SrcAlpha OneMinusSrcAlpha ColorMask RGB Cull Off Lighting Tắt ZWrite Off SubShader {Stencil {Ref 1 Comp [_Stencil]} Vượt qua {CGPROGRAM #pragma vertex vert #pragmagment frag #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #includeex "UnityC" fixed4 _TintColor; struct appdata_t {float4 vertex: POSITION; fixed4 màu: MÀU SẮC; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; struct v2f {float4 vertex: SV_POSITION; fixed4 màu: MÀU SẮC; 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); trả lại 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 phai = saturate (_InvFade * (sceneZ-partZ)); i.color.a * = mờ dần; #endif fixed4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, col); trả lại col; } ENDCG}}}}
Tạo hai vật liệu mới, một được gọi là PortalSmoke và một được gọi là PortalParticles.
Đối với mỗi người, hãy chọn bộ đổ bóng này, từ trình đơn thả xuống, trong cổng thông tin, các hạt. Đối với các hạt khói, hãy chọn kết cấu khói và đối với các hạt chọn kết cấu hạt. Thay đổi màu của khói thành màu xanh đậm hơn với độ trong suốt khoảng 50%. Đi tới thành phần trình kết xuất của từng hệ thống hạt trong cổng thông tin của bạn và chọn vật liệu tương ứng của chúng mà chúng tôi vừa tạo.
Bước 7: Tạo Skybox
Bây giờ để thực sự tạo ra kiểu giao diện lộn ngược, chúng ta phải tô mọi thứ bằng màu xanh lam đậm. Đối với điều này, chúng tôi sẽ sử dụng một skybox trong suốt, vì vậy hãy tạo một bộ đổ bóng mới và dán vào mã này:
Shader "Portal / PortalSkybox" {
Thuộc tính {_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" = "Background" "PreviewType" = "Skybox"} Cull Off ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Stencil {Ref 1 Comp [_Stencil]} Vượt qua {CGPROGRAM #pragma vertex vert #pragmagment frag #pragma target 2.0 #include ".cginc "samplerCUBE _Tex; nửa4 _Tex_HDR; nửa4 _ Gợi ý; nửa _Phơi sáng; float _Rotation; float3 RotateAroundYInDegrees (đỉnh float3, độ nổi) {float alpha = độ * UNITY_PI / 180.0; float sina, cosa; sincos (alpha, sina, cosa); float2x2 m = float2x2 (cosa, -sina, sina, cosa); trả về 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 (o); float3 quay = RotateAroundYInDegrees (v.vertex, _Rotation); o.vertex = UnityObjectToClipPos (xoay); o.texcoord = v.vertex.xyz; trả lại o; } fixed4 frag (v2f i): SV_Target {half4 tex = texCUBE (_Tex, i.texcoord); half3 c = DecodeHDR (tex, _Tex_HDR); c = c * _Tint.rgb * union_ColorSpaceDouble.rgb; c * = _Phục vụ; trả về nửa4 (c,.5); } ENDCG}} Tắt dự phòng}
Bây giờ, tạo một vật liệu skybox mới, gọi nó là "PortalSkybox" và chọn bộ đổ bóng PortalSkybox này từ menu cổng thông tin. Đi tới Window, Lighting, ở trên cùng và chọn skybox mà chúng ta vừa tạo. Đi tới máy ảnh chính và đặt cờ rõ ràng vào skybox. Trong khi chúng tôi ở đây, hãy thêm một số thành phần trên máy ảnh của chúng tôi để chúng tôi có thể phát hiện va chạm. Thêm một thành phần thân cứng vào máy ảnh và bỏ chọn sử dụng trọng lực. Thêm một máy va chạm hộp và kiểm tra là kích hoạt. Tạo kích thước hộp va chạm.5 x 1 x 4. Đặt mặt phẳng cắt trên máy ảnh thành.01.
Bước 8: Cổng Logic
Điều cuối cùng chúng ta cần làm là tạo logic điều khiển cổng thông tin của chúng ta. Tạo một tập lệnh C # mới và gọi nó là PortalController.
sử dụng System. Collections;
sử dụng System. Collections. Generic; sử dụng UnityEngine; namespace UnityEngine. XR.iOS {public class PortalController: MonoBehaviour {public Material vật liệu; công khai MeshRenderer meshRenderer; public UnityARVideo UnityARVideo; bool riêng isInside = false; bool riêng isOutside = true; // Sử dụng cái này để khởi tạo void Start () {OutsidePortal (); } void OnTriggerStay (Collider col) {Vector3 playerPos = Camera.main.transform.position + Camera.main.transform.osystem * (Camera.main.nearClipPlane * 4); if (biến đổi. 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; lợi nhuận trả về WaitForEndOfFrame mới (); meshRenderer.enabled = false; foreach (Chất liệu mat trong vật liệu) {mat. SetInt ("_Stencil", stencilNum); } kết quả trả về WaitForEndOfFrame mới (); meshRenderer.enabled = true; UnityARVideo.shouldRender = true; }}}
Kéo tập lệnh mới này vào cửa sổ cổng thông tin của bạn. Điều này sẽ chuyển chúng ta vào và ra khỏi cổng thông tin bất cứ khi nào máy va chạm trên máy ảnh của chúng ta va chạm với cửa sổ cổng. Bây giờ trong chức năng thay đổi tất cả các tài liệu, chúng tôi yêu cầu plugin ARkit không kết xuất khung hình, vì vậy hãy chuyển đến camera chính và mở tập lệnh UnityARVideo. Tạo một bool công khai shouldRender ở trên cùng và đặt nó bằng true. Trong hàm OnPreRender () gói mọi thứ trong một câu lệnh if, trong đó mọi thứ bên trong sẽ chỉ chạy nếu shouldRender là true. Toàn bộ tập lệnh sẽ trông như thế này:
sử dụng Hệ thống;
sử dụng System. Runtime. InteropServices; sử dụng UnityEngine; sử dụng UnityEngine. Rendering; không gian tên UnityEngine. XR.iOS {public class UnityARVideo: MonoBehaviour {public Material m_ClearMaterial; [HideInIns Inspector] public bool shouldRender = true; CommandBuffer riêng m_VideoCommandBuffer; riêng Texture2D _videoTextureY; riêng Texture2D _videoTextureCbCr; riêng Matrix4x4 _displayTransform; bool riêng tư bCommandBufferInitialized; public void Start () {UnityARSessionNativeInterface. ARFrameUpdatedEvent + = UpdateFrame; bCommandBufferInitialized = false; } 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 = true; } void OnDestroy () {GetComponent (). RemoveCommandBuffer (CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent - = UpdateFrame; bCommandBufferInitialized = false; } #if! UNITY_EDITOR public void OnPreRender () {if (shouldRender) {ARTextureHandles Xử lý = UnityARSessionNativeInterface. GetARSessionNativeInterface (). GetARVideoTextureHandles (); if (handle.textureY == System. IntPtr. Zero || handle.textureCbCr == System. IntPtr. Zero) {return; } if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } Độ phân giải currentResolution = Screen.currentResolution; // Kết cấu Y if (_videoTextureY == null) {_videoTextureY = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. R8, false, false, (System. IntPtr) handle.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) handle.textureCbCr); _videoTextureCbCr.filterMode = FilterMode. Bilinear; _videoTextureCbCr.wrapMode = TextureWrapMode. Repeat; m_ClearMaterial. SetTexture ("_ textureCbCr", _videoTextureCbCr); } _videoTextureY. UpdateExternalTexture (handle.textureY); _videoTextureCbCr. UpdateExternalTexture (handle.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}}
Bước 9: Sắp hoàn tất
Cuối cùng khi chúng ta nhấp vào màn hình và đặt cổng mà chúng ta muốn nó luôn đối diện với chúng ta. Để thực hiện việc này, hãy truy cập tập lệnh "UnityARHitTestExample" trên cổng thông tin. Thay thế mọi thứ bên trong bằng cái này:
sử dụng Hệ thống;
sử dụng System. Collections. Generic; không gian tên UnityEngine. XR.iOS {public class UnityARHitTestVí dụ: MonoBehaviour {public Transform m_HitTransform; public float maxRayDistance = 30.0f; public LayerMask va chạmLayer = 1 <0) {foreach (var hitResult in hitResults) {Debug. Log ("Đã trúng!"); 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 = biến đổi.eulerAngles; biến đổi. LookAt (Camera.main.transform); biến đổi.eulerAngles = new Vector3 (currAngle.x, biến đổi.eulerAngles.y, currAngle.z); trả về true; }} trả về false; } // Cập nhật được gọi một lần cho mỗi khung void Update () {#if UNITY_EDITOR // chúng tôi sẽ chỉ sử dụng tập lệnh này ở phía trình chỉnh sửa, mặc dù không có gì ngăn nó hoạt động trên thiết bị nếu (Input. GetMouseButtonDown (0)) {Tia ray = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit nhấn; // chúng tôi sẽ cố gắng tấn công một trong các đối tượng trò chơi máy bay va chạm được tạo bởi plugin // tương tự như cách gọi HitTest bằng ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent if (Physics. Raycast (ray, out hit, maxRayDistance, vaLayer))) {// chúng ta sẽ lấy vị trí từ điểm tiếp xúc 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)); // và chuyển động quay từ biến đổi của máy va chạm mặt phẳng 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 = new ARPoint {x = screenPosition.x, y = screenPosition.y}; // Ưu tiên reults loại ARHitTestResultType = {resultTypes ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent, // nếu bạn muốn sử dụng máy bay vô hạn sử dụng này: //ARHitTestResultType. ARHitTestResultTypeExistingPlane, ARHitTestResultType. ARHitTestResultTypeHorizontalPlane, ARHitTestResultType. ARHitTestResultTypeFeaturePoint}; foreach (ARHitTestResultType resultType in resultTypes) {if (HitTestWithResultType (point, resultType)) {return; }}}} #endif}}}
Bước 10: Đặt ứng dụng trên điện thoại của bạn
Cuối cùng thì chúng ta cũng đã hoàn thành. Đi tới tệp, cài đặt xây dựng và nhấp vào xây dựng. Mở Xcode và chọn thư mục đã được tạo từ bản dựng. Chọn nhóm phát triển của bạn và đưa ứng dụng vào điện thoại của bạn! Bạn có thể muốn thay đổi màu sắc của các hạt và hộp bầu trời để phù hợp với nhu cầu của mình. Hãy cho tôi biết trong phần bình luận nếu bạn có bất kỳ câu hỏi nào và cảm ơn bạn đã tìm kiếm!
Đề xuất:
Gương không-nên-thông-minh-nhưng-rất-lành-nhưng-hơi-rùng rợn: 5 bước (có hình ảnh)
Gương không-nên-thông-minh-nhưng-rất-tốt-nhưng-hơi-đáng sợ: Bạn đang cần một chiếc gương nhưng không muốn thêm một đồ vật thông minh nào khác vào ngôi nhà của bạn? Vậy thì chiếc gương không-nên-thông-minh-nhưng-rất-lành-tính-hơi-đáng sợ này là phù hợp với bạn
ESP8266 RGB LED STRIP Điều khiển WIFI - NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi - Điều khiển điện thoại thông minh RGB LED STRIP: 4 bước
ESP8266 RGB LED STRIP Điều khiển WIFI | NODEMCU làm điều khiển từ xa hồng ngoại cho dải đèn Led được điều khiển qua Wi-Fi | Điều khiển bằng điện thoại thông minh RGB LED STRIP: Xin chào các bạn trong hướng dẫn này, chúng ta sẽ học cách sử dụng gật đầu hoặc esp8266 làm điều khiển từ xa IR để điều khiển dải LED RGB và Nodemcu sẽ được điều khiển bằng điện thoại thông minh qua wifi. Vì vậy, về cơ bản bạn có thể điều khiển DÂY CHUYỀN LED RGB bằng điện thoại thông minh của mình
Giữ cho con bạn mát mẻ trong mùa hè này - Điều khiển quạt câm bằng những điều thông minh!: 6 bước (kèm hình ảnh)
Giữ cho con bạn mát mẻ trong mùa hè này - Điều khiển quạt câm bằng những thứ thông minh !: Kể từ hai tuần trước vào thời điểm viết bài này, tôi đã trở thành bố của một cậu bé đáng kinh ngạc! Khi mùa thay đổi, ngày dài hơn và nhiệt độ ấm dần lên, tôi nghĩ sẽ rất tốt nếu có một loại màn hình nào đó trong n
Ngày của VALENTINE Những chú chim tình yêu: Hộp để gửi và nhận tin nhắn âm thanh qua điện tín: 9 bước (có hình ảnh)
VALENTINE'S DAY Tình yêu Chim: Hộp để Gửi và Nhận Tin nhắn âm thanh Telegram: xem video tại đây Tình yêu (chim) là gì? Oh Baby đừng làm hại tôi, đừng làm tôi đau nữa Đây là một thiết bị độc lập nhận gửi tin nhắn thoại cho người yêu, gia đình hoặc bạn bè của bạn. Mở hộp, nhấn nút trong khi bạn đang nói, nhả ra để gửi
Công tắc đèn điều khiển từ xa bằng Bluetooth - Trang bị thêm. Công tắc đèn vẫn hoạt động, không cần ghi thêm.: 9 bước (có hình ảnh)
Công tắc đèn điều khiển từ xa bằng Bluetooth - Trang bị thêm. Công tắc đèn vẫn hoạt động, không cần ghi thêm.: Cập nhật ngày 25 tháng 11 năm 2017 - Đối với phiên bản Công suất cao của dự án này có thể kiểm soát hàng kilowatt tải, hãy xem Trang bị thêm Điều khiển BLE cho tải công suất cao - Không cần thêm dây Ngày 15 tháng 11 năm 2017 - Một số bo mạch / ngăn xếp phần mềm BLE