Unity 3d 通过脚本导入.png

Unity 3d Importing .png via script

我有问题。当我尝试通过脚本将纹理导入我的资产时,出现此错误:

Assertion failed: Assertion failed on expression: '!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) == 0)' UnityEditor.AssetDatabase:CreateAsset(Object, String) Editor.TextureImportWindow:OnGUI() (at Assets/Scripts/Editor/TextureImportWindow.cs:40) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

还有这个:

Could not create texture from Assets/Textures/importedTexture13.png: File could not be read UnityEditor.AssetDatabase:CreateAsset(Object, String) Editor.TextureImportWindow:OnGUI() (at Assets/Scripts/Editor/TextureImportWindow.cs:40) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

我的代码:

 public class TextureImportWindow : EditorWindow
 {
     [MenuItem("Window/Pixel Terrain/Import Texture")]
     public static void ShowWindow()
     {
         GetWindow<TextureImportWindow>("Import Texture");
     }

     private Texture2D _texture;
     private string _path;

     private void OnGUI()
     {
         if (GUILayout.Button("Select File"))
         {
             _path = EditorUtility.OpenFilePanel("Choose texture", "", "png");
             if (_path.Length != 0)
             {
                 var www = new WWW("file:///" + _path);
                 _texture = Texture2D.blackTexture;
                 www.LoadImageIntoTexture(_texture);
             }
         }

         if (_texture != null)
         {
             if (GUILayout.Button("Import"))
             {
                 if (!AssetDatabase.IsValidFolder("Assets/Textures"))
                 {
                     AssetDatabase.CreateFolder("Assets", "Textures");
                 }
                 AssetDatabase.CreateAsset(_texture, "Assets/Textures/importedTexture12.png");
                 AssetDatabase.SaveAssets();
                 AssetDatabase.Refresh();
             }
         }
     }
 }

首先,AssetDatabase.CreateAsset 支持的扩展名很少,png 不是其中之一。根据文档,这些是支持的格式:

  • .mat 材料
  • .cubemap 用于立方体贴图
  • .GUISkin 皮肤
  • .anim 用于动画
  • .asset 任意其他资产。)

PNG 未在任何地方提及,因此当您尝试使用该功能导入它时会出错。 AssetDatabase.ImportAsset 更适合这种情况,但由于它需要相对路径,因此无法使用,因为您使用的是 EditorUtility.OpenFilePanel.

提供的绝对路径

要从 EditorUtility.OpenFilePanel 将 png 文件导入您的项目,只需使用 File.CopyFileUtil.CopyFileOrDirectory(推荐)将其复制到目标位置,然后调用 AssetDatabase.Refresh().

替换:

AssetDatabase.CreateAsset(_texture, "Assets/Textures/importedTexture12.png");
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();

与:

FileUtil.CopyFileOrDirectory(_path, "Assets/Textures/importedTexture12.png");
AssetDatabase.Refresh();