2015-10-28 4 views
1

Я разрабатываю приложение в Unity с плагином Google CardbBoard, и я пытался затухать на экране при передаче между сценами, я работал на этом примере рисунок текстуры в графическом интерфейсе объекта:Fade in/out между сценами не работает в Unity - плагин Google Cardboard

GUI.color = new Color (GUI.color.r, GUI.color.g, GUI.color.b, alpha); 

Texture2D myTex; 
myTex = new Texture2D (1, 1); 
myTex.SetPixel (0, 0, fadeColor); 
myTex.Apply(); 

GUI.DrawTexture (new Rect (0, 0, Screen.width, Screen.height), myTex); 
if (isFadeIn) 
    alpha = Mathf.Lerp (alpha, -0.1f, fadeDamp * Time.deltaTime); 
else 
    alpha = Mathf.Lerp (alpha, 1.1f, fadeDamp * Time.deltaTime); 

if (alpha >= 1 && !isFadeIn) { 
    Application.LoadLevel (fadeScene);  
    DontDestroyOnLoad(gameObject);  
} else if (alpha <= 0 && isFadeIn) { 
    Destroy(gameObject);   
} 

код я работал с с этой страницы: Video Tutorial, Example downloads, и он работал отлично в игре Unity без Картонная плагин, но в моем тока проект аналогичным образом использовать этот код не работает. Единственное различие заключается в использовании плагина Cardboard.

Есть ли какой-либо конкретный картонный объект, который я должен использовать вместо графического интерфейса или другой способ нарисовать текстуру?

ответ

0

GUI, GUILayout и Graphics не работают в VR. Нет 2d прямо на экран будет работать правильно.

Вы должны сделать в 3d, проще всего сделать шар вокруг камеры (или даже лучше, две сферы вокруг каждого глаза) и оживить их непрозрачность.

1

As per the Google Cardboard docs, Вам необходимо иметь элементы GUI в 3D-пространстве перед камерой, чтобы они были воспроизведены в каждом глазу.

Я поделюсь своим решением, как я это сделал. Обратите внимание, что то, что я сделал, имеет один экземпляр Prefab Cardboard Player, когда моя игра начинается и сохраняется на всех моих уровнях через DontDestoryOnLoad(), вместо того, чтобы иметь отдельный экземпляр на каждом уровне. Это позволяет переносить настройки на каждый загруженный уровень и исчезать и исчезать на экране.

Я сделал экранный фейдер, создав холст World Space Canvas, который является родителем для объекта «Голова» картонного префикса, поэтому он следует за взглядом и помещает изображение Black Sprite, которое покрывает весь холст, который блокирует просмотр игроков, когда черный Спрайт виден.

Этот скрипт, прикрепленный к моему Player Prefab, позволяет мне сначала исчезнуть на экране (вызвать FadeOut()), загрузить новый уровень (установить LevelToLoad на индекс уровня, который вы хотите загрузить), затем Fade на экране после загружается новый уровень.

По умолчанию используется путь Async уровней загрузки, чтобы позволить погрузочных Bars, но вы можете установить UseAsync ложь загружать уровни через Application.LoadLevel()

using UnityEngine; 
using UnityEngine.UI; 
using System.Collections; 

public class LoadOperations: MonoBehaviour { 

public Image myImage; 
// Use this for initialization 
public bool UseAsync; 
private AsyncOperation async = null; 
public int LevelToLoad; 

public float FadeoutTime; 
public float fadeSpeed = 1.5f; 
private bool fadeout; 
private bool fadein;  


public void FadeOut(){ 
    fadein= false; 
    fadeout = true; 
    Debug.Log("Fading Out"); 
} 

public void FadeIn(){ 
    fadeout = false; 
    fadein = true; 
    Debug.Log("Fading In"); 
} 

void Update(){ 

    if(async != null){ 
     Debug.Log(async.progress); 
     //When the Async is finished, the level is done loading, fade in the screen 
     if(async.progress >= 1.0){ 
      async = null; 
      FadeIn(); 
     } 
    } 

    //Fade Out the screen to black 
    if(fadeout){ 
     myImage.color = Color.Lerp(myImage.color, Color.black, fadeSpeed * Time.deltaTime); 

     //Once the Black image is visible enough, Start loading the next level 
     if(myImage.color.a >= 0.999){ 
      StartCoroutine("LoadALevel"); 
      fadeout = false; 
     } 
    } 

    if(fadein){ 
     myImage.color = Color.Lerp(myImage.color, new Color(0,0,0,0), fadeSpeed * Time.deltaTime); 

     if(myImage.color.a <= 0.01){ 
      fadein = false; 
     } 
    } 
} 

public void LoadLevel(int index){ 
    if(UseAsync){ 
     LevelToLoad= index; 
    }else{ 
     Application.LoadLevel(index); 
    } 
} 

public IEnumerator LoadALevel() { 
    async = Application.LoadLevelAsync(LevelToLoad); 
    yield return async; 
} 

}