C# 在运行时获取Unity Editor Only变量(启动屏幕背景的颜色)

C# 在运行时获取Unity Editor Only变量(启动屏幕背景的颜色),c#,unity3d,unity-editor,C#,Unity3d,Unity Editor,为了从Unity的闪屏创建动态淡入效果,我试图在运行时获得闪屏背景的颜色 在编辑器中,可以在编辑>项目设置>播放器>飞溅图像>背景中找到颜色 在研究如何获得这种颜色时,我偶然发现 . 但是,PlayerSettings类包含在UnityEditor命名空间中,在运行时无法访问该命名空间 如何在运行时动态获取启动屏幕背景的颜色 编辑:使用IL反编译器,我发现UnityEdit程序集使用外部方法解决了这个问题。但是,我仍然没有找到从编辑器程序集中提取背景颜色的方法 公共静态颜色背景色 { 收到 {

为了从Unity的闪屏创建动态淡入效果,我试图在运行时获得闪屏背景的颜色

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

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

如何在运行时动态获取启动屏幕背景的颜色


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

公共静态颜色背景色
{
收到
{
色彩效果;
PlayerSettings.SplashScreen.INTERNAL_get_backgroundColor(输出结果);
返回结果;
}
// ...
}
私有静态外部无效内部获取背景颜色(输出颜色值);

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

您需要执行此操作的唯一API是接口和属性(
MenuItem
是可选的,但会使您的工作流更简单)

首先,实现一个
ipreprocessabuild
(这一个进入“编辑器”目录并引用
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
标记允许您随时调用该函数(使测试/迭代更容易)

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


这些是使“仅编辑器”资源在运行时可用的基础。使用
颜色执行此操作的最直接方法的一些细节:

  • 将颜色变量另存为
    TextAsset
  • 保存颜色和加载颜色时使用
还请记住,由于您希望这是来自初始屏幕的混合,因此需要立即运行此代码(可能在第一个场景中的某个行为的函数中)



旁注:有更有效的方法将颜色保存/加载为二进制blob,而不是原始文本资源,但这是直接的,并且该部分可以轻松地进行交换,同时保持
ipreproceshBuild
实现完好无损。

这听起来像是“我认为你不能”因此,当播放器应用程序正在构建时,会调用
IPRepreprocessBuild.onPreprepreprocessBuild()
。对
BuildPipeline.BuildPlayer
(当您单击“构建”或“构建并运行”按钮时调用)将自动调用任何
IPRecreathBuild.OnPrepreprocessBuild()
IPostprocessBuild.OnPostprocessBuild()
实现(顺序基于它们的
callbackOrder
)这很聪明。另一种可能是为c#源文件构建文本,该文件包含一个静态只读颜色初始化为正确值的类,并将文本保存到项目中的“.cs”文件中。@SilentSin因为这是预构建步骤,这肯定是一种可能性,并且与作为资源加载颜色数据相比,它具有性能优势。