Автоматическое исчезновение между сценами в единстве не работает на OSX

Я только что импортировал свой проект в единство своего Mac. У меня есть лицензия Unity Pro, и я использую Unity 4.6.3 на обоих компьютерах (ПК с Windows 8) и OS X Yosemite. Когда я тестирую свой проект на ПК (Windows), автоматическое затухание работает нормально, но когда я делаю это на своем Mac, оно ждет время между сценами, но только помещает экран в черный цвет без затухания. Это сценарий:

using UnityEngine;
using System.Collections;

public class AutoFade : MonoBehaviour
{
    private static AutoFade m_Instance = null;
    private Material m_Material = null;
    private string m_LevelName = "";
    private int m_LevelIndex = 0;
    private bool m_Fading = false;

    private static AutoFade Instance
    {
        get
        {
            if (m_Instance == null)
            {
                m_Instance = (new GameObject("AutoFade")).AddComponent<AutoFade>();
            }
            return m_Instance;
        }
    }
    public static bool Fading
    {
        get { return Instance.m_Fading; }
    }

    private void Awake()
    {
        DontDestroyOnLoad(this);
        m_Instance = this;
        m_Material = new Material("Shader \"Plane/No zTest\" { SubShader { Pass { Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Cull Off Fog { Mode Off } BindChannels { Bind \"Color\",color } } } }");
    }

    private void DrawQuad(Color aColor,float aAlpha)
    {
        aColor.a = aAlpha;
        m_Material.SetPass(0);
        GL.Color(aColor);
        GL.PushMatrix();
        GL.LoadOrtho();
        GL.Begin(GL.QUADS);
        GL.Vertex3(0, 0, -1);
        GL.Vertex3(0, 1, -1);
        GL.Vertex3(1, 1, -1);
        GL.Vertex3(1, 0, -1);
        GL.End();
        GL.PopMatrix();
    }

    private IEnumerator Fade(float aFadeOutTime, float aFadeInTime, Color aColor)
    {
        float t = 0.0f;
        while (t<1.0f)
        {
            yield return new WaitForEndOfFrame();
            t = Mathf.Clamp01(t + Time.deltaTime / aFadeOutTime);
            DrawQuad(aColor,t);
        }
        if (m_LevelName != "")
            Application.LoadLevel(m_LevelName);
        else
            Application.LoadLevel(m_LevelIndex);
        while (t>0.0f)
        {
            yield return new WaitForEndOfFrame();
            t = Mathf.Clamp01(t - Time.deltaTime / aFadeInTime);
            DrawQuad(aColor,t);
        }
        m_Fading = false;
    }
    private void StartFade(float aFadeOutTime, float aFadeInTime, Color aColor)
    {
        m_Fading = true;
        StartCoroutine(Fade(aFadeOutTime, aFadeInTime, aColor));
    }

    public static void LoadLevel(string aLevelName,float aFadeOutTime, float aFadeInTime, Color aColor)
    {
        if (Fading) return;
        Instance.m_LevelName = aLevelName;
        Instance.StartFade(aFadeOutTime, aFadeInTime, aColor);
    }
    public static void LoadLevel(int aLevelIndex,float aFadeOutTime, float aFadeInTime, Color aColor)
    {
        if (Fading) return;
        Instance.m_LevelName = "";
        Instance.m_LevelIndex = aLevelIndex;
        Instance.StartFade(aFadeOutTime, aFadeInTime, aColor);
    }
}

person jose gabriel    schedule 12.03.2015    source источник
comment
У меня была аналогичная проблема однажды. Что я сделал, так это... Я перестал использовать GL, я поместил на экран черный UI.Image и вместо этого изменил его альфа-значение.   -  person Fabricio    schedule 14.03.2015
comment
Да, я знаю, как это сделать, но мой вопрос в том, чтобы узнать, что произошло? почему это работает в Windows, а не в OS X? если они запущены в одной и той же версии единства.   -  person jose gabriel    schedule 14.03.2015
comment
Вы пробовали режим OpenGL в Windows. Unity3D по умолчанию использует DirectX в Windows.   -  person Barış Çırıka    schedule 17.03.2015
comment
следуйте этому полезному руководству youtube.com/watch?v=0HwZQt94uHQ.   -  person Alberto    schedule 20.03.2015
comment
@josegabriel Сожалею, что вопросам Unity3d никогда не уделяется много внимания.   -  person ʇolɐǝz ǝɥʇ qoq    schedule 23.03.2015
comment
@FollowMyProposals, возможно, это потому, что у Unity есть собственный сайт вопросов и ответов?   -  person yoyo    schedule 23.03.2015
comment
И, возможно, люди забывают пометить [unity3d] или неправильно помечают [unity].   -  person yoyo    schedule 23.03.2015
comment
Действительно, теги являются проблемой. Я проверил минуту назад, и все три последних вопроса по Unity 3D были помечены [unity], а не [unity3d].   -  person yoyo    schedule 23.03.2015
comment
Не говоря уже об gamedev.stackexchange.com/questions/tagged/unity.   -  person yoyo    schedule 24.03.2015


