我刚刚将我的项目导入到我的mac的统一中。我有Unity pro许可证,我在两台计算机(带有Windows 8的PC)和OS X yosemite中使用了unity 4.6.3。当我在电脑(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);
}
}
答案 0 :(得分:0)
在“播放器设置”中将Graphics API设置为Open GL ES 2.0。这可能与Unity 4.6.3发布的新iOs Metal Rendering有关。
答案 1 :(得分:0)
问题是,Windows上的Unity使用的是DirectX而不是OpenGL,所以它在那里工作(正如您在问题的评论中已经提到的那样)。
只需在Windows上使用-force-opengl
启动Unity,您就会注意到,它将停止在那里工作。
请参阅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
}
}
}
}
}
只需将该着色器存储在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问题,因为它也没有在使用-force-opengl
的Unity 4.6.3上运行,正如您在问题的评论中已经提到的那样(在不强制OpenGL的情况下工作正常)
请参阅http://answers.unity3d.com/questions/447206/forcing-opengl-in-windows-editor.html
所以,我建议使用以下方法,因为它同时适用于OpenGL和DirectX。
只需更改你的&#34; DrawQuad&#34;方法如下:
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/
答案 2 :(得分:0)
根据GL.Color的文档,它“只能在GL.Begin和GL.End函数之间调用”。您对GL.Color的调用发生在GL.Begin之前。