Unity 에디터 확장은 프리팹을 생성하고, 해당 이름 스크립트를 자동으로 생성하고, 자동으로 마운트합니다.

해당 이름으로 스크립트를 자동으로 생성하고 자동으로 마운트하려면 프리팹을 생성하세요.

Bilibili 비디오 튜토리얼

Unity 에디터는 생성된 스크립트를 확장하고 해당 생성된 프리팹에 자동으로 마운트합니다.

지정된 폴더의 프리팹 변경 사항을 모니터링합니다.

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_NEWER
                string 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

추천

출처blog.csdn.net/qq_39162566/article/details/131422012