İçindekiler:
- Adım 1: Yeni Bir Birlik Projesi Başlatın
- Adım 2: Sahneyi Ayarlayın
- Adım 3: Biraz Parçacık Yapalım
- Adım 4: Parçacıkları Yavaşlatmak
- Adım 5: Portalı Oluşturmak
- Adım 6: Parçacık Gölgelendiriciler
- Adım 7: Skybox'ı oluşturun
- Adım 8: Portal Mantığı
- Adım 9: Neredeyse Tamamlandı
- Adım 10: Uygulamayı Telefonunuza Yükleyin
Video: Garip Şeylerden Baş Aşağıya AR Portalı: 10 Adım (Resimlerle)
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:20
Bu Eğitilebilir Kitap, iPhone için Stranger Things'in baş aşağı olmasına yol açan bir portal ile artırılmış gerçeklik mobil uygulaması oluşturmaya devam edecek. Portalın içine girebilir, dolaşabilir ve geri dönebilirsiniz. Portalın içindeki her şey, siz içeri girene kadar sadece portaldan görülebilir. İçeri girdikten sonra, siz gerçek dünyaya geri dönene kadar her şey her yerde olacak. Unity 3D video oyun motorunu Apple ARKit eklentisi ile kullanacağız. Kullanacağımız tüm yazılımlar ücretsiz olarak indirilip kullanılabilir. Takip etmek için uzman olmanıza gerek yok, her adımdan geçeceğiz!
Adım 1: Yeni Bir Birlik Projesi Başlatın
Öncelikle Unity3D'yi indirin ve IOS platformu için derleme dosyalarını yüklediğinizden emin olun. Ayrıca Xcode'u indirmeniz ve ücretsiz bir elma geliştirici hesabına kaydolmanız gerekecek. iPhone'unuzun ayrıca IOS 11 veya daha yenisini çalıştırıyor olması gerekir. Bugün 5 Şubat 2018 itibariyle, IOS 11.3 çıktı, ancak xCode 9.2 henüz bunun için destek dosyalarına sahip değil. Bu nedenle, en son IOS sürümünü kullanıyorsanız Apple. Developer.com'dan en son Xcode beta sürümünü indirdiğinizden emin olun.
Gerekli tüm programlara sahip olduğunuzda, Unity'yi açın ve yeni bir projeye başlayın, istediğiniz gibi adlandırın. Telefonumuzun kamerasını kullanarak zemini ve yerdeki nesneleri algılamak için Apple ARKit eklentisine ihtiyacımız olacak. Şimdi Asset Store sekmesine gidip "ARKit" i aratarak bunu içe aktaralım. Henüz bir hesabınız yoksa ücretsiz bir Unity hesabı oluşturmanız gerekecek, ardından eklentiyi almak için içe aktar'a tıklayın.
ARKit klasöründeki örnekler klasörüne gidin ve "UnityARKitScene" öğesini bulun. Açmak için buna çift tıklayın. Bu sahneyi bir başlangıç noktası olarak kullanacağız ve buradan yola çıkacağız. Bu sahne varsayılan olarak zemini algılamanıza izin verecek ve ekrana dokunduğunuzda o konuma bir küp yerleştirilecektir.
Önce yapı ayarlarımızı bir kenara bırakalım, böylece daha sonra yapmayı unutmayalım. Dosyaya tıklayın, ayarları oluşturun ve bu listeden tüm sahneleri kaldırın. Mevcut olanı eklemek için açık sahneler ekle'yi tıklayın. Burada kurmamız gereken son şey, oynatıcı ayarlarında paket tanımlayıcısına gitmek ve bu dizenin biçimi com. SirketinizinAdı. UygulamanızAdı'dır, bu yüzden benim durumumda com. MatthewHallberg. PortalTest gibi bir şey yapıyorum.
Adım 2: Sahneyi Ayarlayın
Önce sola bakın ve "GeneratePlanes" adlı oyun nesnesini bulun. Bu vurgulandığında, sağa bakın ve devre dışı bırakmak için onay kutusunu tıklayın. Bu şekilde, ARKit bir yer düzlemi algıladığında oluşan çirkin mavi karelere sahip değiliz. Ardından "RandomCube" oyun nesnesini silin çünkü bunu sahnemizde görmek istemiyoruz.
Şimdi önce portal kapımızı oluşturmamız gerekiyor. "HitCubeParent" öğesinin alt öğesi olan küpü silin. Sağ tıklayın ve boş oyun nesnesi oluştur'u seçin. "Portal" olarak yeniden adlandırın. Şimdi o nesneye sağ tıklayın ve bir küp oluşturun, bu onu portalın bir çocuğu yapacak. "PostLeft" olarak yeniden adlandırın ve bu portalımızın sol gönderisi olacak. x 1, y 28 ve z 1 olacak şekilde ölçeklendirin. Aynı şeyi doğru gönderi için de yapın. Şimdi üst direği oluşturun ve y'yi 14'e ölçeklendirin. Bunu yana çevirin ve diğer direkleri birleştirecek şekilde hareket ettirin. Tüm portal ölçeğini 1,3 x 1,4 x 1 yapın.
Google'a gidin ve ahşap veya ağaç kabuğu dokusu yazın. Bu görüntülerden birini indirin ve Unity'deki varlıklar klasörünüze sürükleyin. Şimdi bu resmi tüm portal gönderilerinize sürükleyin.
"Portal" nesnesine tekrar tıklayın ve sağdaki bileşen ekle'ye tıklayın. "UnityARHitTestExample" betiğini buna ekleyin. Orada "Hit Transform" için boş bir yuva var, "HitCubeParent" nesnesini o yuvaya sürükleyin.
Adım 3: Biraz Parçacık Yapalım
Şimdi portalımızın içinde duman ve yüzen parçacık efekti yapmak için Unity Particle sistemini kullanacağız. Üst menü çubuğunda Varlıklar'a, standart varlıklara gidin ve parçacık sistemlerini içe aktarın.
Portalınızın içinde iki boş oyun nesnesi oluşturun ve birine "SmokeParticles" ve diğerine "FloatingParticles" adını verin.
Duman parçacıklarına bir parçacık sistemi bileşeni ekleyin.
Bu bileşenin bir sürü seçeneği var ama sadece birkaçını değiştirmemiz gerekiyor.
Başlangıç rengini yaklaşık %50 şeffaflık ile koyu mavi bir renkle değiştirin. Emisyon oranını 100 yapın. Şeklin içinde yarıçapı.01 yapın. Alt kısımdaki oluşturucu kısmında minimum boyutu.8 ve maksimum boyutu 5 olarak değiştirin. Malzeme bileşeninde listeden sadece duman malzemesini seçin, ancak bunu daha sonra değiştireceğiz.
Yüzen parçacıklar oyun nesnesine şimdi bir parçacık sistemi ekleyin ve emisyonu 500'e ayarlayın. Başlangıç ömrünü 2'ye, yarıçapı 10'a, minimum parçacık boyutunu.01'e ve maksimum parçacık boyutunu.015'e ayarlayın. Malzemeyi şimdilik varsayılan parçacık olarak ayarlayın.
Son olarak, her iki oyun nesnesini de alın ve onları x üzerinde 90 derece döndürün ve portal kapısına yayılmaları için havaya kaldırın.
Adım 4: Parçacıkları Yavaşlatmak
Bu parçacıkların geniş bir alanı kaplamasını ve aynı zamanda yavaş hareket etmesini istediğimizden, kendi örnek fonksiyonumuzu yaratmamız gerekiyor. Varlıklar klasörüne sağ tıklayın ve yeni bir C# betiği oluşturun ve buna "ParticleSample" adını verin. Bu kodu kopyalayıp yapıştırın:
System. Collections'ı kullanarak;
System. Collections. Generic kullanarak; UnityEngine'i kullanarak; public class ParticleSample: MonoBehaviour { private ParticleSystem ps; // Başlatma için bunu kullanın void Start() { ps = GetComponent(); StartCoroutine (SampleParticleRoutine()); } IEnumerator SampleParticleRoutine(){ var main = ps.main; ana.simülasyonHız = 1000f; not. Oynat (); getiri getirisi yeni WaitForSeconds (.1f); ana.simülasyonHız =.05f; } }
Şimdi bu komut dosyasını parçacık sistemi oyun nesnelerinizin her birine sürükleyin.
Adım 5: Portalı Oluşturmak
Şimdi portalı oluşturmamız gerekiyor, bu yüzden portal oyun nesnesine sağ tıklayın ve bir dörtlü oluşturun. Dörtlü tüm portalı kaplayacak şekilde ölçeklendirin, bu bizim portal penceremiz olacak. Eklememiz gereken ilk şey portal gölgelendiricidir, bu sadece üzerinde başka bir belirli gölgelendirici bulunan nesneleri oluşturacaktır. Varlıklar klasörüne sağ tıklayın ve yeni bir aydınlatılmamış gölgelendirici oluşturun. Oradaki her şeyi kaldırın ve şu kodu yapıştırın:
Gölgelendirici "Portal/portalWindow"
{ SubShader { Zwrite off Colormask 0 Stencil'i kaldır{ Ref 1 Geçiş değiştir } Başarılı { } } }
Hiyerarşiye sağ tıklayın ve yeni bir malzeme oluşturun, buna PortalWindowMat adını verin, bu malzemenin açılır menüsünde portal bölümünü bulun ve portal penceresini seçin. Bu materyali portal dörtlü üzerine sürükleyin.
Adım 6: Parçacık Gölgelendiriciler
Varlıklar klasörüne tekrar sağ tıklayın ve yeni bir gölgelendirici oluşturun. Portalın içine giren parçacıklar için gölgelendiriciler yapmamız gerekiyor. Tüm kodu bununla değiştirin:
Gölgelendirici "Portal/Parçacıklar" {
Özellikler { _TintColor ("Tint Color", Color) = (0,5, 0,5, 0,5, 0,5) _MainTex ("Parçacık Dokusu", 2B) = "beyaz" {} _InvFade ("Yumuşak Parçacıklar Faktörü", Aralık(0.01, 3.0)) = 1.0 _Stencil("stencil", int) = 6 } Kategori { Etiketler { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } Blend SrcAlpha OneMinusSrcAlpha ColorMask RGB Kesme Aydınlatması Kapalı ZWrite Off SubShader { Stencil{ Ref 1 Comp[_Stencil] } Pass { CGPROGRAM #pragma vertex vert #pragma fragman frag #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCG.cginc_" örnekleyici fix4 _TintColor; struct appdata_t { float4 köşe: KONUM; sabit4 renk: RENK; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 köşe: SV_POSITION; sabit4 renk: RENK; float2 texcoord: TEXCOORD0; UNITY_FOG_COORDS(1) #ifdef SOFTPARTICLES_ON float4 projPos: TEXCOORD2; #endif UNITY_VERTEX_OUTPUT_STEREO }; float4 _MainTex_ST; v2f dikey (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); dönüş o; } UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture); float _InvFade; sabit4 parça (v2f i): SV_Target { #ifdef SOFTPARTICLES_ON kayan sahneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))); float partZ = i.projPos.z; kayan nokta solma = doymuş (_InvFade * (sceneZ-partZ)); i.color.a *= solma; #endif sabit4 sütun = 2.0f * i.color * tex2D(_MainTex, i.texcoord); UNITY_APPLY_FOG(i.fogCoord, col); dönüş sütunu; } ENDCG } } }
Biri portalSmoke, diğeri portalParticles adlı iki yeni malzeme oluşturun.
Her biri için bu gölgelendiriciyi, açılır menüden portallarda, parçacıklarda seçin. Duman parçacıkları için bir duman dokusu seçin ve parçacıklar için parçacık dokusunu seçin. Dumanın rengini yaklaşık %50 şeffaflık ile daha koyu maviye değiştirin. Portalınızdaki her parçacık sisteminin oluşturucu bileşenine gidin ve az önce oluşturduğumuz ilgili materyallerini seçin.
Adım 7: Skybox'ı oluşturun
Şimdi gerçekten baş aşağı bir görünüm yaratmak için her şeyi koyu maviye boyamamız gerekiyor. Bunun için şeffaf bir skybox kullanacağız, bu yüzden yeni bir shader oluşturup bu kodu yapıştırın:
Gölgelendirici "Portal/portalSkybox" {
Özellikler { _Tint ("Ton Rengi", Renk) = (.5,.5,.5,.5) [Gama] _Pozlama ("Pozlama", Aralık(0, 8)) = 1.0 _Döndürme ("Döndürme", Aralık (0, 360)) = 0 [NoScaleOffset] _Tex ("Cubemap (HDR)", Cube) = "gri" {} _Stencil("StencilNum", int) = 6 } SubShader { Etiketler { "Sıra"="Arka Plan" "RenderType"="Background" "PreviewType"="Skybox" } ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Stencil{ Ref 1 Comp[_Stencil] } Pass { CGPROGRAM #pragma vertex vert #pragma fragman frag #pragma target 2.0 #include "UnityCG".cginc" samplerCUBE _Tex; yarım4 _Tex_HDR; yarım4 _Tint; yarım _Pozlama; float _Rotation; float3 RotateAroundYInDegrees (float3 vertex, float derece) { float alpha = derece * UNITY_PI / 180.0; float sina, cosa; sincos(alfa, sina, cosa); float2x2 m = float2x2(cosa, -sina, sina, cosa); dönüş float3(mul(m, köşe.xz), köşe.y).xzy; } struct appdata_t { float4 köşe: KONUM; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 köşe: SV_POSITION; float3 texcoord: TEXCOORD0; UNITY_VERTEX_OUTPUT_STEREO }; v2f dikey (appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); float3 döndürülmüş = RotateAroundYInDegrees(v.vertex, _Rotation); o.vertex = UnityObjectToClipPos(döndürülmüş); o.texcoord = v.vertex.xyz; dönüş o; } sabit4 parça (v2f i): SV_Target { half4 tex = texCUBE (_Tex, i.texcoord); half3 c = DecodeHDR (tex, _Tex_HDR); c = c * _Tint.rgb * union_ColorSpaceDouble.rgb; c *= _Pozlama; dönüş yarısı4(c,.5); } ENDCG } } Geri Dönüş Kapalı }
Şimdi yeni bir skybox malzemesi oluşturun, buna "PortalSkybox" adını verin ve portal menüsünden bu portalSkybox gölgelendiricisini seçin. En üstte Window, Lighting'e gidin ve az önce oluşturduğumuz bu skybox'ı seçin. Ana kameraya gidin ve skybox'a net bayraklar ayarlayın. Buradayken, çarpışmaları tespit edebilmemiz için kameramıza bazı bileşenler ekleyelim. Kameraya bir katı cisim bileşeni ekleyin ve yerçekimini kullan seçeneğinin işaretini kaldırın. Bir kutu çarpıştırıcısı ekleyin ve tetikleyici olup olmadığını kontrol edin. Kutu çarpıştırıcısını.5 x 1 x 4 boyutunda yapın. Kameradaki kırpma düzlemini.01 olarak ayarlayın.
Adım 8: Portal Mantığı
Yapmamız gereken son şey, portalımızı kontrol eden mantığı oluşturmak. Yeni bir C# betiği oluşturun ve buna PortalController adını verin.
System. Collections'ı kullanarak;
System. Collections. Generic kullanarak; UnityEngine'i kullanarak; ad alanı UnityEngine. XR.iOS{ public class PortalController: MonoBehaviour { public Material materyalleri; genel MeshRenderer meshRenderer; public UnityARVideo UnityARVideo; özel bool isInside = false; özel bool isOutside = true; // Başlatma için bunu kullanın 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 = doğru; InsidePortal(); } } else { if (isInside) { isInside = false; isOutside = doğru; DışPortal(); } } } void OutsidePortal(){ StartCoroutine (DelayChangeMat (3)); } void InsidePortal(){ StartCoroutine (DelayChangeMat (6)); } IEnumerator DelayChangeMat(int stencilNum){ UnityARVideo.shouldRender = false; getiri dönüşü yeni WaitForEndOfFrame (); meshRenderer.enabled = yanlış; foreach (Malzemelerde malzeme matı) { mat. SetInt ("_Stencil", stencilNum); } getiri dönüşü yeni WaitForEndOfFrame (); meshRenderer.enabled = true; UnityARVideo.shouldRender = doğru; } } }
Bu yeni komut dosyasını portal pencerenize sürükleyin. Bu, kameramızdaki çarpıştırıcı portal penceresiyle her çarpıştığında bizi portala girip çıkaracak. Şimdi tüm malzemeleri değiştiren fonksiyonda ARkit eklentisine çerçeve oluşturmamasını söylüyoruz, bu yüzden ana kameraya gidin ve UnityARVideo betiğini açın. En üstte bir public bool ShouldRender oluşturun ve bunu true değerine ayarlayın. OnPreRender() işlevinde, her şeyi bir if ifadesine sarın, burada içindeki her şey yalnızca shouldRender doğruysa çalışır. Tüm komut dosyası şöyle görünmelidir:
Sistemi kullanarak;
System. Runtime. InteropServices'i kullanarak; UnityEngine'i kullanarak; UnityEngine. Rendering'i kullanarak; ad alanı UnityEngine. XR.iOS { public class UnityARVideo: MonoBehaviour { public Material m_ClearMaterial; [HideInInspector] public bool ShouldRender = true; özel CommandBuffer m_VideoCommandBuffer; özel Texture2D _videoTextureY; özel Texture2D _videoTextureCbCr; özel Matrix4x4 _displayTransform; private bool bCommandBufferInitialized; public void Start() { UnityARSessionNativeInterface. ARFrameUpdatedEvent += UpdateFrame; bCommandBufferInitialized = false; } void UpdateFrame(UnityARCamera kamera) { _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; } geçersiz OnDestroy() { GetComponent(). RemoveCommandBuffer(CameraEvent. BeforeForwardOpaque, m_VideoCommandBuffer); UnityARSessionNativeInterface. ARFrameUpdatedEvent -= UpdateFrame; bCommandBufferInitialized = false; } #if !UNITY_EDITOR public void OnPreRender() { if (shouldRender){ ARTextureHandles kolları = UnityARSessionNativeInterface. GetARSessionNativeInterface (. GetARVideoTextureHandles(); if (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) { dönüş; } if (!bCommandBufferInitialized) { InitializeCommandBuffer (); } Çözünürlük currentResolution = Screen.currentResolution; // Y dokusu 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("_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; } 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 } }
Adım 9: Neredeyse Tamamlandı
Son olarak ekrana tıklayıp portalı yerleştirdiğimizde hep karşımızda olmasını istiyoruz. Bunu yapmak için portaldaki "UnityARHitTestExample" betiğine gidin. İçindeki her şeyi bununla değiştirin:
Sistemi kullanarak;
System. Collections. Generic kullanarak; ad alanı UnityEngine. XR.iOS { public class UnityARHitTestExample: MonoBehaviour { public Transform m_HitTransform; genel kayan nokta maxRayDistance = 30.0f; public LayerMask crashLayer = 1 < 0) { foreach (var hitResults in hitResults) { Debug. Log ("Vuruldu!"); 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 = new Vector3 (currAngle.x, transform.eulerAngles.y, currAngle.z); true döndür; } } false döndür; } // Güncelleme çerçeve başına bir kez çağrılır void Update () { #if UNITY_EDITOR //Bu betiği yalnızca editör tarafında kullanacağız, ancak (Input. GetMouseButtonDown (0)) cihaz üzerinde çalışmasını engelleyecek hiçbir şey yok) { Ray ray = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit vuruşu; //eklenti tarafından oluşturulan düzlem çarpıştırıcı gamenesnelerinden birini vurmaya çalışacağız //HitTest'i ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent if (Physics. Raycast (ray, out hit, maxRayDistance, crashLayer) ile etkin bir şekilde çağırmaya benzer şekilde) { // konumu temas noktasından alacağız 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)); //ve düzlem çarpıştırıcısının dönüşümünden gelen dönüş 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 noktası = yeni ARPoint { x = screenPosition.x, y = screenPosition.y }; // sonuç türlerini önceliklendir ARHitTestResultType resultTypes = { ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent, // sonsuz düzlem kullanmak istiyorsanız şunu kullanın: //ARHitTestResultType. ARHitTestResultTypeExistingPlane, ARHitTestTypeestType. ARHitTResultT; foreach (SonuçTiplerinde ARHitTestResultType sonuç Türü) { if (HitTestWithResultType (nokta, sonuç Türü)) { dönüş; } } } } #endif } }
Adım 10: Uygulamayı Telefonunuza Yükleyin
Sonunda işimiz bitti. Dosyaya gidin, ayarları oluşturun ve oluştur'a tıklayın. Xcode'u açın ve derlemeden oluşturulan klasörü seçin. Geliştirme ekibinizi seçin ve uygulamayı telefonunuza yükleyin! Parçacıkların ve skybox'ın renklerini ihtiyaçlarınıza göre değiştirmek isteyebilirsiniz. Herhangi bir sorunuz varsa yorumlarda bana bildirin ve aradığınız için teşekkürler!
Önerilen:
Evinizde Bulabileceğiniz Şeylerden Basit Bir Robot Yapma (hotwheel Versiyonu): 5 Adım
Evinizde Bulabileceğiniz Şeylerden Basit Bir Robot Yapma (hotwheel Versiyonu): Bu Eğitim Tablosu size, çift A pil ile çalışan kendi kendine giden bir hotwheel'in nasıl yapıldığını gösterecektir. Sadece evinizde büyük olasılıkla bulabileceğiniz şeyleri kullanmanız gerekecek. Lütfen bu robotun muhtemelen tam olarak düz gitmeyeceğini unutmayın, bir
SASSIE: Garip Sessizlik Çözümü ve Etkileşim Artırıcı Sistemi: 5 Adım
SASSIE: Garip Sessizlik Çözümü ve Etkileşim Arttırıcı Sistemi: SASSIE, hayatımızın bir noktasında garip bir sessizlik sırasında hepimizin kendimize sorduğu sorunun cevabıdır: "Sıradaki ben mi konuşayım?" Şimdi endişelenmenize gerek yok çünkü SASSIE, garip bir sessizliği tanımak için özel olarak tasarlandı,
Sese Duyarlı Ampul Ekranları + Garip Şeyler: 8 Adım (Resimlerle)
Sese Duyarlı Ampul Ekranları + Garip Şeyler…: Daha fazla fotoğraf ve proje güncellemesi için: @capricorn_one
Garip Bir Ses Klibi Nasıl Yapılır: 5 Adım
Garip Bir Ses Klibi Nasıl Yapılır: Tamam, geçen gün cüretle ortalığı karıştırıyordum ve garip bir şey yapmaya karar verdim, bu yüzden çeşitli sesler kaydettim ve garip ve garip bir ses klibi elde etmek için bir araya getirdim
Envanter - Hızlı Bilgisayar Tanılaması Artık Yerini Aldı, Aşağıya Bakın: 6 Adım
Envanter - Hızlı Bilgisayar Teşhisi Artık Yerini Aldı, Aşağıya Bakın: Önünüzde olmayan bir bilgisayarda çalışmanız gerekirse, doğru bir envantere ihtiyacınız var. Bu talimat, tamamen bir meslektaşının bir bilgisayar için sürücü bulmakta zorlanması nedeniyle ortaya çıktı. Aida32 kişisel kullanacağım http://majorgeeks.com