Unity Editor扩展 生成预制体自动生成对应名称脚本并自动挂载

news/2024/12/5 12:32:32/

生成预制体自动生成对应名称脚本并自动挂载

  • B站视频教程
  • 监听指定文件夹预制体变动
  • 脚本生成
  • 脚本自动挂载
  • 完成源码和案例

B站视频教程

Unity Editor扩展 生成脚本并自动挂载到对应生成的预制体上

监听指定文件夹预制体变动

public class CustomAssetPostprocessor : AssetPostprocessor
{//所有的资源的导入,删除,移动,都会调用此方法,注意,这个方法是static的public static void OnPostprocessAllAssets( string[] importedAsset, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths ){//List<string> formList = new List<string>();//string history = Path.Combine( Application.persistentDataPath, "GenerateUIFormHistory.cachedat" );//if ( File.Exists( history ) )//{//    string genHistory = File.ReadAllText( history );//    string[] forms = genHistory.Split( ';' );//    formList = new List<string>( forms );//}List<string> movedAssetsList = new List<string>( movedAssets );foreach ( string url in importedAsset ){if ( url.StartsWith( "Assets/BundleRes/UI/Form" ) && url.EndsWith( ".prefab" ) && !movedAssetsList.Contains( url ) ){//if ( !formList.Contains( str ) )//{//    NewFormPrefabProc( str );//}
#if UNITY_2020_1_OR_NEWERstring form = Path.GetFileNameWithoutExtension( url );if ( !Directory.Exists( $"Assets/Scripts/UIForms/{form}" ) )
#endif{NewFormPrefab( url );}}}foreach ( string url in deletedAssets ){if ( url.StartsWith( "Assets/BundleRes/UI/Form" ) && url.EndsWith( ".prefab" ) && !movedAssetsList.Contains( url ) ){//Log.PINK( $"Check uIForm prefab deleted: {url}" );var formName = Path.GetFileNameWithoutExtension( url );var dependScriptFolder = $"Assets/Scripts/UIForms/{formName}";if ( Directory.Exists( dependScriptFolder ) ){Directory.Delete( dependScriptFolder, true );File.Delete( dependScriptFolder + ".meta" );//Log.PINK( $"Delete depend ScriptFolder: {dependScriptFolder}\nDelete depend scripts: {formName}.cs,{formName}Manager.cs" );}}}}
}

脚本生成