Ответы (3)


Проблема в том, что Unity в Windows использует DirectX, а не OpenGL, поэтому он там работает (как уже упоминалось в комментариях к вашему вопросу).

Просто запустите Unity с -force-opengl в Windows, и вы заметите, что там он тоже перестанет работать.

См. http://answers.unity3d.com/questions/447206/forcing-opengl-in-windows-editor.html

Дальнейшее расследование показало, что ваш шейдер не соответствует вашим потребностям. Для этого вам понадобится вершинный шейдер.

См. http://answers.unity3d.com/questions/55392/why-my-glcolor-doesnt-work.html

e.g.:

Shader "Unlit Transparent Vertex Colored" 
{
    Properties 
    {
        _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
    }

    Category 
    {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        ZWrite Off
        //Alphatest Greater 0
        Blend SrcAlpha OneMinusSrcAlpha 
        Fog { Color(0,0,0,0) }
        Lighting Off
        Cull Off //we can turn backface culling off because we know nothing will be facing backwards

        BindChannels 
        {
            Bind "Vertex", vertex
            Bind "texcoord", texcoord 
            Bind "Color", color 
        }

        SubShader   
        {
            Pass 
            {
                SetTexture [_MainTex] 
                {
                    Combine texture * primary
                }
            }
        } 
    }
}

Источник https://github.com/edbartley/BombaFiesta-Unity3D-Futile/blob/master/Assets/Resources/Shaders/UnlitTransparentVertexColored.shader

Просто сохраните этот шейдер где-нибудь в Assets/Resources, например. как test.shader и загрузите его в Awake() следующим образом:

private void Awake()
{
    DontDestroyOnLoad(this);
    m_Instance = this;
    var shader = Shader.Find("Unlit Transparent Vertex Colored"); // <= it's some kind of best practise to put shaders in separate files, and load them like this
    m_Material = new Material(shader);
}

Shader.Find http://docs.unity3d.com/ScriptReference/Shader.Find.html

Кроме того, вы должны поставить GL.Begin() в начало материала GL в методе DrawQuad().

private void DrawQuad(Color aColor,float aAlpha)
{
    aColor.a = aAlpha;
    m_Material.SetPass(0);

    GL.Begin(GL.QUADS); // <= put it here
    GL.Color(aColor);
    GL.PushMatrix();
    GL.LoadOrtho();
    GL.Vertex3(0, 0, -1);
    GL.Vertex3(0, 1, -1);
    GL.Vertex3(1, 1, -1);
    GL.Vertex3(1, 0, -1);
    GL.End();
    GL.PopMatrix();
}

Работает как шарм для меня, теперь. :-)

Дайте мне знать, если у вас есть какие-либо проблемы с этим!

Старый ответ:

Я сохранил свой первый ответ, так как это хороший альтернативный подход к этой проблеме.

Похоже, это проблема с OpenGL, так как он также не работает в Windows с Unity 4.6.3 с использованием -force-opengl, как уже упоминалось в комментариях к вашему вопросу (отлично работает без форсирования OpenGL).

См. http://answers.unity3d.com/questions/447206/forcing-opengl-in-windows-editor.html

Итак, я бы предложил использовать следующий подход, поскольку он работает как с OpenGL, так и с DirectX.

Просто измените свой метод «DrawQuad» следующим образом:

private void DrawQuad(Color aColor, float aAlpha)
{
    aColor.a = aAlpha;
    Texture2D texture = new Texture2D(1, 1);
    texture.SetPixel(0, 0, aColor);
    texture.Apply();
    GUI.skin.box.normal.background = texture;
    GUI.Box(new Rect(0, 0, Screen.width, Screen.height), GUIContent.none);
} 

См. также http://forum.unity3d.com/threads/draw-a-simple-rectangle-filled-with-a-color.116348/

person d4Rk    schedule 22.03.2015

Установите для Graphics API значение Open GL ES 2.0 в настройках проигрывателя. Это может быть связано с новым рендерингом металла iOS, выпущенным с Unity 4.6.3.

person S. Cook    schedule 17.03.2015
comment
Я уже сделал это, и это не сработало. Самое любопытное в этом то, что когда я пробую проект на своем андроиде, он выполняет автозатухание. Так что видимо проблема как раз внутри редактора. Любые подсказки? - person jose gabriel; 18.03.2015

Согласно документации для GL.Color, его "можно вызывать только между GL .Begin и GL.End функции". Ваш вызов GL.Color происходит до GL.Begin.

person yoyo    schedule 22.03.2015