关于c#:Unity的IPreprocessBuild深入解析与实用案例

45次阅读

共计 4001 个字符,预计需要花费 11 分钟才能阅读完成。

Unity IPreprocessBuild

Unity IPreprocessBuild 是 Unity 引擎中的一个十分有用的性能,它能够让开发者在构建我的项目时主动执行一些操作。这个性能能够帮忙开发者进步工作效率,缩小手动操作的工夫和错误率。在本文中咱们将介绍 Unity IPreprocessBuild 的应用办法,并提供三个应用例子,帮忙读者更好地了解这个性能。

Unity IPreprocessBuild 的应用办法

Unity IPreprocessBuild 的应用办法非常简单,只须要在 Unity 我的项目中创立一个 Editor 文件夹,而后在这个文件夹中创立一个 C# 脚本,命名为 BuildHandler.cs。在这个脚本中,咱们须要应用 Unity 的 Editor 命名空间,并实现 IPreprocessBuild 接口。而后,咱们须要重写 OnPreprocessBuild 办法,这个办法会在构建我的项目时主动执行。在这个办法中,咱们能够编写咱们须要执行的操作上面是一个简略的例子,演示了如何在构建我的项目时主动批改 PlayerSettings:

using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;

public class BuildHandler : IPreprocessBuild, IPostprocessBuild
{public int callbackOrder { get { return 0;} }

    public void OnPreprocessBuild(BuildReport report)
    {
        PlayerSettings.companyName = "My Company";
        PlayerSettings.productName = "My Product";
    }

    public void OnPostprocessBuild(BuildReport report)
    {Debug.Log("Build completed successfully!");
    }
}

在这个例子中,咱们实现了 IPreprocessBuild 和 IPostprocessBuild 接口,并重写了 OnPreprocessBuild 和 OnPostprocessBuild 办法。在 OnPreprocessBuild 办法中,咱们批改了 PlayerSettings 的 companyName 和 productName 属性。在 OnPostprocessBuild 办法中,咱们输入了一条日志,示意构建我的项目曾经实现。

应用例子

上面是三个应用 Unity IPreprocessBuild 的例子,每个例子都提供了具体的实现。

例子 1:主动批改场景

在这个例子中,咱们将演示如何在构建我的项目时主动批改场景。

using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
using UnityEngine.SceneManagement;

public class BuildHandler : IPreprocessBuild
{public int callbackOrder { get { return 0;} }

    public void OnPreprocessBuild(BuildReport report)
    {Scene scene = SceneManager.GetSceneByName("MyScene");
        if (scene.IsValid())
        {SceneManager.SetActiveScene(scene);
            GameObject[] objects = scene.GetRootGameObjects();
            foreach (GameObject obj in objects)
            {obj.transform.position = Vector3.zero;}
        }
    }
}

在这个例子中,咱们首先获取指定的场景,而后将这个场景设置为流动场景。接着,咱们获取场景中的所有根 GameObject,并将它们的地位设置为 Vector3.zero。

例子 2:主动打包 AssetBundle

在这个例子中,咱们将演示如何在构建我的项目时主动打包 AssetBundle。

using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;

public class BuildHandler : IPreprocessBuild
{public int callbackOrder { get { return 0;} }

    public void OnPreprocessBuild(BuildReport report)
    {string[] assetPaths = new string[] { "Assets/Textures/MyTexture.png", "Assets/Models/MyModel.fbx"};
        AssetBundleBuild[] builds = new AssetBundleBuild[1];
        builds[0].assetBundleName = "mybundle";
        builds[0].assetNames = assetPaths;
        BuildPipeline.BuildAssetBundles("Assets/AssetBundles", builds, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

在这个例子中,咱们首先指定须要打包的资源门路,而后创立一个 AssetBundleBuild 对象,并设置它的 assetBundleName 和 assetNames 属性。接着,咱们调 BuildPipeline.BuildAssetBundles 办法,将这个 AssetBundleBuild 对象打包成一个 AssetBundle,并保留到指定的门路。

例子 3:主动加密脚本

在这个例子中,咱们将演示如何在构建我的项目时主动加密脚本。

using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine;
using System.IO;
using System.Security.Cryptography;

public class BuildHandler : IPreprocessBuild
{public int callbackOrder { get { return 0;} }

    public void OnPreprocessBuild(BuildReport report)
    {string[] scriptPaths = Directory.GetFiles("Assets/Scripts", "*.cs", SearchOption.AllDirectories);
        foreach (string path in scriptPaths)
        {byte[] bytes = File.ReadAllBytes(path);
            byte[] hash = MD5.Create().ComputeHash(bytes);
            string hashString = BitConverter.ToString(hash).Replace("-", "").ToLower();
            string encryptedPath = path.Replace(".cs", "_" + hashString + ".cs");
            byte[] encryptedBytes = AesEncrypt(bytes, "mykey", "mysalt");
            File.WriteAllBytes(encryptedPath, encryptedBytes);
            File.Delete(path);
        }
    }

    private byte[] AesEncrypt(byte[] bytes, string key, string salt)
    {byte[] keyBytes = new Rfc2898DeriveBytes(key, Encoding.UTF8.GetBytes(salt)).GetBytes(32);
        byte[] ivBytes = new Rfc2898DeriveBytes(key, Encoding.UTF8.GetBytes(salt)).GetBytes(16);
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = ivBytes;
            using (MemoryStream ms = new MemoryStream())
            {using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
                {cs.Write(bytes, 0, bytes.Length);
                }
                return ms.ToArray();}
        }
    }
}

在这个例子中,咱们首先获取所有的脚本文件门路,而后遍历每个脚本文件。对于每个脚本文件,咱们首先计它的 MD5 哈希值,并将这个哈希值增加到文件名中。接着,咱们应用 AES 算法对这个脚本文件进行加密,并将加密后的内容保留到新的文件中。最初,咱们删除原始的脚本文件。

论断

Unity IPreprocessBuild 是一个十分有用的性能,能够帮忙发者进步工作效率,缩小手动操作的和错误率。在本文中,咱们介绍了 Unity IPreprocessBuild 的应用办法,并供了三个应用例子,帮忙读者更好地解这个性能。心愿这篇文章对读者有所帮忙。

本文由博客一文多发平台 OpenWrite 公布!

正文完
 0