在运行时获取Unity Editor-Only变量(启动画面背景的颜色)

时间:2018-03-06 18:53:21

标签: c# unity3d unity-editor

要在Unity的启动画面中创建动态淡入效果,我试图在运行时获取启动画面背景的颜色。

在编辑器中,可以在编辑>处找到颜色。项目设置>播放器>飞溅图像>背景

在研究如何获得这种颜色时,我偶然发现了 PlayerSettings.SplashScreen.backgroundColor。但是,PlayerSettings类包含在UnityEditor命名空间中,无法在运行时访问。

如何在运行时动态获取启动画面背景的颜色?

编辑:使用IL反编译器,我发现UnityEditor程序集使用外部方法解决了这个问题。但是,我仍然没有看到从编辑器程序集中获取背景颜色的方法。

public static Color backgroundColor
{
    get
    {
        Color result;
        PlayerSettings.SplashScreen.INTERNAL_get_backgroundColor(out result);
        return result;
    }
    // ...
}

private static extern void INTERNAL_get_backgroundColor(out Color value);

1 个答案:

答案 0 :(得分:4)

Unity的构建假设您在运行时永远不需要这个值,因此您需要采取一些技巧来解决这个问题。我经常做的一件事就是解决使编辑器变量可访问的特殊问题,即编写一个预构建步骤,将任何想要的数据保存到资源文件中,然后可以在运行时读取。

您需要执行此操作的唯一API是IPreprocessBuild界面,Resources.LoadMenuItem属性(MenuItem是可选的但会让你的工作流程更容易一些。)

首先,实现一个IPreprocessBuild(这个位于"编辑器"目录和引用UnityEditor)以将设置保存到资源:

class BackgroundColorSaver : IPreprocessBuild
{
    public int callbackOrder { get { return 0; } } // Set this accordingly
    public void OnPreprocessBuild(BuildTarget target, string path)
    {
        SaveBkgColor();
    }

    [MenuItem("MyMenu/Save Background Splash Color")]
    public static void SaveBkgColor()
    {
        // Save PlayerSettings.SplashScreen.backgroundColor to a
        // file somewhere in your "Resources" directory 
    }
}

每次启动构建时,此类都会调用SaveBkgColor()MenuItem标记可让您选择在需要时调用该函数(使测试/迭代变得更容易) )。

之后,您将要编写一个运行时脚本,该脚本只使用Resources.Load加载您的资产并将其解析/转换为Color对象。

这些是制作"仅限编辑器的基础知识。运行时可用的资源。使用Color

以最直接的方式执行此操作的一些细节

另请注意,由于您希望这是一个来自初始屏幕的混合,因此您需要立即运行此代码(可能在Awake()函数中运行您的某些行为第一个场景)。

旁注:有更有效的方法可以将Color保存/加载为二进制blob而不是原始文本资源,但这很简单,并且可以在离开{{1}时轻松交换该部分。实施完好。