AR порталы чоочун нерселердин үстү жагына: 10 кадам (сүрөттөр менен)
AR порталы чоочун нерселердин үстү жагына: 10 кадам (сүрөттөр менен)
Anonim
AR порталы чоочун нерселерден өйдө карай
AR порталы чоочун нерселерден өйдө карай
AR порталы чоочун нерселерден өйдө карай
AR порталы чоочун нерселерден өйдө карай

Бул Instructable iPhone үчүн кеңейтилген реалдуу мобилдик тиркемени түзүү аркылуу өтөт, ал порталы менен бейтааныш нерселерди тескери бурат. Сиз порталдын ичине кирип, ары -бери басып, кайра чыга аласыз. Порталдын ичиндегилердин баары портал аркылуу гана көрүнөт, сиз ичине кирмейинче. Киргенден кийин, реалдуу дүйнөгө кайтып келмейинче, баары бардык жерде болот. Биз Apple ARKit плагини менен Unity 3D видео оюн кыймылдаткычын колдонобуз. Биз колдоно турган бардык программаларды жүктөп алып, бекер колдонсо болот. Эксперт болуунун кажети жок, биз ар бир кадамды басып өтөбүз!

1 -кадам: Жаңы биримдик долбоорун баштаңыз

Жаңы биримдик долбоорун баштаңыз
Жаңы биримдик долбоорун баштаңыз

Биринчиден, Unity3D жүктөп алып, IOS платформасы үчүн курулган файлдарды орнотууну тактаңыз. Сиз ошондой эле Xcode жүктөп алып, бекер алма иштеп чыгуучунун эсебине катталууңуз керек болот. Сиздин iPhone да IOS 11 же андан жогору иштеши керек. Бүгүн, 5 -февралда, 2018 -жылы, IOS 11.3 чыгып жатат, бирок xCode 9.2де азырынча аны колдогон файлдар жок. Ошентип, эгер сиз эң акыркы IOS версиясын иштетип жатсаңыз, Apple. Developer.com сайтынан акыркы Xcode бета версиясын жүктөп алыңыз.

Бардык керектүү программаларга ээ болгондон кийин, Биримдикти ачыңыз жана жаңы долбоорду баштаңыз, аны каалаган нерсеңизге чакырыңыз. Биз Apple ARKit плагинине муктаж болобуз, ошондо биз телефондун камерасын колдонуп, жердеги нерселерди көрө алабыз. Келгиле, муну азыр Asset Store өтмөгүнө өтүп, "ARKit" деп издеп көрөлү. Эгер сизде жок болсо, бекер Unity эсебин түзүшүңүз керек, андан кийин плагинди алуу үчүн импортту чыкылдатыңыз.

ARKit папкасындагы мисалдар папкасына өтүңүз жана "UnityARKitScene" табыңыз. Аны ачуу үчүн муну эки жолу чыкылдатыңыз. Биз бул көрүнүштү баштапкы чекит катары колдонобуз жана ушул жерден курабыз. Бул көрүнүш демейки боюнча жерди аныктоого мүмкүндүк берет жана экранды таптаганда, ошол абалга куб коюлат.

Келгиле, адегенде биздин орнотуу жөндөөлөрүбүздү төрт бурчтуу кылып алалы, кийинчерээк муну унутпайлы. Файлды чыкылдатыңыз, орнотууларды түзүңүз жана ошол тизмеден бардык көрүнүштөрдү алып салыңыз. Учурдагы көрүнүштү кошуу үчүн ачык көрүнүштөрдү кошууну басыңыз. Бул жерде орнотушубуз керек болгон акыркы нерсе - оюнчу жөндөөлөрүндө топтомдун идентификаторуна түшүү жана бул саптын форматы com. YourCompanyName. YourAppName, ошондуктан менин учурда мен com. MatthewHallberg. PortalTest сыяктуу бир нерсе кылам.

2 -кадам: Сахнаны орнотуу

Сахнаны орнотуу
Сахнаны орнотуу

Адегенде солго карап, "GeneratePlanes" деп аталган оюн объектисин табыңыз. Муну баса белгилеп, азыр оңго карап, аны өчүрүү үчүн белгилөө кутучасын басыңыз. Ошентип, бизде ARKit жердеги учакты аныктаганда, чиркин көк квадраттар пайда болбойт. Кийинки "RandomCube" оюн объектисин жок кылыңыз, анткени биз муну биздин сахнада көргүбүз келбейт.