private static void NewFormPrefab( string assetPath ){if ( string.IsNullOrWhiteSpace( assetPath ) || string.IsNullOrEmpty( assetPath ) ){Log.Error( $"NewFormPrefabProc 传入路径为空或者空格: {assetPath}" );return;}var pathclips = assetPath.Split( '/' );var fileName = pathclips[ pathclips.Length - 1 ].Split( '.' )[ 0 ];string file = fileName + "";if ( !fileName.EndsWith( "Form" ) ){if ( fileName.EndsWith( "form" ) ){file = fileName.Replace( "form", "Form" );}else{file = fileName + "Form";}}//try//{//    //newForm path//    var newPath = assetPath.Replace( fileName, file );//    //记录一下新创建的 避免循环导入//    List<string> formList = new List<string>();//    string history = Path.Combine( Application.persistentDataPath, "GenerateUIFormHistory.cachedat" );//    string genHistory = string.Empty;//    if ( File.Exists( history ) )//    {//        genHistory = File.ReadAllText( history );//        string[] forms = genHistory.Split( ';' );//        formList = new List<string>( forms );//    }//    if ( !formList.Contains( newPath ) )//    {//        if ( File.Exists( newPath ) )//        {//            File.Delete( newPath );//        }//        File.Copy( assetPath, newPath );//        File.Delete( assetPath );//        genHistory += $";{newPath}";//        File.WriteAllText( Path.Combine( Application.persistentDataPath, "GenerateUIFormHistory.cachedat" ), genHistory );//    }//    else//    {//        return;//    }//}//catch ( System.Exception e )//{//    Debug.LogError( e );//}//预制体操作//var instance = PrefabUtility.LoadPrefabContents( assetPath );//instance.name = file;//PrefabUtility.SaveAsPrefabAsset( instance, "Assets/BundleRes/UI/Form/aaa2.prefab" );//PrefabUtility.UnloadPrefabContents( instance );var formClsName = file + "";var managerClsName = $"{file}Manager";var outputFolder = $"Assets/Scripts/UIForms/{file}/";if ( !Directory.Exists( outputFolder ) ){Directory.CreateDirectory( outputFolder );}EditorUtility.DisplayProgressBar( "Generate UIForm Derived ClassScript", $"class {managerClsName}", 0.3f );GenCSharpScript.GenScriptFromTemplate( "Assets/Frameworks/Editor/UIScriptTemplate/XXXFormManager.cs", outputFolder, managerClsName, ( ref string textContentProcessing ) =>{textContentProcessing = textContentProcessing.Replace( "XXXFormManager", managerClsName );textContentProcessing = textContentProcessing.Replace( "XXXForm", formClsName );} );EditorUtility.DisplayProgressBar( "Generate UIForm Derived ClassScript", $"class {formClsName}", 0.667f );GenCSharpScript.GenScriptFromTemplate( "Assets/Frameworks/Editor/UIScriptTemplate/XXXForm.cs", outputFolder, formClsName, ( ref string textContentProcessing ) =>{textContentProcessing = textContentProcessing.Replace( "XXXFormManager", managerClsName );textContentProcessing = textContentProcessing.Replace( "XXXForm", formClsName );} );EditorUtility.ClearProgressBar( );string error = AssetDatabase.RenameAsset( assetPath, file );if ( !string.IsNullOrEmpty( error ) ){Debug.LogError( error );return;}var newPath = assetPath.Replace( fileName, file );EditorPrefs.SetString( generateClassName, formClsName );EditorPrefs.SetString( generatePrefabPath, newPath );AssetDatabase.SaveAssets( );AssetDatabase.Refresh( );}

脚本自动挂载

  public static string generateNamespaceName = "";public static string generateClassName = "generateClassName";public static string generatePrefabPath = "generatePrefabPath";[UnityEditor.Callbacks.DidReloadScripts]private static void OnScriptUpdateLoaded( ){string className = EditorPrefs.GetString( generateClassName );if ( string.IsNullOrEmpty( className ) ){return;}EditorUtility.DisplayProgressBar( "Mount scripts", $"{className} install...", 0f );var assemblies = AppDomain.CurrentDomain.GetAssemblies( );var defaultAssembly = assemblies.First( assembly => assembly.GetName( ).Name == "Assembly-CSharp" );var typeName = string.IsNullOrEmpty( generateNamespaceName ) ? className : generateNamespaceName + "." + className;var type = defaultAssembly.GetType( typeName );if ( type == null ){Debug.Log( "编译失败" );EditorUtility.ClearProgressBar( );return;}string prefabPath = EditorPrefs.GetString( generatePrefabPath );//为开发者提供额外处理接口try{GameObject prefabInstance = PrefabUtility.LoadPrefabContents( prefabPath );EditorUtility.DisplayProgressBar( "Mount scripts", $"{className} install...", 0.618f );var scriptComponent = prefabInstance.GetComponent( type );if ( !scriptComponent ){scriptComponent = prefabInstance.AddComponent( type );}AdditionalConfigurationForNewForm( prefabInstance );EditorUtility.DisplayProgressBar( "Mount scripts", $"{className} install...", 1f );PrefabUtility.SaveAsPrefabAssetAndConnect( prefabInstance, prefabPath, InteractionMode.AutomatedAction );}catch ( Exception e ){Debug.LogError( e );}AssetDatabase.Refresh( );EditorUtility.ClearProgressBar( );EditorPrefs.DeleteKey( generateClassName );}

完成源码和案例

项目源码: https://pan.baidu.com/s/1MqND3pPnxErDem9_1WJ-Rw?pwd=gjse 提取码: gjse


http://www.ppmy.cn/news/620712.html

相关文章

什么是操作系统?

点击蓝色“Java建设者”关注我哟 加个“星标”&#xff0c;一起走向人生巅峰&#xff01; 这是Java建设者的第 64 篇原创文章 操作系统 现代操作系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。计算机操作系统是一个复杂的系统…

简要了解一下什么是操作系统

操作系统 现代操作系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。计算机操作系统是一个复杂的系统。 然而&#xff0c;程序员不会直接和这些硬件打交道&#xff0c;而且每位程序员不可能会掌握所有操作系统的细节&#xff0…

什么是商业模式?

商业模式是工商业创造收入和利润的计划。这是公司的顾客服务计划的总结。它包括策略和实施。 目录 1定义2商业模式的概念3商业模式的类型4参见 4.1互联网行业的商业模式5参考资料 定义 人们在文献中使用商业模式这一名词的时候&#xff0c;往往模糊了两种不同的含义&#x…

什么是Linux?

Linux是什么 logo&#xff1a; Linux是一个操作系统。 操作系统&#xff1a; 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;本身就是一个软件。 常见操作系统&#xff1a;Windows、Linux、Mac OS、Android等 Office、QQ、迅雷、微信等则称为 应用程序…

什么是操作系统啊 | 战术后仰

操作系统 现代操作系统由一个或多个处理器、主存、打印机、键盘、鼠标、显示器、网络接口以及各种输入/输出设备构成。计算机操作系统是一个复杂的系统。 然而&#xff0c;程序员不会直接和这些硬件打交道&#xff0c;而且每位程序员不可能会掌握所有操作系统的细节&#xff0…

PhantomJS的用法

PhantomJS是一个基于WebKit的无界面浏览器&#xff0c;它可以用来模拟用户在浏览器中的操作&#xff0c;比如打开网页、点击按钮、填写表单等。它可以在命令行中使用&#xff0c;也可以在JavaScript中调用。 以下是PhantomJS的一些常用用法&#xff1a; 打开网页 使用命令行…

本地离线安装SeleniumIDE(Chrome)

一、插件下载 现需要准备一台可以连接外网的电脑&#xff0c;由于受到chrome的限制&#xff0c;我们可以选择搭梯子进行直接安装相应插件&#xff0c;但考虑到部分新手不会翻墙&#xff0c;本次提供一个不需翻墙的方法。 进入https://www.crx4chrome.com/crx/181591/网页内&…