背景:
当一个Prefab比较复杂,重新装配、修改Prefab都需要较多工作,也容易出错。
所有在Unity编辑器中的手动操作都可以用代码完成。编写一次代码可以节省很多重复工作。
构想:
设计一个脚本,在模型被导入模型到Unity工程中时,自动创建为Prefab。
核心步骤与解释:
1、工程目录创建名为“Editor”的文件夹——不被打包,不能在游戏运行时使用,存放Unity编辑器“专用”的脚本和资源。(比如:开发期会用到的扩展工具)。所创建的脚本就放在这里。
2、using UnityEditor;——使用Unity的编辑器相关API。
3、继承AssetPostprocessor——专用于处理资源导入。(官方解释:AssetPostprocessor lets you hook into the import pipeline and run scripts prior or after importing assets. 简单译为:AssetPostprocessor允许连接到关键管线,并在导入资源之前或之后运行脚本。)
4、需要用到AssetsPostprocessor的一个Message函数:
AssetPostprocessor.OnPostprocessModel(GameObject)——这个消息函数在最终的预制件创建和写入磁盘之前被调用,因此可以完全控制生成的游戏对象和组件。
5、其他:
UnityEditor.ModelImporter :用于从editor脚本中获取导入设置
UnityEditor.AssetDatabase:用于获取并操作Assets的接口
UnityEditor.PrefabUtility:用于任意Prefab相关操作的工具类
实操:
using UnityEngine;
using UnityEditor;
class ProcessModel : AssetPostprocessor
{
void OnPostprocessModel( GameObject input )
{
// 只处理名为"xxxx"的模型
if (input.name != "xxxx")
return;
Debug.Log("现在开始处理Prefab!");
// 取得导入模型的相关信息
ModelImporter importer = assetImporter as ModelImporter;
// 读出该模型
GameObject tar = AssetDatabase.LoadAssetAtPath<GameObject>(importer.assetPath);
// 将模型创建为prefab
//GameObject prefab = PrefabUtility.CreatePrefab("Assets/Prefabs/xx.prefab", tar);
GameObject prefab = PrefabUtility.SaveAsPrefabAsset(tar, "Assets/Prefabs/xx.prefab");
//------------开始设置Prefab
// 比如设置Prefab的tag
prefab.tag = "Enemy";
//------------等等类似的其他GameObject操作----------------------------
}
右键Reimport重新导入xxxx.fbx,将会调用脚本自动创建xx.Prefab