Эми биз адегенде биздин порталдын эшигин түзүшүбүз керек. "HitCubeParent" баласынын кубун жок кылыңыз. Оң баскыч менен чыкылдатыңыз жана бош оюн объектисин түзүңүз. Аны "Портал" деп атоо. Эми ошол объектти оң баскыч менен чыкылдатып, кубду түзүңүз, бул аны порталдын баласы кылат. Анын атын "PostLeft" деп өзгөртүңүз жана бул биздин порталдын сол посту болот. Муну масштабдаштырыңыз: x 1 y - 28, z - бир. Туура пост үчүн да ушундай кылыңыз. Эми эң жогорку постту түзүп, у -ну 14кө чейин масштабдаңыз. Муну капталга буруп, башка постторду бириктирип тургандай жылдырыңыз. Порталдын бардык масштабын 1.3 x 1.4 x 1 кылыңыз.

Googleга кирип, жыгач же кабык текстурасын териңиз. Ошол сүрөттөрдүн бирин жүктөп алып, Unityдеги активдер папкасына сүйрөңүз. Эми бул сүрөттү бардык портал постторуңузга сүйрөңүз.

Кайра "Портал" объектисин басыңыз жана оң жактагы компонентти кошууну басыңыз. Ага "UnityARHitTestExample" скриптин кошуңуз. Ал жерде "Hit Transform" үчүн бош орун бар, "HitCubeParent" объектин ошол уячага сүйрөңүз.

3 -кадам: Келгиле, кээ бир бөлүкчөлөрдү жасайбыз

Келгиле, кээ бир бөлүкчөлөрдү жасайбыз
Келгиле, кээ бир бөлүкчөлөрдү жасайбыз

Эми биз порталдын ичине түтүн жана өзгөрмөлүү бөлүкчө эффектин чыгаруу үчүн Unity Particle системасын колдонобуз. Жогорку меню тилкесиндеги Активдерге, стандарттык активдерге жана импорттук бөлүкчө системаларына өтүңүз.

Порталыңыздын ичинде эки бош оюн объектисин түзүңүз жана бирин "SmokeParticles", экинчисин "FloatingParticles" деп атаңыз.

Түтүн бөлүкчөлөрүнө бөлүкчө системасынын компонентин кошуңуз.

Бул компоненттин көптөгөн варианттары бар, бирок биз жубайларды гана алмаштырышыбыз керек.

Башталыштын түсүн болжол менен 50% тунуктук менен кочкул көккө өзгөртүңүз. Эмиссиянын ылдамдыгын 100. Ичиндеги форманы, радиусту түзүңүз.01. Төмөндөгү рендерер бөлүгүндө мин өлчөмүн.8ге жана максималдуу өлчөмдү 5ке өзгөртүңүз. Материалдык компонентте тизмеден түтүн материалын тандап алыңыз, бирок биз муну кийинчерээк өзгөртөбүз.

Учуучу бөлүкчөлөр оюн объектисине азыр бөлүкчө системасын кошуңуз жана эмиссияны 500гө коюңуз. Старттын иштөө мөөнөтүн 2, радиусун 10, мини бөлүкчөлөрдүн өлчөмүн.01ге жана бөлүкчөлөрдүн максималдуу өлчөмүн.015ке коюңуз. Азырынча материалды демейки бөлүкчөгө коюңуз.

Акыры, эки оюн объектисин алып, аларды x боюнча 90 градуска буруп, асманга көтөрүңүз, алар порталдын эшигине түшүп жатышат.

4 -кадам: Бөлүкчөлөрдү жайлатуу

Бөлүкчөлөрдү жайлатуу
Бөлүкчөлөрдү жайлатуу

Биз бул бөлүкчөлөрдүн чоң аймакты ээлешин каалайбыз, бирок жай кыймылдайбыз, өзүбүздүн үлгү функциябызды түзүүбүз керек. Ошентип, активдер папкасын оң баскыч менен чыкылдатып, жаңы C# скриптин түзүп, аны "ParticleSample" деп атаңыз. Бул кодго көчүрүү жана чаптоо:

System. Collections колдонуу;

