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.Copy
或 FileUtil.CopyFileOrDirectory
(推荐)将其复制到目标位置,然后调用 AssetDatabase.Refresh()
.
替换:
AssetDatabase.CreateAsset(_texture, "Assets/Textures/importedTexture12.png");
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
与:
FileUtil.CopyFileOrDirectory(_path, "Assets/Textures/importedTexture12.png");
AssetDatabase.Refresh();
我有问题。当我尝试通过脚本将纹理导入我的资产时,出现此错误:
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.Copy
或 FileUtil.CopyFileOrDirectory
(推荐)将其复制到目标位置,然后调用 AssetDatabase.Refresh()
.
替换:
AssetDatabase.CreateAsset(_texture, "Assets/Textures/importedTexture12.png");
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
与:
FileUtil.CopyFileOrDirectory(_path, "Assets/Textures/importedTexture12.png");
AssetDatabase.Refresh();