2016-03-25 4 views
1

Я создаю простую карточную игру google в единстве, и я хочу добавить счет. Я знаю, как это делать обычно, но в VR это не работает для меня. Я попытался просто поместить в него текст и отобразить счет, и он выглядел неплохо (не совсем потому, что он отображался только для одного глаза), но после того, как я его протестировал, текст моего телефона был в совершенно другом месте. Вы знаете, как правильно это сделать?GUI в VR для Google Картон в Unity

+0

Вы смотрите на картонный дизайн приложения из картона, есть много подсказок или exp для vr. – tim

ответ

2

Создайте мир Пространство и сделайте этот холст прикрепленным к камере. То, как я получаю свой интерфейс в играх VR.

Вам понадобится пользовательский шейдер для объектов World Space UI, у которых есть Render Order to Overlay и выключен ZTest.

Это копия шейдера по умолчанию UI с необходимыми изменениями. Должен сделать трюк. Просто создайте материал с помощью этого шейдера и примените его ко всему, что вы хотите нарисовать поверх геометрии в своем пользовательском интерфейсе WorldSpace.

Shader "UI/Default_OverlayNoZTest" 
{ 
    Properties 
    { 
     [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} 
     _Color ("Tint", Color) = (1,1,1,1) 

     _StencilComp ("Stencil Comparison", Float) = 8 
     _Stencil ("Stencil ID", Float) = 0 
     _StencilOp ("Stencil Operation", Float) = 0 
     _StencilWriteMask ("Stencil Write Mask", Float) = 255 
     _StencilReadMask ("Stencil Read Mask", Float) = 255 

     _ColorMask ("Color Mask", Float) = 15 
    } 

    SubShader 
    { 
     Tags 
     { 
      "Queue"="Overlay" 
      "IgnoreProjector"="True" 
      "RenderType"="Transparent" 
      "PreviewType"="Plane" 
      "CanUseSpriteAtlas"="True" 
     } 

     Stencil 
     { 
      Ref [_Stencil] 
      Comp [_StencilComp] 
      Pass [_StencilOp] 
      ReadMask [_StencilReadMask] 
      WriteMask [_StencilWriteMask] 
     } 

     Cull Off 
     Lighting Off 
     ZWrite Off 
     ZTest Off 
     Blend SrcAlpha OneMinusSrcAlpha 
     ColorMask [_ColorMask] 

     Pass 
     { 
     CGPROGRAM 
      #pragma vertex vert 
      #pragma fragment frag 
      #include "UnityCG.cginc" 

      struct appdata_t 
      { 
       float4 vertex : POSITION; 
       float4 color : COLOR; 
       float2 texcoord : TEXCOORD0; 
      }; 

      struct v2f 
      { 
       float4 vertex : SV_POSITION; 
       fixed4 color : COLOR; 
       half2 texcoord : TEXCOORD0; 
      }; 

      fixed4 _Color; 

      v2f vert(appdata_t IN) 
      { 
       v2f OUT; 
       OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex); 
       OUT.texcoord = IN.texcoord; 
#ifdef UNITY_HALF_TEXEL_OFFSET 
       OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1); 
#endif 
       OUT.color = IN.color * _Color; 
       return OUT; 
      } 

      sampler2D _MainTex; 

      fixed4 frag(v2f IN) : SV_Target 
      { 
       half4 color = tex2D(_MainTex, IN.texcoord) * IN.color; 
       clip (color.a - 0.01); 
       return color; 
      } 
     ENDCG 
     } 
    } 
} 

Заслуга http://answers.unity3d.com/questions/878667/world-space-canvas-on-top-of-everything.html

+0

Вы делаете это так? http://imgur.com/VLTSEmF Он отлично работает, но как вы делаете этот интерфейс всегда видимым (иногда он скрывается за чем-то в моей игре)? –

+0

@fake Я отредактировал свой ответ, надеюсь, что это поможет. –

+0

Я думаю, что не обязательно применять этот шейдер с новым Unity 5.4. Может кто-нибудь подтвердить? – Ashish

0

Я бы сказал; настройте RenderTexture и сделайте свой/пользовательский интерфейс единственным, нарисованным на нем, затем наклейте RenderTexture на что-то еще в вашем мире.

Смежные вопросы