AssetPostProcessor继承自UnityEditor,是一个编辑器类,主要在资源导入的时候可以自己定义一些默认的格式,当然但如完毕也有通知的接口。使用方法,新建脚本继承AssetPostProcessor,重写你需要的方法就行了。
导入资源,不同的类型用不同的方法。Model用OnPreprocessModel(导入前调用,使用ModelImporter修改属性),OnPostprocessMode(导入后调用)。图片用OnPreprocessTexture(使用TextureImporter修改属)和OnPostprocessTexture/Sprites()等。还有Audio等。
对一个MeshRenderer类似的赋材质的时候调用OnAssignMaterialModel(Material m,Renderer r)
static OnPostprocessAllAssets(string[] importAssets,string[] deleteAssets,string[] movedAssets,string[] movedFromPaths),所有资源的导入删除和移动都会调用它,可以用它监听资源的动向
using UnityEditor;
public class AutoSetTextureUISprite : AssetPostprocessor
{
void OnPreprocessTexture()
{
//自动设置类型;
TextureImporter textureImporter = (TextureImporter)assetImporter;
textureImporter.textureType = TextureImporterType.Sprite;//设置图片类型
/*TextureImporterPlatformSettings setting = new TextureImporterPlatformSettings();
setting.format = TextureImporterFormat.RGBA32;
setting.maxTextureSize = 2048;
setting.compressionQuality = 80;//[0,100]
setting.textureCompression = TextureImporterCompression.Compressed;
这个是真的不知道怎么用,设置了难道就可以了?
textureImporter.SetPlatformTextureSettings(setting);*/
textureImporter.SetPlatformTextureSettings("iPhone", 2048, TextureImporterFormat.RGBA32, true);//过时但是能用
textureImporter.SetPlatformTextureSettings("Android", 2048, TextureImporterFormat.RGBA32, true);
}
}脚本可以放在工程Assets的任意地方,然后导入图片就会自动设置了。
默认设置为Sprite是因为在NGUI中使用texture打包出来的图集图片也是texture中,会在某些平台上产生模糊,所以默认设置成Sprite且为RGBA32不压缩格式,以免忘记
当导入的图片是在粒子等上使用时,也会因为是Sprite而使用不了从而去主动设置格式,避免了n多图集没有修改格式,而造成的模糊
CreateAssetMenu特性可以创建一个按钮,将声明的类生成一个可编辑的资源文件
[CreateAssetMenu(fileName = "List",menuName = "Create List",order = 1)]
public class GameObjectPoolList : ScriptableObject {
public List<GameObjectPool> pools = new List<GameObjectPool>();
}这样子就不用使用ScriptableObject去GetInstance,再用AssetDatabase去创建资源文件了。
一、要编辑的单元
using UnityEngine;
using System;
[Serializable]
public class GameObjectPool {
[SerializeField]
private string name;
[SerializeField]
private int maxNum;
}二、可编辑的类型
using System.Collections.Generic;
using UnityEngine;
public class GameObjectPoolList : ScriptableObject {
public List<GameObjectPool> pools = new List<GameObjectPool>();
}三、创建这个可编辑的文件
using UnityEngine;
using UnityEditor;
public class PoolManagerEditor {
[MenuItem("Manager/Create Pool")]
public static void CreateEditorPools() {
GameObjectPoolList list = ScriptableObject.CreateInstance<GameObjectPoolList>();
string path = "Assets/26/gameobjectpool.asset";
AssetDatabase.CreateAsset(list, path);
AssetDatabase.SaveAssets();
}
}四、结果

using UnityEditor;
public class MyWindow : EditorWindow {
[MenuItem("Item/MyWindow")]
static void ShowMyWindow(){
MyWindow window = EditorWindow.GetWindow<MyWindow> ();
window.Show ();//获得实例,显示窗口
}
string inputStr = "";
void OnGUI(){//绘制窗口内容
EditorGUILayout.LabelField ("实例化输入名字的物体");
inputStr = EditorGUILayout.TextField (inputStr);
if (GUILayout.Button ("确定")) {
GameObject go = new GameObject (inputStr);
Undo.RegisterCreatedObjectUndo (go,"create"+inputStr);
}
}
}创建类继承自EditorWindow,存放在Editor文件夹下,表示是一个窗口类
这里创建了一个菜单来打开这个窗口
OnGUI是窗口内容的绘制,可以用EdittorGUILayout和GUILayout等类来绘制ui内容
Undo的RegisterCreateObjectUndo用来记录新创建的物体,用于后面可以撤销新创建的
void OnWizardOtherButton(){
GameObject[] objects = Selection.gameObjects;
int count = 0;
foreach (GameObject go in objects) {
Undo.RecordObject (go, "change name");
go.name += changeName;
count++;
EditorUtility.DisplayProgressBar ("进度", count + "/" + objects.Length, (float)count / objects.Length);
}
EditorUtility.ClearProgressBar ();//关闭进度条
ShowNotification (new GUIContent (Selection.gameObjects.Length + "个物体被修改了"));
}使用EditorUtility的静态方法DisplayProgressBar(标题,提示,进度float)
public string changeName = "你的名字";
const string NameField = "changeName";
void OnEnable(){
this.changeName = EditorPrefs.GetString (NameField,this.changeName);//第二个参数为默认值
}
void OnWizardUpdate(){
errorString = null;
helpString = null;
if (Selection.gameObjects.Length > 0) {
helpString = "你选择的物体数量为:" + Selection.gameObjects.Length;
} else {
errorString = "最少需要选择一个物体";
}
EditorPrefs.SetString (NameField, this.changeName);
}使用EditorPrefs类的静态方法(对应数据类型),跟PlayerPrefs差不多滴
void OnWizardOtherButton(){
GameObject[] objects = Selection.gameObjects;
foreach (GameObject go in objects) {
Undo.RecordObject (go, "change name");
go.name += changeName;
}
//在这里
ShowNotification (new GUIContent (Selection.gameObjects.Length + "个物体被修改了"));
}ShowNotification是EditorWindow的一个成员方法,实例化了的窗口才可以使用
会直接在窗口的空白位置显示你要的提醒信息,参数是GUIContent类型的,封装了一层
using UnityEngine;
using UnityEditor;
public class Migrazar : ScriptableWizard {
[MenuItem("Item/CreateWizard")]
public static void CreateWizard(){
ScriptableWizard.DisplayWizard<Migrazar> ("I am a boy","Change And Close","Change");
}
public string changeName = "你的名字";
void OnWizardOtherButton(){
GameObject[] objects = Selection.gameObjects;
foreach (GameObject go in objects) {
Undo.RecordObject (go, "change name");
go.name += changeName;
}
}
}ScriptableWizard的方法DisplayWizard的第三个参数就是OtherButton的名字,点击调用OnWizardOtherButton()
using UnityEngine;
using UnityEditor;
public class Migrazar : ScriptableWizard {
//导向框中字段值发生改变时调用
void OnWizardUpdate(){
errorString = null;//错误的提示信息
helpString = null;//帮助提示信息
if (Selection.gameObjects.Length > 0) {
helpString = "你选择的物体数量为:" + Selection.gameObjects.Length;
} else {
errorString = "最少需要选择一个物体";
}
}
//监听选择的改变也要调用OnWizardUpdate
void OnSelectionChange(){
OnWizardUpdate ();
}
}