自动设置纹理资源属性(一)

实际项目中,我们会对指定的纹理设置不同平台不同属性。手动去设置操作量相对较大特别是资源持续性迭代的情况下,所以为了目标需求,我们需要去制作一个工具来设置我们导入的纹理资源。

目标1:获取导入的纹理资源,并修改纹理资源属性。可用接口:AssetPostprocessor;TextureImporter。

目标2:制作编辑器。

 目标1实现:

熟悉AssetPostprocessor接口


public class TextureImportSetting : AssetPostprocessor
{
    /// <summary>
    /// 当一个材质赋值给渲染器时
    /// </summary>
    /// <param name="material">目标材质球</param>
    /// <param name="render">目标渲染器</param>
    void OnAssignMaterialModel(Material material, Renderer render) { }
    /// <summary>
    /// 导入任何资源完成时调用,指资源读取条完成后。
    /// </summary>
    /// <param name="importedAssets">导入的资源列表</param>
    /// <param name="deletedAssets">删除的资源列表</param>
    /// <param name="movedAssets">移动的资源列表</param>
    /// <param name="movedFromAssetPaths">移动到的资源列表</param>
    void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { }
    /// <summary>
    /// 当AB包的资源名称发生变化时调用
    /// </summary>
    /// <param name="assetPath">路径</param>
    /// <param name="previousAssetBundleName">之前资源名</param>
    /// <param name="newAssetBundleName">之后资源名</param>
    void OnPostprocessAssetbundleNameChanged(string assetPath, string previousAssetBundleName, string newAssetBundleName) { }
    /// <summary>
    /// 音频资源完成导入时
    /// </summary>
    /// <param name="clip">音频资源</param>
    void OnPostprocessAudio(AudioClip clip) { }
    /// <summary>
    /// Cubemap 纹理完成导入之前
    /// </summary>
    /// <param name="texture"></param>
    void OnPostprocessCubemap(Cubemap texture) { }
    /// <summary>
    /// 导入的GameObject用户属性及其数值
    /// </summary>
    /// <param name="go">对象</param>
    /// <param name="propNames">用户属性名</param>
    /// <param name="values">属性值</param>
    void OnPostprocessGameObjectWithUserProperties(GameObject go, string[] propNames, System.Object[] values) { }
    /// <summary>
    /// 材质球完成导入时
    /// </summary>
    /// <param name="material">材质球</param>
    void OnPostprocessMaterial(Material material) { }
    /// <summary>
    /// 模型完成导入时
    /// </summary>
    /// <param name="g">对象</param>
    void OnPostprocessModel(GameObject g) { }
    /// <summary>
    /// SpeedTree 完成导入时
    /// </summary>
    /// <param name="g"></param>
    void OnPostprocessSpeedTree(GameObject g) { }
    /// <summary>
    /// Sprites 完成导入时
    /// </summary>
    /// <param name="texture2D">纹理</param>
    /// <param name="sprites">图片集</param>
    void OnPostprocessSprites(Texture2D texture2D, Sprite[] sprites) { }
    /// <summary>
    /// 纹理完成导入时
    /// </summary>
    /// <param name="texture">纹理</param>
    void OnPostprocessTexture(Texture2D texture) { }
    /// <summary>
    /// 动画导入之前时
    /// </summary>
    void OnPreprocessAnimation() { }
    /// <summary>
    /// 导入任何资源之前
    /// </summary>
    void OnPreprocessAsset() { }
    /// <summary>
    /// 音频资源导入之前
    /// </summary>
    void OnPreprocessAudio() { }
    /// <summary>
    /// 模型资源导入之前
    /// </summary>
    void OnPreprocessModel() { }
    /// <summary>
    /// SpeedTree导入之前
    /// </summary>
    void OnPreprocessSpeedTree() { }
    /// <summary>
    /// 纹理导入之前
    /// </summary>
    void OnPreprocessTexture() { }
}

对于设置导入的纹理属性,我们只需要OnPreprocessTexture()回调消息即可。

我们需要AssetPostprocessor的两个属性一个是assetPath我们用于条件处理一个是assetImporter用于获取当前设置对象。

定义需要处理的目录结构

const string defaultPath = "/Editor Default Resources/";

由于框架模式已经固定。我的框架所有资源都是在Editor Default Resources。最终发包都是以AB包形式,编辑器状态下都是直接在Editor Default Resources模式下直接读取资源使用。

检测当前纹理资源是否是需要处理资源,获取当前资源纹理路径的配置表。

public void OnPreprocessTexture()
{
    if(assetPath.IndexOf(defaultPath) >=0)
    {
        TextureImportConfig config = GetConfig(Path.GetDirectoryName(assetPath.Substring(assetPath.IndexOf(defaultPath) + defaultPath.Length)));
        TextureImporter impor = assetImporter as TextureImporter;
        if (impor!=null && config != null)
        {
            SetTextureImporter(impor,config);
        }
    }       
}

接下来实现获取配置数据方法GetConfig。json反序列化我们用到了Newtonsoft.Json,请自行下载引用。

/// <summary>
/// 配置数据
/// </summary>
static Dictionary<string, TextureImportConfig> Configs;
/// <summary>
/// 清理配置数据
/// </summary>
public static void ClearConfig()
{
    Configs = null;
}
/// <summary>
/// 获取配置数据
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public TextureImportConfig GetConfig(string path)
{
    if(Configs==null)
    {
        TextAsset confisFile = EditorGUIUtility.Load(configPath) as TextAsset;
        if(confisFile!=null)
        {
            Configs = JsonConvert.DeserializeObject<Dictionary<string, TextureImportConfig>>(confisFile.text);
        }
    }
    if(Configs!=null&&Configs.ContainsKey(path))
    {
        return Configs[path];
    }
    return null;
}

同样我们需要定义我们的配置路径。

扫描二维码关注公众号,回复: 6211904 查看本文章
const string configPath = "EditorConfig/TextureImportConfig.json";

接下来我们实现设置图片资源属性设置【SetTextureImporter】。

/// <summary>
/// 设置图片导入数据
/// </summary>
/// <param name="target"></param>
/// <param name="config"></param>
public void SetTextureImporter(TextureImporter target, TextureImportConfig config)
{
    target.textureType = config.TextureImporterType;
    //......
}

到此我们的目标1已经完成了,接下来我们开始扩展制作我们的编辑器。

猜你喜欢

转载自blog.csdn.net/l100142548/article/details/84137885