System. Collections. Generic колдонуу; UnityEngine колдонуу; коомдук класс ParticleSample: MonoBehaviour {private ParticleSystem ps; // Муну баштоо үчүн колдонуңуз void Start () {ps = GetComponent (); StartCoroutine (SampleParticleRoutine ()); } IEnumerator SampleParticleRoutine () {var main = ps.main; main.simulationSpeed = 1000f; ps. Play (); кирешелүүлүк жаңы WaitForSeconds (.1f) кайтаруу; main.simulationSpeed =.05f; }}

Эми бул скриптти бөлүкчө системасындагы оюн объектилеринин ар бирине сүйрөңүз.

5 -кадам: Портал түзүү

Портал түзүү!
Портал түзүү!

Эми биз порталды түзүшүбүз керек, андыктан порталдын оюн объектисин оң баскыч менен чыкылдатып, төрт бурчтукту түзүшүбүз керек. Төртөлүктү масштабдаштырып, ал порталдын бардыгын камтыйт, бул биздин порталдын терезеси болуп калат. Биринчи нерсе, биз порталдын шейдерин кошушубуз керек, бул объекттерди башка конкреттүү шейдер менен гана көрсөтөт. Активдер папкасына оң баскыч менен чыкылдатып, жаңы өчүрүлбөгөн шейдер түзүңүз. Ал жердеги бардыгын алып салып, бул кодго чаптаңыз:

Шейдер "Portal/portalWindow"

{SubShader {Zwrite off Colormask 0 трафаретти өчүрүү {Ref 1 Pass алмаштыруу} Pass {}}}

Иерархияда оң баскыч менен чыкылдатып, жаңы материалды түзүңүз, аны PortalWindowMat деп атаңыз, бул материалдын ачылуучу тизмесинде портал бөлүмүн таап, портал терезесин тандаңыз. Бул материалды порталдын төрт тарабына сүйрөңүз.

6 -кадам: Бөлүкчө Шейдерлери

Particle Shaders
Particle Shaders

Активдер папкасын кайра оң баскыч менен чыкылдатып, жаңы шейдер түзүңүз. Биз порталдын ичине кирген бөлүкчөлөр үчүн шейдерлерди жасашыбыз керек. Бул менен бардык кодду алмаштырыңыз:

Шейдер "Портал/Бөлүкчөлөр" {

Сыпаттары {_TintColor ("Түсү Түсү", Түсү) = (0.5, 0.5, 0.5, 0.5) _MainTex ("Бөлүкчөлөрдүн Текстурасы", 2D) = "ак" {} _InvFade ("Жумшак Бөлүкчөлөр Фактору", Диапазону (0.01, 3.0)) = 1.0 _Stencil ("stencil", int) = 6} Категория {Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane"} 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 #Cincin "UnincLegTime" fixed4 _TintColor; struct appdata_t {float4 чокусу: POSITION; fixed4 color: COLOR; float2 texcoord: TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID}; v2f struct {float4 чокусу: SV_POSITION; fixed4 color: 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)))); floZ partZ = i.projPos.z; float fade = каныккан (_InvFade * (sceneZ-partZ)); i.color.a *= өчөт; #endif fixed4 col = 2.0f * i.color * tex2D (_MainTex, i.texcoord); UNITY_APPLY_FOG (i.fogCoord, col); return col; } ENDCG}}}}

Эки жаңы материалды түзүңүз, бири portalSmoke деп аталат, жана бири portalParticles деп аталат.

Ар бири үчүн порталдарда, бөлүкчөлөрдө, түшүрүлүүчү бул шейдерди тандаңыз. Түтүн бөлүкчөлөрү түтүн текстурасын, бөлүкчөлөр үчүн бөлүкчө текстурасын тандашат. Түтүндүн түсүн болжол менен 50% тунуктук менен кочкул көккө өзгөртүңүз. Порталыңыздагы ар бир бөлүкчө системасынын рендерер компонентине барып, биз түзгөн тиешелүү материалдарды тандаңыз.

7 -кадам: Skyboxту түзүңүз

Skybox түзүү
Skybox түзүү

Эми чындап эле тескери көрүнүштү түзүү үчүн, биз бардыгын кочкул көк түскө боёшубуз керек. Бул үчүн биз тунук асман кутусун колдонобуз, андыктан жаңы шейдер жасап, бул кодго чаптаңыз:

Шейдер "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) = "grey" {} _Stencil ("StencilNum", int) = 6} SubShader {Tags {"Queue" = "Background" "RenderType" = "Фон" "PreviewType" = "Skybox"} ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Stencil {Ref 1 Comp [_Stencil]} Pass {CGPROGRAM #pragma vertex vert #pragma fragment fragment #pragma target 2.0CClude Uncred.cginc "samplerCUBE _Tex; half4 _Tex_HDR; half4 _Tint; жарым _Экспозиция; float _Rotation; float3 RotateAroundYInDegrees (float3 чокусу, сүзүү даражалары) {float alpha = градус * UNITY_PI / 180.0; float sina, cosa; sincos (альфа, сина, коса); 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}; v2f struct {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 * birlik_ColorSpaceDouble.rgb; c *= _Экспозиция; return half4 (c,.5); } ENDCG}} Кайра түшүү}

