实际项目中,我们会对指定的纹理设置不同平台不同属性。手动去设置操作量相对较大特别是资源持续性迭代的情况下,所以为了目标需求,我们需要去制作一个工具来设置我们导入的纹理资源。
目标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已经完成了,接下来我们开始扩展制作我们的编辑器。