Search code examples
c#unity-game-enginegoogle-cardboardvirtual-reality

GUI in VR for Google Cardboard in Unity


I'm creating simple google cardboard game in unity and i want to add score count. I know how to do it normally, but in VR it doesn't work for me. I tried to just put Text and display score in it, and it looked good(not exactly because it was displayed only for one eye) but after I tested it on my phone text was in completely different place. Do you know what's the proper way to do it?


Solution

  • Create a World Space canvas and have that canvas attached to the camera. Thats how I get my UI in VR games.

    You're going to need a custom shader for your World Space UI objects that has it's Render Order to Overlay and has ZTest turned off.

    This is a copy of the Default UI shader with the necessary changes. Should do the trick. Just make a material with this shader, and apply it to everything you want drawn over the top of geometry in your WorldSpace UI.

     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
             }
         }
     }
    

    credit goes to http://answers.unity3d.com/questions/878667/world-space-canvas-on-top-of-everything.html