Эми жаңы Skybox материалын түзүңүз, аны "PortalSkybox" деп атап, портал менюсунан ушул portalSkybox шейдерин тандаңыз. Үстүнкү жагындагы Терезеге, Жарыкка өтүңүз жана биз түзгөн бул асман кутусун тандаңыз. Негизги камерага өтүңүз жана Skyboxко ачык желектерди коюңуз. Биз бул жерде болгонубузда, камерага айрым компоненттерди кошуп, кагылышууларды аныктай алабыз. Камерага rigidbody компонентин кошуп, гравитацияны колдонууну белгилеңиз. Бир кутуча коллайдерин кошуп, триггерди текшериңиз. Кутуча коллекторлорунун өлчөмүн.5 x 1 x 4. Камерага кыркуу тегиздигин.01 кылып коюңуз.

8 -кадам: Порталдын логикасы

Portal Logic
Portal Logic

Акыркы кылышыбыз керек, биздин порталды башкарган логиканы түзүү. Жаңы C# скриптин түзүңүз жана аны PortalController деп атаңыз.

System. Collections колдонуу;

System. Collections. Generic колдонуу; UnityEngine колдонуу; аттар мейкиндиги UnityEngine. XR.iOS {коомдук классы PortalController: MonoBehaviour {коомдук материалдар материалдары; коомдук MeshRenderer meshRenderer; коомдук UnityARVideo UnityARVideo; private bool isInside = false; 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 = 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; кайтарымдуулукту кайтаруу жаңы 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 {коомдук классы UnityARVideo: MonoBehaviour {public Material m_ClearMaterial; [HideInInspector] public bool shouldRender = true; жеке CommandBuffer m_VideoCommandBuffer; жеке Texture2D _videoTextureY; жеке Texture2D _videoTextureCbCr; жеке Matrix4x4 _displayTransform; private bool 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 handles = UnityARSessionNativeInterface. GetARSessionNativeInterface (). GetARVideoTextureHandles (); if (handles.textureY == System. IntPtr. Zero || handles.textureCbCr == System. IntPtr. Zero) {return; } if (! bCommandBufferInitialized) {InitializeCommandBuffer (); } Resolution currentResolution = Screen.currentResolution; // Текстура 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 ("_ textureY", _videoTextureY); } // Текстура CbCr if (_videoTextureCbCr == null) {_videoTextureCbCr = Texture2D. CreateExternalTexture (currentResolution.width, currentResolution.height, TextureFormat. RG16, false, false, (System. IntPtr) handles.textureCb) _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; } public void 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 {коомдук классы UnityARHitTestExample: MonoBehaviour {public Transform 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 = жаңы Vector3 (CurrAngle.x, transform.eulerAngles.y, currAngle.z); чындыкка кайтуу; }} false; } // Жаңыртуу кадрга бир жолу чакырылат void Update () {#if UNITY_EDITOR // биз бул сценарийди редактор тарабында гана колдонобуз, бирок эгерде (Input. GetMouseButtonDown (0)) {Ray ray = Camera.main. ScreenPointToRay (Input.mousePosition); RaycastHit хит; // биз плагин жараткан учак коллайдер оюн объектилеринин бирине урунууга аракет кылабыз // натыйжалуу түрдө ARHitTestResultType. ARHitTestResultTypeExistingPlaneUsingExtent менен HitTestти чакырганга окшош (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 (point, resultType)) {return; }}}} #endif}}}

10 -кадам: Колдонмону телефонуңузга коюңуз

Телефонуңузга тиркемени коюңуз!
Телефонуңузга тиркемени коюңуз!

Акыры бүттүк. Файлга өтүңүз, орнотууларды түзүңүз жана курууну басыңыз. Xcode ачып, түзүлүштөн түзүлгөн папканы тандаңыз. Өнүктүрүү тобуңузду тандап, колдонмону телефонуңузга коюңуз! Сиз муктаждыктарыңызга ылайык бөлүкчөлөрдүн жана асман кутусунун түстөрүн өзгөрткүңүз келиши мүмкүн. Суроолоруңуз болсо, комментарийлерде мага билдириңиз жана издегениңиз үчүн рахмат!

Сунушталууда: